springMVC小记
SpringMVC 中重要组件
- DispatcherServlet: 前端控制器,接收所有请求(如果配置/不包
含 jsp) - HandlerMapping: 解析请求格式的.判断希望要执行哪个具体
的方法. - HandlerAdapter: 负责调用具体的方法.
- ViewResovler:视图解析器.解析结果,准备跳转到具体的物理视
图
spring容器和springMVC容器的关系
- Spring 容器和 SpringMVC 容器是父子容器.
- SpringMVC 容器中能够调用 Spring 容器的所有内容.
跳转方式
- 默认跳转方式请求转发.
- 设置返回值字符串内容
2.1 添加 redirect:资源路径 重定向
2.2 添加 forward:资源路径 或省略 forward: 转发
传参
- 默认保证参数名称和请求中传递的参数名相同
@RequestMapping("demo") public String demo(String name,int age){
- 如果请求参数名和方法参数名不对应使用@RequestParam()赋
值
public String demo(@RequestParam(value="name1") String name,@RequestParam(value="age1")int age){
- 如果方法参数是基本数据类型(不是封装类)可以通过
@RequestParam 设置默认值.
@RequestMapping("page") public String page(@RequestParam(defaultValue="2") int pageSize,@RequestParam(defaultValue="1") int pageNumber){
- 如果强制要求必须有某个参数
@RequestMapping("demo2") public String demo2(@RequestParam(required=true) String name){
- rest风格,获取url中的参数
@RequestMapping(value="/user/{id}",method=RequestMethod.GET)//修改
public String edit(@PathVariable(value="id") Integer id,Model model)
自定义拦截器
- 跟过滤器比较像的技术.
- 发送请求时被拦截器拦截,在控制器的前后添加额外功能.
2.1 跟 AOP 区分开.AOP 在特定方法前后扩充(对 ServiceImpl)
2.2 拦截器,请求的拦截.针对点是控制器方法.(对 Controller) - SpringMVC 拦截器和 Filter 的区别
3.1 拦截器只能拦截器 Controller
3.2 Filter 可以拦截任何请求. - 实现自定义拦截器的步骤:
4.1 新建类实现 HandlerInterceptor
demo
public class DemoInterceptor implements HandlerInterceptor {
// 在进入控制器之前执行
// 如果返回值为 false,阻止进入控制器
// 控制代码 @Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("arg2:"+arg2); System.out.println("preHandle"); return true; }
// 控制器执行完成,进入到 jsp 之前执行.
// 日志记录.
// 敏感词语过滤
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
System.out.println("往"+arg3.getViewName()+"跳转");
System.out.println("model 的值 "+arg3.getModel().get("model")); String word = arg3.getModel().get("model").toString();
String newWord = word.replace("祖国", "**"); arg3.getModel().put("model", newWord);
// arg3.getModel().put("model", "修改后的内容");
System.out.println("postHandle"); }
//jsp 执行完成后执行
//记录执行过程中出现的异常.
//可以把异常记录到日志中
@Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {
System.out.println("afterCompletion"+arg3.getMessag e()); } }
在 springmvc.xml 配置拦截器需要拦截哪些控制器
- 拦截所有控制器
<mvc:interceptors> <bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
</mvc:interceptors>
- 拦截特定的的 url
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo"/>
<mvc:mapping path="/demo1"/>
<mvc:mapping path="/demo2"/>
<bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器栈
- 多个拦截器同时生效时,组成了拦截器栈
- 顺序:先进后出.
- 执行顺序和在 springmvc.xml 中配置顺序有关
- 设置先配置拦截器 A 在配置拦截器 B 执行顺序为
preHandle(A)–> preHandle(B)–> 控制器方法 -->postHandle(B)
–>postHanle(A)–>JSP–>afterCompletion(B)–>afterCompletion(A)
SpringMVC 运行原理
如果在 web.xml 中设置 DispatcherServlet 的为/时,当用户
发 起 请 求 , 请 求 一 个 控 制 器 , 首 先 会 执 行 DispatcherServlet. 由DispatcherServlet 调 用 HandlerMapping 的DefaultAnnotationHandlerMapping 解 析 URL, 解 析 后 调 用HandlerAdatper 组 件 的 AnnotationMethodHandlerAdapter 调 用Controller 中的 HandlerMethod.当 HandlerMethod 执行完成后会返回View,会被 ViewResovler 进行视图解析,解析后调用 jsp 对应的.class 文件并运行,最终把运行.class 文件的结果响应给客户端.
SpringMVC 对 Date 类型转换
- 在 springmvc.xml 中配置,代码中不需要做任何修改
1.1 必须额外导入 joda-time.jar
1.2 时间类型 java.sql.Date
<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotati on-driven>
<bean id="conversionService"
class="org.springframework.format.support.Formattin gConversionServiceFactoryBean">
<property name="registerDefaultFormatters" value="false" />
<property name="formatters">
<set>
<bean
class="org.springframework.format.number.NumberForm atAnnotationFormatterFactory" />
</set>
</property>
<property name="formatterRegistrars">
<set>
<bean
class="org.springframework.format.datetime.joda.Jod aTimeFormatterRegistrar">
<property name="dateFormatter"> <bean
class="org.springframework.format.datetime.joda.Dat eTimeFormatterFactoryBean">
<property name="pattern" value="yyyy-MM-dd" />
</bean>
</property>
</bean>
</set>
</property>
</bean>
- 使 用 注 解 . 在 需 要 转 换 的 参 数 或 实 体 类 属 性 上 添 加@DateTimeFormatter(pattern=”表达式”)
2.1 使用 Date 参数接收
@RequestMapping("demo")
public String demo(@DateTimeFormat(pattern="yyyy-MM-dd") Date time){
System.out.println(time); return "abc.jsp";
}
2.2 在实体类中
public class Demo1 { @DateTimeFormat(pattern="yyyy/MM/dd") private Date time;