一、自定义拦截器
1.跟过滤器比较像的技术
2.发送请求时被拦截器拦截,在控制器的前后添加额外功能
2.1跟AOP区分开,AOP在特定方法前后扩充(对ServiceImpl)
2.2拦截器,请求的拦截,针对点是控制器方法(对Controller)
3.SpringMVC拦截器和Filter的区别
3.1拦截器只能拦截器Controller
3.2Filter可以拦截任何请求
4.实现自定义拦截器的步骤:
4.1新建类实现HandlerInterceptor
public class DemoInterceptor implements HandlerInterceptor {
//在进入控制器之前执行
//如果返回值为false,阻止进入控制器
//控制代码
@Overridepublic 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.getMessage());
}
}
4.2在springmvc.xml配置拦截器需要拦截哪些控制器
4.2.1拦截所有控制器
<mvc:interceptors>
<bean class="edu.swpu.interceptor.DemoInterceptor"></bean>
</mvc:interceptors>
4.2.2拦截特定的url
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo"/>
<mvc:mapping path="/demo1"/>
<mvc:mapping path="/demo2"/>
<bean class="edu.swpu.interceptor.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
二、拦截器栈
1.多个拦截器同时生效时,组成了拦截器栈
2.顺序:先进后出
3.执行顺序和在springmvc.xml中配置顺序有关
4.设置先配置拦截器A在配置拦截器B执行顺序为
preHandle(A) --> preHandle(B) --> 控制器方法 --> postHandle(B)
–> postHanle(A) --> JSP --> afterCompletion(B) --> afterCompletion(A)
三、SpringMVC运行原理
1.文字解释
如果在web.xml中设置DispatcherServlet的<url-pattern>
为/时,当用户发起请求,请求一个控制器,首先会执行DispatcherServlet。由DispatcherServlet调用HandlerMapping的DefaultAnnotationHandlerMapping解析URL,解析后调用HandlerAdatper组件的AnnotationMethodHandlerAdapter调用Controller中的HandlerMethod。当HandlerMethod执行完成后会返回View,会被ViewResovler进行视图解析,解析后调用jsp对应的.class文件并运行,最终把运行.class 文件的结果响应给客户端。以上就是springmvc运行原理(给面试官说的)
四、SpringMVC对Date类型转换
1.在springmvc.xml中配置,代码中不需要做任何修改
1.1必须额外导入joda-time.jar
1.2时间类型java.sql.Date
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="registerDefaultFormatters" value="false" />
<property name="formatters">
<set>
<bean class="org.springframework.format.number.NumberFormatAnnotationFormatterFactory" />
</set>
</property>
<property name="formatterRegistrars">
<set>
<bean class="org.springframework.format.datetime.joda.JodaTimeFormatterRegistrar">
<property name="dateFormatter">
<bean class="org.springframework.format.datetime.joda.DateTimeFormatterFactoryBean">
<property name="pattern" value="yyyy-MM-dd" />
</bean>
</property>
</bean>
</set>
</property>
</bean>
2.使用注解,在需要转换的参数或实体类属性上添加@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在实体类中
@RequestMapping("demo")
public String demo( Demo1 demo){
System.out.println(demo);
return "abc.jsp";
}
public class Demo1 {
@DateTimeFormat(pattern="yyyy/MM/dd")
private Date time;
}
2.3注意地方:
2.3.1不需要导入额外jar
2.3.2Date是java.util.Date
来源:https://blog.csdn.net/MarcoAsensio/article/details/100824927