SpringMVC-03
1. @RequestParam注解
解决了客户端和服务端因参数名称不一致的问题,在处理请求的方法的参数前加上该注解。
@RequestParam("username")uname
username为客户端提交的名称,uanme为服务端的参数名称,可以对应起来。一旦使用该注解,则必须进行提交,否则会报错(400错位)。
原因:该注解有以下属性:
boolean required () default true
默认需要提交参数,可以设置为false;
@RequestParam(value="username",required=false)uname
如果客户端没提交数据,可以指定默认的参数的值(必须显式的required=false):
@RequestParam(value="username",required=false,defaultValue="指定的值")uname
2. 拦截器(Interceptor)
2.1 作用:
拦截器可以在处理几乎所有请求之前,对请求进行拦截,并尝试进行判断或验证,决定阻止处理或放行。
2.2 使用
- 实现拦截器接口HandlerInterceptor:preHandle方法起拦截作用,返回true时标识放行。
```java
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Sorry,You can not require this web!");
return false;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
2. 在配置文件中配置拦截器链:
<!-- 拦截器链 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截的请求路径 -->
<mvc:mapping path="/index.do"/>
<!-- 拦截类,处理拦截的结果 -->
<bean class = "cn.spring.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
实现效果:index.jsp网页显示不了。
3. 配置拦截器的拦截路径,分为拦截路径和不拦截路径:<mvc:mapping path="/**"/>为拦截所有请求,<mvc:exclude-mapping path="/login.do"/>可以任意配置请求,该请求不经过拦截器处理。
<!-- 拦截器链 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截的请求路径 -->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login.do"/>
<mvc:exclude-mapping path="/handle_login.do"/>
<!-- 拦截类,处理拦截的结果 -->
<bean class = "cn.spring.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
## 3. 拦截器(Interceptor)与过滤器(Filter)的区别
1. 拦截器是SpringMVC的组件,且仅在被DispatcherServlet处理之后的请求才能处理;过滤器是javaee的组件。
2. 拦截器且仅在被DispatcherServlet处理之后的请求才能处理;过滤器的执行是在所有Servlet之前。
3. 拦截器配置灵活,可以配置拦截路径和多个不拦截路径;过滤器通过**<url-pattern>**节点配置1个需要过滤的路径,并且只能在过滤器的类中进行判断分析。
4. 过滤器是在web.xml文件中配置,而拦截器链在spring的配置文件中。
## 4.乱码问题
存储和读取使用一致的编码不会出现乱码的问题。
指定编码的地方有:数据传输过程、项目源代码、显示数据的界面、存储数据的地方。
###4.1 解决乱码问题:SpringMVC中的CharacterEncodingFilter过滤器类,声明了encoding属性,在方法doFilter()中设置我们响应的字符编码。在web.xml文件中配置过滤器:
<filter>
<filter-name>CharactorEncodingFilter</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>CharactorEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
## 5.SpringMVC的异常处理
@ExceptionHandler(value={异常的类型数组})
自定义一个公共处理异常的类BaseExceptionHnadlerController,然后让所有控制器都继承该类,就可以实现异常的统一处理。
public class BaseExceptionHnadlerController {
//ExceptionHandler可以指定要处理的异常类型
//这个公共处理异常的类可以不被扫描
//当其他被扫描的组件的父类为该类时,会先创建该类的实例
@ExceptionHandler(value = Throwable.class)
public String handlerException(Throwable e, HttpServletRequest request) {
String erromessageString = null;
if (e instanceof NullPointerException) {
erromessageString = "您请求的参数为空!操作失败!";
} else if (e instanceof IndexOutOfBoundsException) {
erromessageString = "您访问的数据已经越界!请求失败!";
} else {
erromessageString = "操作失败!请联系系统管理员!";
}
request.setAttribute("err_message", erromessageString);
return "erro";
}
}
- 用于统一处理异常的方法有以下特点:
1. public访问权限,保证每个继承自它的子类都可以使用
2. 要包含所有可能要处理的异常类型
3. 该方法的参数可以包含Servlet相关的一些参数
4. 方法之前要加上注释:@ExceptionHandler