SpringMVC学习笔记
1、严格实现MVC设计思想的框架,严格分层,减少耦合;
2、组件(红色必需)
2.1 DispatcherServlet 前端控制器
2.2 Controller 业务控制器
2.3 Handler Mapping 请求匹配器:请求转发到具体Controller
2.4 ViewResolver:控制Controller返回响应后要跳转到不同视图展示的组件
View:针对不同的视图技术(jsp、pdf、excel...)采取不同的处理的组件
每一个ViewResolver必须指定一个View
2.5 Interceptors:拦截器,面向切面技术
2.6 LocalResolver:本地化处理组件
2.7 Validate:校验组件
3、Controller实现方式(原先3之前配置方式 已经淘汰 推荐使用注解)
3.1 实现Controller接口或者继承AbstractController抽象类(传入request和response对象)
3.2 ModelAndView
3.2 用于直接跳转页面的ParameterizableViewController、UrlFilenameViewController(url名和视图名一致)
3.3 自动封装表单参数的控制器(常用):CommandController重写handle方法,参数通过属性编辑器将form参数注入实体类,有些类型如日期需要提供重写的属性编辑器才能正确转换;FormController重写onsubmit方法;
spring3之后不推荐使用 使用注解;
3.4 MultiActionController 红色参数必需
方法:public (ModelAndView|Map|String|void) actionname(HttpServletRequest request,HttpServletResponse response,HttpSession session,Object anyobj);
注意:controller中方法的的参数是按需声明,spring会帮我们自动注入,像HttpServletRequest、HttpServletResponse、HttpSession、ModelView等常见的很容易就可以注入,如果声明的是页面的参数,spring也会安例注入,但是存在数据类型转换异常的风险;
比如:一般页面的参数传到服务器端都是字符串,如果声明的是整形、浮点型、日期类型,必然要进行数据类型强转,所以也必然存在产生转换异常的风险,需要添加属性编辑器来降低这种转换风险。
4、handlerMapping
4.1 默认的ControllerClassNameHandlerMapping
4.2 常用的SimpleUrlhandlerMapping
4.3 BeanNameUrlHandlerMapping
4.4 基于注解Controller时使用的DefaultAnnotationHandlerMapping 推荐使用
5、基于注解的SpringMVC配置
5.1 使用注解 那么spring-mvc.xml需要增加context和mvc两个命名空间
5.2 注解先配置扫描,然后添加配置跳转处理InternalResourceViewResolver,然后再添加注解;
5.3 restful风格请求:先定义URl请求模板,然后通过@Pathvariable指定处理方法接收url中传递过来的参数的变量;
对于特殊格式的参数也需要属性编辑器转换;数据绑定:可以直接使用实体对象作为入参,存在数据格式转换异常的可能;
5.4 可以通过@method来处理get post等不同请求方式的请求
其他注解:@CookieValue @RequestHeader
5.5 如果返回值为void 同时方法中不使用pringwriter 那么会自动匹配requestmapping中配置的同名视图
6、转发和重定向
return "forward:index.jsp"; //转发
return "forward:user.do?method=reg5"; //转发
return "redirect:user.do?method=reg5"; //重定向
return "redirect:http://www.baidu.com"; //重定向
7、XmlViewResovler:
View:JstlView、ExcelView以及自定义View(jsperReport|Pdf|Excel)
视图链
8、拦截器链(一般所有的MVC都会实现拦截器):
实现HandlerInterceptor接口,重写三个方法:prehandler:controller之前执行,posthandler:controller之后视图生成之前,
afterCompletion释放资源
9、视图国际化:
9.1 页面引入spring标签:<% taglib uri="http://www.springframework.org/tags" prefix="spring" %>,使用标签:<spring:message code="xxxkey" /> code对应资源文件(*.properties)的Key值;
9.2 创建并编写资源文件:mess.properties,mess_zh_CN.properties,mess_en_US.properties
9.3 配置支持:<bean:id="messageSource" class="org.springframework.context.support.ResourceBunldleMessageSource">
<property name="basename" value="mess"/>
</bean>
注意id只能叫这个messageSource。
10、注入验证:JSR303 validate bean
@Valid:验证: 对于实体对象jdk提供验证接口 一般其他框架像hibernate提供验证实现
补充:SpringMVC中的 Controller是单例的 如何变成多例的呢?在Controller上加注解@Scope("prototype")