目录
1. 解决中文乱码问题
在提交表单如果遇到中文乱码,Spring提供了一CharacterEncodingFilter过滤器可用来解决乱码问题,注意表单需要以post方式提交,页面编码方式要和过滤器编码保持一致。
<!-- 在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>
2. SpringMVC中的转发和重定向
请求转发和重定向最大的区别就是转发可以携带数据,二重定向则不能携带数据。SpringMVC 默认采用转发的方式定位视图。
@RequestMapping("/login")
public String login(String userName,String password,Model model) {
model.addAttribute("userName", userName);
model.addAttribute("password",password);
//return "redirect:show.do";//重定向,不可携带数据
return "forward:show.do";//请求转发,可携带数据
}
3. SpringMVC拦截器
拦截器是SpringMVC中强大的控件,它可以使得一个请求在进入处理器之前做一些操作,或者在处理器执行了以后进行操作。拦截器在SpringMVC中有着相当重要的作用,一般如拦截用户的请求并进行相应的处理。
在SpringMVC中实现拦截器的功能主要通过两种途径:
1)实现HandlerInterceptor接口
HandlerInterceptor接口的三个方法
1、preHandle:此方法是在前端控制器收到请求以后
2、postHandle:该方法的作用是进行处理器拦截用的,它的执行时间是在处理器进行处理之后
3、afterCompletion:整个请求结束以后执行。可进行一些资源清理工作。
package com.chtw.intercept;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 检查登录的拦截器
* @author CHTW
*
*/
public class CheckLogin implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
if(session.getAttribute("currentUser")!=null) {
return true;
}else {
request.setAttribute("message", "请先登录");
request.getRequestDispatcher("index.do").forward(request, response);
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
<!-- 配置拦截器 如果有多个拦截器,则依据配置的先后顺序来分别执行 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /> <!-- 拦截所有请求 -->
<mvc:exclude-mapping path="/index.do" /> <!--设定允许该请求通过 -->
<!-- 发生异常时,默认页面 -->
<mvc:exclude-mapping path="/logging.do"/>
<bean class="com.chtw.intercept.CheckLogin" />
</mvc:interceptor>
</mvc:interceptors>
2)实现WebRequestInterceptor接口
4. SpringMVC中的异常处理
SpringMVC有三种异常处理的方法
1)使用SpringMVC提供的简单异常处理器:SimpleMappingExceptionResolver,通过配置exceptionMappings可以将不同的异常映射到不同的jsp页面;通过配置defaultErrorView可以将所有的异常映射到一个jsp页面。需要在applicationContext.xml添加如下配置:
<!-- 异常处理1 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"></property>
<property name="exceptionMappings">
<props>
<!-- 配置异常出现时,要去的页面 -->
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
2)实现HandlerExceptionResolver接口自定义异常处理器,首先需要实现这个接口;如下
package com.chtw.exception;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
//自定义异常解析器
public class MyExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object arg2,
Exception ex) {
Map<String,Object> map = new HashMap<>();
map.put("exception", ex);
//当发生异常时,将异常携带到指定异常处理页面
return new ModelAndView("error",map);
}
}
同时在applicationContext.xml下添加如下配置
<bean class="com.chtw.exception.MyExceptionResolver"/>
3)使用@ExceptionHandler注解实现异常处理(最常使用):直接将@ExceptionHandler放在Controller中的自定义的异常处理方法上,如果该Controller组件出现异常,则直接按约定的异常方法处理。
package com.chtw.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController {
//基于注解的异常处理
@ExceptionHandler
public String testException(Exception e) {
e.printStackTrace();
Map<String,Object> map = new HashMap<>();
map.put("exception", e);
System.out.println("发生异常");
return "error";
}
}
在Controller组件中定义带有@ExceptionHandler的方法能处理当前Controller组件的异常,但是如果想要这个异常处理方法能够处理其他Controller类中也能使用的话,可以使用@ControllerAdvice注解,它是spring3.2提供的新注解,作用是增强Controller控制器,我们可以单独定义一个异常处理的Controller类,并在该类上添加此注解,然后在类中再使用@ExceptionHandler去定义异常处理方法,这样该异常处理类便能够处理整个项目中的异常。
本人联系方式2329095893,欢迎各位进行学习讨论
欢迎关注熊熊出没ING公众号,不定时跟新Java、python、信息安全等相关知识哦。