springmvc安排:
springmvc-1: 基础知识
springmvc框架(重点)
mvc在b/s系统中应用方式
springmvc框架原理(DispatcherServlet前端控制器、处理器映射器、处理器适配器、视图解析器)
springmvc入门程序
需求:商品列表查询
常用的处理器映射器,处理器适配器
注解的处理器映射器,处理器适配器用于注解开发(重点)
注解开发基础
常用的注解使用
参数绑定
自定义参数绑定
springmvc和struts的区别
springmvc-2: 高级知识
使用springmvc上传图片
集合参数的绑定
validation校验器
异常处理器使用(用于系统异常处理)
RESTful支持
拦截器
- 一、springmvc框架
- 1.1springmvc是什么?
springmvc是spring的一个模块,提供web层解决方案(基于mvc设计架构)
mvc是一个设计模式,在b/s系统的应用:
- 1.2mvc在b/s系统的应用
- 1.3springmvc的框架
第一步:用户发起request请求,请求至DispatcherServlet前端控制器
第二步:DispatcherServlet前端控制器请求HandlerMapping处理器映射器查找Handler
DispatcherServlet:前端控制器,相当于中央调度器,各各组件都和前端控制器进行交互,降低了各各组 件之间耦合度。
第三步:HandlerMapping处理器映射器,根据url及一些配置规则(xml配置、注解配置)查找Handler,将Handler返回给DispatcherServlet前端控制器
第四步:DispatcherServlet前端控制器调用适配器执行Handler,有了适配器通过适配器去扩展对不同Handler执行方式(比如:原始servlet开发,注解开发)
第五步:适配器执行Handler
Handler是后端控制器,当成模型。
第六步:Handler执行完成返回ModelAndView
ModelAndView:springmvc的一个对象,对Model和view进行封装。
第七步:适配器将ModelAndView返回给DispatcherServlet
第八步:DispatcherServlet调用视图解析器进行视图解析,解析后生成view
视图解析器根据逻辑视图名解析出真正的视图。
View:springmvc视图封装对象,提供了很多view,jsp、freemarker、pdf、excel。。。
第九步:ViewResolver视图解析器给前端控制器返回view
第十步:DispatcherServlet调用view的渲染视图的方法,将模型数据填充到request域 。
第十一步:DispatcherServlet向用户响应结果(jsp页面、json数据。。。。)
DispatcherServlet:前端控制器,由springmvc提供
HandlerMappting:处理器映射器,由springmvc提供
HandlerAdapter:处理器适配器,由springmvc提供
Handler:处理器,需要程序员开发
ViewResolver:视图解析器,由springmvc提供
View:真正视图页面需要由程序编写
- 二、入门程序
- 2.1需求
实现商品列表查询
- 2.2需要的jar包
使用spring3.2.0(带springwebmvc模块)
- 2.3前端控制器
在web.xml中配置:
- 2.4springmvc.xml
在springmvc.xml中配置springmvc架构三大组件(处理器映射器、适配器、视图解析器)
- 2.5工程结构
- 2.6处理器映射器
在springmvc.xml中配置:
BeanNameUrlHandlerMapping: 根据请求url(XXXX.action)匹配spring容器bean的 name
找到对应的bean(程序编写的Handler)
<!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
所有处理器映射器都实现HandlerMapping接口。
- 2.7处理器适配器
在springmvc.xml配置:
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
所有的适配器都是实现了HandlerAdapter接口。
程序编写Handler根据适配器的要求编写。
SimpleControllerHandlerAdapter适配器要求:
通过supports方法知道Handler必须要实现哪个接口:
- 2.8Handler编写
需要实现Controller接口:
- 2.9配置Handler
在springmvc.xml配置Handler由spring管理Handler。
- 2.10配置视图解析器
配置视图解析,能够解析jsp视图:
- 2.11工程部署
访问:http://localhost:8080/springfrist1110/itemList.action
- 2.12异常
- 2.12.1HandlerMapping没有找到Handler
HandlerMapping没有找到Handler,404后边不显示jsp路径
- 2.12.2jsp页面地址错误
- 三、其它非注解处理器映射器和适配器
- 3.1BeanNameUrlHandlerMapping(映射器)
根据请求url(XXXX.action)匹配spring容器bean的 name
找到对应的bean(程序编写的Handler)
- 3.2SimpleUrlHandlerMapping(映射器)
注意:在springmvc.xml配置了多个处理器映射器,多个处理器映射器可以共存。
- 3.3SimpleControllerHandlerAdapter(适配器)
要求程序编写的Handler(Controller)需要实现 Controller接口。
- 3.4HttpRequestHandlerAdapter(适配器)
在springmvc.xml配置:HttpRequestHandlerAdapter
要求Handler 实现 HttpRequestHandler接口
- 3.4.1开发Handler
- 3.4.2配置Handler
使用简单url映射器:
- 四、DispatcherServlet.properoties
DispatcherServlet前端控制器加载 DispatcherServlet.properoties 配置文件,从而默认加载各各组件,
如果在springmvc.xml中配置了处理器映射器和适配器,以sprintmvc.xml中配置的为准
- 五、注解映射器和适配器
- 5.1注解映射器
spring3.1之前默认加载映射器是
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,3.1之后要使用:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
在springmvc.xml中配置RequestMappingHandlerMapping:
使用RequestMappingHandlerMapping需要在Handler 中使用@controller标识此类是一个控制器,使用@requestMapping指定Handler方法所对应的url。
- 5.2注解适配器
spring3.1之前默认加载映射器是
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,3.1之后要使用:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
RequestMappingHandlerAdapter,不要求Handler实现任何接口,它需要和RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。
- 5.3注解开发Hanlder
- 5.4配置Handler
建议使用组件扫描,组件扫描可以扫描@Controller、@Service、@component、@Repsitory
- 六、小结
DispatcherServlet:前端控制器,相当于中央调度器,可以降低组件之间的耦合度。
HandlerMapping:处理器映射器,负责根据url查找Handler
HandlerAdapter:处理器适配器,负责根据适配器要求的规则去执行处理器。可以通过扩展适配器支持不同类型的Handler。
viewResolver:视图解析器,根据逻辑视图名解析成真正的视图,
真正视图地址==前缀+逻辑视图名+后缀
1、DispatcherServlet通过HandlerMapping查找Handler
2、DispatcherServlet通过适配器去执行Handler,得到ModelAndview
3、视图解析
视图解析完成得到一个view:
4、进行视图渲染
将Model中的数据 填充到request域。
- 七、springmvc和mybatis整合工程搭建
- 七、整合思路
在mybatis和spring整合的基础上 添加springmvc。
spring要管理springmvc编写的Handler(controller)、mybatis的SqlSessionFactory、mapper
第一步:整合dao,spring和mybatis整合
第二步:整合service,spring管理service接口,service中可以调用spring容器中dao(mapper)
第三步:整合controller,spring管理controller接口,在controller调用service
- 7.2jar包
mybatis:3.2.7
spring:3.2.0
mybatis的jar
mybatis和spring整合包
spring的所有jar包(包括 springmvc的包)
数据库驱动包
log4j日志..
- 7.3工程结构
- 7.3.1配置文件
applicationContext-dao.xml---配置数据源、SqlSessionFactory、mapper扫描器
applicationContext-service.xml---配置service接口
applicationContext-transaction.xml--事务管理
sprintmvc.xml---springmvc的配置,配置处理器映射器、适配器、视图解析器
SqlMapConfig.xml---mybatis的配置文件,配置别名、settings、mapper
- 7.3.2applicationContext-dao.xml
配置mybatis的数据源、sqlSessionFactory、mapper扫描器
- 7.3.3applicationContext-transation.xml
在此配置文件配置事务,声明式事务控制。
- 7.4前端控制器配置
- 7.5配置springmvc.xml
- 7.5.1工程结构
- 7.6商品列表开发
- 7.6.1需求
查询商品列表
- 7.6.2mapper
功能描述:根据条件查询商品信息,返回商品列表
一般情况下针对查询mapper需要自定义mapper。
首先针对单表进行逆向工程,生成代码。
- 7.6.2.1mapper.xml
- 7.6.2.2包装类:
- 7.6.2.3mapper.java
- 7.6.3service
- 7.6.4在applicationContext-service.xml中配置service
- 7.6.5controller
- 7.6.6jsp
- 7.6.7在web.xml配置spring监听器
- 八、注解开发基础
- 8.1商品修改
- 8.1.1需求
功能描述:商品信息修改
操作流程:
1、在商品列表页面点击修改连接
2、打开商品修改页面,显示了当前商品的信息
根据商品id查询商品信息
3、修改商品信息,点击提交。
更新商品信息
- 8.1.2mapper
使用逆向工程生成代码:
根据商品id查询商品信息
更新商品信息
- 8.1.3service
- 8.2@RequestMapping
- 8.2.1设置方法对应的url(完成url映射)
一个方法对应一个url
- 8.2.2窄化请求映射
在class上定义根路径
好处:更新规范系统 的url,避免 url冲突。
- 8.2.3限制http请求的方法
通过requestMapping限制url请求的http方法,
如果限制请求必须是post,如果get请求就抛出异常:
商品修改方法,限制为http的get:
- 8.3controller方法返回值
- 8.3.1返回ModelAndView
- 8.3.2返回字符串
如果controller方法返回jsp页面,可以简单将方法返回值类型定义 为字符串,最终返回逻辑视图名。
- 8.3.3返回void
使用此方法,容易输出json、xml格式的数据:
通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
- 8.3.4redirect重定向
如果方法重定向到另一个urk,方法返回值为“redirect:url路径”
使用redirect进行重定向,request数据无法共享,url地址栏会发生变化的。
- 8.3.5forward转发
使用forward进行请求转发,request数据可以共享,url地址栏不会。
方法返回值为“forward:url路径”
- 8.4参数绑定
- 8.4.1参数绑定过程
- 默认支持的参数类型
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。
- 8.4.2HttpServletRequest
通过request对象获取请求信息
- 8.4.3HttpServletResponse
通过response处理响应信息
- 8.4.4HttpSession
通过session对象得到session中存放的对象
- 8.4.5Model
通过model向页面传递数据,如下:
//调用service查询商品信息
Items item = itemService.findItemById(id);
model.addAttribute("item", item);
页面通过${item.XXXX}获取item对象的属性值。
8.4.6@RequestParam
如果request请求的参数名和controller方法的形参数名称一致,适配器自动进行参数绑定。如果不一致可以通过
@RequestParam 指定request请求的参数名绑定到哪个方法形参上。
对于必须要传的参数,通过@RequestParam中属性required设置为true,如果不传此参数则报错。
对于有些参数如果不传入,还需要设置默认值,使用@RequestParam中属性defaultvalue设置默认值。
- 8.4.7可以绑定简单类型
可以绑定整型、 字符串、单精/双精度、日期、布尔型。
- 8.4.8可以绑定简单pojo类型
简单pojo类型只包括简单类型的属性。
绑定过程:
request请求的参数名称和pojo的属性名一致,就可以绑定成功。
问题:
如果controller方法形参中有多个pojo且pojo中有重复的属性,使用简单pojo绑定无法有针对性的绑定,
比如:方法形参有items和User,pojo同时存在name属性,从http请求过程的name无法有针对性的绑定到items或user。
- 8.4.9可以绑定包装的pojo
包装的pojo里边包括了pojo。
页面参数定义:
包装类型的属性也是itemsCustom:
按照上边的规则进行包装类型的绑定。
- 8.4.10自定义绑定使用属性编辑器
springmvc没有提供默认的对日期类型的绑定,需要自定义日期类型的绑定。
- 8.4.10.1使用WebDataBinder(了解)
在controller类中定义:
使用这种方法问题是无法在多个controller共用。
- 8.4.10.2使用WebBindingInitializer(了解)
使用WebBindingInitializer让多个controller共用 属性编辑器。
自定义WebBindingInitializer,注入到处理器适配器中。
如果想多个controller需要共同注册相同的属性编辑器,可以实现PropertyEditorRegistrar接口,并注入webBindingInitializer中。
如下:
编写CustomPropertyEditor:
配置如下:
<!-- 注册属性编辑器 -->
<bean id="customPropertyEditor" class="cn.itcast.ssm.propertyeditor.CustomPropertyEditor"></bean>
<!-- 自定义webBinder -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="propertyEditorRegistrars">
<list>
<ref bean="customPropertyEditor"/>
</list>
</property>
</bean>
<!--注解适配器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder"></property>
</bean>
- 8.4.11自定义参数绑定使用转换器(架构师掌握)
- 8.4.11.1实现Converter接口:
定义日期类型转换器和字符串去除前后空格转换器。
- 8.4.11.2配置转换器
配置方式1针对不使用<mvc:annotation-driven>
配置方式2针对使用<mvc:annotation-driven>的配置
- 8.5问题处理
- 8.5.1post乱码
在web.xml中加入:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以上可以解决post请求乱码问题。
对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
另外一种方法对参数进行重新编码:
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码