当前位置: 首页 > news >正文

SpringMVC基础知识

一、springMVC概述

springMVC是spring下的一个模块,是基于MVC设计模式的web框架。

二、springMVC的核心流程

请求发给前端控制器(dispatcher),由前端控制器依据处理器映射器(handlerMapping)查找对应的处理器处理请求,返回handlerExecutionChain(包含handler和handlerInterceptor)给前端控制器,前端控制器会再调用处理器适配器(handlerAdapter)来调用对应的处理器(handler),处理器返回模型数据(ModelAndView)给前端控制器,前端控制器依据逻辑视图名调用视图解析器(ViewResolver),返回物理视图,进行视图渲染(就是把ModelAndView里的数据保存到request域中),完成响应。

三、前端控制器的配置

在web.xml里仿照servlet来配置

<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>xxx</servlet-class>
<!--这里是配置用前端控制器来加载springMVC的配置文件-->
<init-param>
<param-name>contextConfigLocation<param-name>
<param-value>classpath:config/springmvc.xml</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--这里的URL映射有两种方式
*.action:匹配后缀
/:匹配所有,但此时要防止静态资源的被访问,这种方式支持RESTFUL风格
-->
<url-mapping>/<url-mapping>
</servlet-mapping>
复制代码

四、处理器映射器和处理器适配器配置

1、非注解的处理器适配器和处理品映射器

1.1、处理器适配器 *SimpleControllerHandlerAdapter:这个处理器适配器要求处理器要实现Controller接口,并且这个Controller接口里的方法返回ModelAndView对象

public ModelAndView handleRequest(HttpServletRequest,HttpServletResponse){
    return new ModelAndView();
}
复制代码

*HttpRequestHandlerAdapter:它要求处理器实现HttpRequest接口

public void handlRequest(HttpServletRequest,HttpServletResponse){
    
}
复制代码

因为返回值为void类型所以它可以影响返回的数据类型和响应头 1.2、处理器映射器 *BeanNameUrlHandlerMapping:依据处理器配置的name属性的URL来映射 *SimpleUrlHandlerMapping

<bean class="xxx">
<property name="mappings">
<props>
<prop key="/items">controller的id</prop>
</props>
</property>
</bean>
复制代码

因此这个处理器映射器可以对同一个处理器进行多个虚拟路径的映射

2、注解的处理器适配器和处理器映射器

引入:如果我们没有在springMVC的配置文件里配置视图解析器以及处理器映射器和适配器时发现springMVC也能同样运行,其实如果我们不配置,那么前端控制器会到dispatcher.properties的文件里去加载默认配置的适配器、映射器以及解析器

3.1之前的处理器映射器
DefaultAnotationHandlerMapping
3.1之后的处理器映射器
RequestMappingHandlerMapping

3.1之前的处理器适配器
AnnotationMthodHandlerAdapter
3.1之后的处理器适配器
RequestMappingHandlerAdapter
复制代码

因此我们要配置springMVC的配置文件,不然前端控制器就要加载过时的处理器适配器和处理器映射器

配置注解的处理器映射以和处理器适配器

<mvc:annotaion-driven/>
*在编写的处理器上用@Controller来表示这是一个处理器
*在处理器中方法上添加@RequestMapping("/items")来映射这个方法的URL
复制代码

这样的快捷方式,默认绑定了很多的参数绑定器,比如json的装换器

3、视图解析器的配置

<bean id="viewResolver" class="xxxInternalResourceViewResolver">
<property prefix="/WEB-INF/jsps/"/>
<property suffix="*.jsp"/>
</bean>
复制代码

五、springMVC与mybatis的整合

1、为什么要整合

通过spring来整合表现层、业务层、持久层、是让spring来管理表现层的controller、业务层的service、持久层的mapper,从而让各层互相调用

2、springmvc整合mybatis的配置文件

1、整合DAO

<!--加载数据库配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="xxxComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置sqlSessionFactory-->
<bean id="sqlSessionFactory" class="xxxxSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--加载mybatis的全局配置文件-->
<property name="configLocation" value="classpath:config/mybatis/sqlMapCofig.xml"/>
</bean>
<!--配置mapper-->
<bean class="MapperScannerConfigurer">
<property name="basePackage" value="com.nmid.ssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
复制代码

2、整合service

<bean id="customService" class="xxxxcustomServiceImp"/>
复制代码

3、配置事务控制的配置文件

*配置事务管理器

*配置事务通知

*配置AOP

具体的配置请看我的spring精华知识中的spring事务配置那章

注意:对于把上面配置的所有配置文件包括加载进spring容器中的方法就是配置一个监听ServletContext的监听器

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conifg/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>xxxContextLoaderListener</listener-class>
</listener>
复制代码

六、controller的返回值类型和@RequestMapping的作用

ModelAndView:返回模型数据对象,需要分别设置视图和数据

String:返回逻辑视图名和重定向以及转发

void:实现影响应头等

@RequestMapping可以加载类上来实现窄化请求,同时也可以限定访问的方法

七、springMVC的参数绑定

1、简单参数绑定

只要求页面的参数名字和形参的名字一样即可,否则可以使用@RequestMapping("")来指定

2、pojo类型的参数绑定

要求页面的参数名字与pojo对象里的属性名字一样即可绑定

3、自定义参数绑定

比如日期的参数绑定就要我们自己实现自定义的参数绑定

*在处理器是配置器上加上转换器

<mvc:annotaion-driven conversion-service="conversionService"/>
复制代码

*在springMVC配置文件里配置转换器

<bean id="conversionService" class="xxxFormattingConversionServiceFactoryBean">
<property name="convertes">
<list>
<bean class=""/>
</list>
</property>
</bean>
复制代码

八、springMVC与structs的区别

springMVC是基于方法开发而Struts是基于类开发,简单来说就是springMVC是基于URL和controller方法来映射,如果映射成功就会生成一个controller对象,而这个对象里只有映射成功的那个方法,传来的页面参数都会被映射为形参,而方法执行后形参就销毁,所以springMVC可以单例开发。

而Struts是基于类开发,通过成员变量接受参数,单例不安全,因此它是多例的。

九、springMVC的复杂参数绑定

1、对于包装类型的pojo

页面要属性.属性的方式传递包装pojo里pojo对应的属性值。

2、数组类型

页面参数的名字和数组的名字相同即可

3、list和map集合类型

对于list类型,要求要明确是对list里的那个po对象的那个属性赋值;而对于map类型就按map['key']的方式传递

十、springMVC的数据校验和数据回显

1、数据校验

引入:通常对于web开发而言,数据校验,前端页面要进行数据校验,服务器端也要进行数据校验,而服务器端的数据校验通常在表现层对传递而来的数据进行校验和在service层对业务接口使用到的数据进行校验。

springMVC使用的是hibernateValidator的数据校验器的接口。

如何配置

<!--配置数据校验器-->
<bean id="validator" class="xxxLocalValidatorFactoryBean">
<property name="providerClass" class="xxxHibernateValidator"/>
<property name="messageSource" ref="messageSource"/>
</bean>
<!--配置错误信息的配置文件-->
<bean id="messageSource" class="xxxReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:xxx</value>
</list>
</property>
<property name="fileEncodings" value="utf-8">
</property>
<property name="cacheSeconds" value="120"/>
</bean>
<!--在数据处理器的适配器上添加这个校验器-->
<mvc:annotation-driven validator="validator"/>
复制代码

2、数据回显

对于pojo类型的数据,springMVC自动把页面pojo以类名首字母小写作为key保存到了request域中,而如果要指定保存到request域中的key,可以使用@ModelAttribute("xx")来指定。同时@ModelAttribute("xx")放到方法上可以把方法返回值保存到request域中

而对于简单的数据类型,则只能使用Model来实现回显

十一、springMVC的全局异常处理器

springmvc里的异常处理器是:在表现层、业务层、持久层遇到预期异常都要抛出异常,最后由前端控制器交给全局的异常处理器处理。

全局异常处理器的处理思路:

如果全局异常处理器捕捉到的异常是预期异常那么就在页面回显异常信息,如果不是预期异常那么就要另做处理。

全局异常类只需要实现handlerExceptionResolver即可就可以了,然后实现其方法。

十二、springMVC对于图片的上传

一定要做springMVC的配置文件里配置多组件的解析器

<bean id="" class="xxxCommonsMutipartResolver">
<property name="maxUploadSize">
<value>xxx</value>
</proeprty>
</bean>
复制代码

其次是在形参上写MutipartFile mutipartfile的形参

图片上传代码的注意事项:

*图片是否为空

*解决图片的绝对路径和生成新的图片名

*设置图片保存的路径要以多目录形式同时要配置虚拟路径

*保存图片路径到数据库

十三、springMVC与json数据交互

*前端请求的是json数据格式的请求,后端要使用@RequestBody来吧json数据格式来转换成java对象,而后处理后要使用@ResponseBody把Java对象转为json数据返回

*前端请求的是key/value的数据格式,后端直接使用@ResponseBody把Java对象转换为json数据格式返回

一定要配置json数据转换的转换器

而如果是使用的注解便捷配置那么就不用配置json转换的转换器了,它自动配置好了

十四、springMVC与RESUTFUL风格

*要把前端控制器的url-mapping设置为“/”,但这时候要防止对静态资源的访问,所以还要配置对静态资源的访问

<mvc:resources location="/js/" mapping="/js/**"/>
复制代码

十五、拦截器

拦截器要实现HandlerIntercptor接口,里面的三个方法分别对应handler方法之前、进入handler方法中后modelAndView返回之前和模型数据返回后的这三个时间段进行调用的。

配置拦截器

springmvc把拦截器配置在了处理器映射器上,映射成功的处理器使用拦截器。

但springMVC也支持全局拦截器的配置,即自动为每个处理器器映射器配置了拦截器

<!--配置全局拦截器,多个拦截器时按顺序执行-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class=""/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class=""/>
</mvc:interceptor>
</mvc:interceptors>
复制代码

转载于:https://juejin.im/post/5bdeed08e51d4573506a1d72

相关文章:

  • MPAndroidChart 教程:Y轴 YAxis
  • 大快搜索数据爬虫技术实例安装教学篇
  • js递归,无限分级树形折叠菜单
  • Linux环境搭建及命令
  • 区块链教程Fabric1.0源代码分析Peer peer chaincode命令及子命令实现
  • 我的前端工具集(九)树工具重新封装和修改
  • Spring Cloud 2.x系列之网关zuul入门(三)
  • Can't create/write to file '/tmp/MLjnvU95' (Errcode: 13 - Permission denied)
  • 互融云保理业务系统助力企业快速拓展业务
  • 如何利用MongoDB打造TOP榜小程序
  • 4.时间复杂度和空间复杂度-2
  • 你真的懂Redis事务吗?
  • MySQL-去重留一
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • Presentational and Container Components
  • 网络传输文件的问题
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • CSS盒模型深入
  • Git学习与使用心得(1)—— 初始化
  • JavaScript HTML DOM
  • JavaScript学习总结——原型
  • Linux gpio口使用方法
  • Linux各目录及每个目录的详细介绍
  • php ci框架整合银盛支付
  • React as a UI Runtime(五、列表)
  • Shadow DOM 内部构造及如何构建独立组件
  • vue 个人积累(使用工具,组件)
  • vue-cli3搭建项目
  • vue-router 实现分析
  • windows-nginx-https-本地配置
  • 初探 Vue 生命周期和钩子函数
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 将回调地狱按在地上摩擦的Promise
  • 解析带emoji和链接的聊天系统消息
  • 前端知识点整理(待续)
  • 入门到放弃node系列之Hello Word篇
  • 使用common-codec进行md5加密
  • 怎么将电脑中的声音录制成WAV格式
  • 自动记录MySQL慢查询快照脚本
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​业务双活的数据切换思路设计(下)
  • # .NET Framework中使用命名管道进行进程间通信
  • #{} 和 ${}区别
  • #git 撤消对文件的更改
  • (zt)最盛行的警世狂言(爆笑)
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)elasticsearch 源码之启动流程分析
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (算法)求1到1亿间的质数或素数
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net 4.0发布后不能正常显示图片问题