(一)中文乱码过滤器
对于POST请求的中文乱码,SpringMVC提供了一个全局的过滤器,只需要在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>
(二)静态资源处理
我们现在的DispatcherServlet配置的路径是/,即这是个默认的Servlet,只要是请求找不到对应Servlet都 会转交到它这里来,而它又会去调用适配器映射器去寻找对应的Hadler处理。
但是对于一些静态资源像js、css是不需要Handler处理的,所以要告诉DispatcherServlet,哪些请求不 需要找Handler处理,而是直接去找对应的资源,这就用到了一个配置 :
< mvc:resources mapping="匹配请求路径" location="真实路径">
<!--只要是请求路径为/js/**的,不去寻找对应的Controller,而是直接到对应的路径/js下取资源-->
<mvc:resources mapping="/js/**" location="/js/" />
<!--这个配置也可以:自己找不到资源的抛给外层容器处理-->
<mvc:default-servlet-handler />
(三)异常处理机制
在项目的开发过程中出现异常是非常普遍的事情,我们在开发过程中对异常信息的处理有时需要根据实际的业务进行创建,创建出符合当前功能的统一异常处理方式,SpringMVC提供了有效的异常处理机制。不需要用户重复异常处理的操作,减少了代码的冗余,提高了程序的扩展性和维护性
1、自定义异常处理器
(1)创建工具类实现HandlerExceptionResolver接口
public class MyException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj,Exception ex) {
Return null ;
}
}
(2)在接口的方法中提供处理异常的具体内容代码
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj,
Exception ex) {
ModelAndView mav = new ModelAndView();
//后台提示(编程人员)
System.out.println("程序出现了异常问题");
System.out.println("异常名称"+ex.getClass().getName());
//设定项目出现异常的统一的提示页面(客户端)
mav.setViewName("exception");
mav.addObject("info","系统升级中,请稍后重试!!");
//将异常信息写入到系统的日志文件中
FileWriter fw;
fw = new FileWriter("D:\error.log",true);
PrintWriter pw =new PrintWriter(fw);
ex.printStackTrace(pw);
pw.flush();
pw.close();
fw.close();
return mav;
}
(3)在我们的SpringMVC.xml中进行配置
<bean id=”handlerExceptionResolver” class="自己定义的异常处理工具类的全部路径">
</bean>
HandleExceptionResolver是一个用于自定义异常处理器的接口,所以需要自己编写一个异常处理类来实现该接口,从而达到异常处理的效果。
2、内置异常处理器
(1)在springxml中配置bean
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
(2)运行控制器代码,代码中出现异常会自动的映射到error.jsp页面我们只需要进行如上配置,当业务控制器的代码出现运行错误时,抛出的错误信息就会被该对象捕获,然后返回的提示出错的视图名(error),视图名会交给ViewResolver的配置寻找到具体的视图组件(error.jsp),返回前台界面提示错误信息。
这种内置的异常处理器是全局性的,也就是说整个程序中所有的业务控制器在调用其他组件处理数据发生异常时,如果抛出异常信息,就会做出相同的处理。
3、局部异常处理
使用 @ExceptionHandler注解可以处理个别Controller的异常处理
(1)在控制器方法中添加一个单独的处理异常方法
//局部异常处理
@ExceptionHandler
//方法名可以自己定义,参数类型要按要求写,否则运行会发生错误
public String handlerExcepting(HttpServletRequest request,Exception ex){
return "he_error";
}
(2)测试代码只有当前控制器出现了异常,才会跳转到指定的错误页面,其他控制器出现异常是不会处理的,在SpringMVC体系中优先使用局部异常处理机制