中文乱码处理
SpringMVC处理中文乱码的解决方法和普通Servlet处理中文乱码的方法没有什么不同,我们都是推荐使用过滤器。不过,SpringMVC有它自带的过滤器,你只需要在web.xml文件中进行如下配置即可:
<!-- 配置处理中文乱码的过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上传文件
SpringMVC上传文件相对简单。
- MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。
- 加入上传文件所需要依赖的jar包:

- 在springmvc-servlet.xml文件中增加文件解析器的配置
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<!--上传文件总大小-->
<property name="maxUploadSize" value="100000"></property>
<property name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
- 新建上传文件jsp,form表单的
enctype="multipart/form-data"属性非常重要。
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
- 新建Controller
@RequestMapping("/upload")
public String upload(MultipartFile file) throws IllegalStateException, IOException {
// 获取上传文件的名称
String name = file.getOriginalFilename();
System.out.println(name);
File descFile = new File("E:/image/" + name);
// 将上传文件存入目标文件
file.transferTo(descFile);
return "forward:success.jsp";
}
- 测试。
静态资源处理
如果将DispatcherServlet请求映射配置为"/",则Spring MVC将捕获Web容器所有的请求,包括静态资源的请求,Spring MVC会将它们当成一个普通请求处理,因此找不到对应处理器将导致错误。
如何让Spring框架能够捕获所有URL的请求,同时又将静态资源的请求转由Web容器处理,是可将DispatcherServlet的请求映射配置为"/"的前提。
如果要正常访问静态资源(图片,css,js等)需要更改springmvc-servlet.xml文件:
<mvc:default-servlet-handler />
在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
拦截器
SpringMVC的拦截器的实现和一个叫做HandlerInterceptor的接口密不可分,所有的拦截器,要么实现了这个接口,要么继承了该接口的实现类(HandlerInterceptorAdapter)。
- 新建java class,实现HandlerInterceptor接口:
package com.xx.intercepter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyIntercepter implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
return false;
}
}
要重写的方法有三个,分别是:
- public boolean preHandle
这个方法会在Controller处理请求之前被调用,SpringMVC的Interceptor是链式调用的,和过滤器一样,一个应用中或者一个请求中允许同时存在多个拦截器。通常在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理。也可以在这个方法中判断请求是否继续执行,当这个方法返回值为false时,表示结束请求,后续的Interceptor和Controller都不会被执行。当返回值为true时就继续调用下一个拦截器后者直接执行控制器。
- public void postHandle
在Controller方法执行后,在视图渲染之前调用,我们可以在这个方法中对Controller返回的ModelAndView对象进行操作。
- public void afterCompletion
见名知意,这个方法会在整个请求结束,视图渲染完毕后调用。这个方法通常用来进行资源清理工作。
- 在springmvc-servlet.xml中配置拦截器:
拦截器的配置分为两种:一种是全局拦截器,一种是局部拦截器。
- 全局拦截器的配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 全局拦截器,对所有的请求路径都会进行拦截,class中写你全局拦截器的全限定名-->
<bean class="com.xx.util.GloableHandleInterceptor"></bean>
</mvc:interceptors>
- 局部拦截器
<mvc:interceptors>
<!-- 配置局部拦截器 -->
<mvc:interceptor>
<!-- mvc:mapping标签用来配置拦截请求路径-->
<mvc:mapping path="/**"/>
<!-- 配置不拦截的路径 -->
<mvc:exclude-mapping path="/login"/>
<!-- 配置具体拦截器 -->
<bean class="com.xx.util.MyHandlerIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
/*和/**的区别
/* 是拦截所有的文件夹,不包含子文件夹
/** 是拦截所有的文件夹及里面的子文件夹
- 静态资源的处理:
拦截器可以拦截一些请求,但是不能是所有请求,对于静态资源,我们这进行特别处理:
- 在springmvc-config.xml中启用默认servlet处理静态资源:
<mvc:default-servlet-handler />
- 修改xml文件,注意,这段配置必须放在web.xml中前端处理器(DispatcherServlet)的配置之前:
<!-- 在web.xml中增加对静态资源的处理 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
简单的配置之后,你就可以写自己的拦截器以实现对请求和响应的特殊处理了。
过滤器和拦截器的区别
- 拦截器是基于java的反射机制的(拦截器–>处理器(Controller)),而过滤器是基于函数回调。
- 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
- 拦截器只能对非.jsp的请求起作用,而过滤器则可以对几乎所有的请求起作用(包括.jsp)。
异常处理
相信没有人会喜欢404页面和500页面,但是由于各种原因,用户总会碰到它。不只是404,各种异常都有可能出现,这就涉及到异常处理了。
异常处理分为两种,一种是局部异常处理,一种是全局异常处理。
- 局部异常处理
如果你想对某个Controller进行局部异常处理,就在这个Controller中新建一个方法,使用@ExceptionHandler在方法上进行注解,那么SpringMVC就知道它是处理异常的
@ExceptionHandler
public String handleException(Exception exception,Model model){
// 存储错误信息
model.addAttribute("error_msg", exception.getMessage());
// 转发到error.jsp页面
return "forward:error.jsp";
}
- 全局异常处理
实际开发中,局部异常处理用的不多,我们大多情况下把常见的异常进行汇总,写在一个专门处理异常的类里:
// ControllerAdvice注解的类就是专门用来处理异常的。
@ControllerAdvice
public class TestGloableExceptionHandlerController {
@ExceptionHandler
public String handleException(Exception exception,Model model){
model.addAttribute("error_msg", exception.getMessage());
return "forward:error.jsp";
}
}
对于404,500这种常见的错误页面,我们一般不在Controller里面处理,而是在web.xml文件里面处理,根据不同错误码做响应的处理:
<!-- 配置错误处理的页面 -->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
这样,我们就有自己处理404和500的jsp页面了,你可以想尽办法在这里面增强客户体验。
本文详细介绍了SpringMVC框架的多项核心功能,包括中文乱码处理、文件上传、静态资源处理、拦截器配置、异常处理等。通过具体实例展示了如何在SpringMVC中配置过滤器解决中文乱码问题,实现文件上传功能,处理静态资源请求,以及如何自定义拦截器和全局异常处理器。
341

被折叠的 条评论
为什么被折叠?



