SpringMVC学习笔记三

允我心安 提交于 2019-11-29 14:45:48

一、自定义拦截器
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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!