Spring篇--06 Spring 登录模块
一、系统分层(扩展)
MVC设计模式
M:model(封装业务逻辑)
业务逻辑+数据访问逻辑
V:view(表示逻辑)
C:controller(控制逻辑)
二、如何分层
1.表示层:数据展现和控制逻辑(请求分发)
2.业务层:业务逻辑的处理
3.持久层:数据访问
a.上一层通过接口调用下一层提供的服务,比如:业务层调用持久层提供的接口;
b.下一层发生改变,不影响上一层,方便 代码的维护。
三、编码问题
1.为什么会有乱码?
表单提交时,游览器会对中文进行编码(会使用打开表单所在页面时的字符集来编码,比如使用utf-8来编码),而服务器端默认使用iso-8859-1来解码,所以会产生乱码
2.如何解决?
springmvc提供了一个过滤器(CharacterEncodingFilter),只需要配置该规律器即可。
注意:a.表单提交要采用post方式提交
b.客户端的编码与过滤器的编码要一样,
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>
四、拦截器
1.什么是拦截器
spring提供的一个特殊的组件,当DispatcherServlet收到请求之后,如果有拦截器 ,会先调用拦截器,然后调用相应的处理器。
注意:过滤器属于servlet规范,而拦截器属于spring框架。
2.如何写一个拦截器
step1:写一个java类,实现HandlerInterceptor接口
package interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SomeInterceptor implements HandlerInterceptor {
/**
* DispatcherServlet收到请求之后,会先调用preHandler方法,
* 如果该方法的返回值是true,则继续向后调用。
* 如果该方法的返回值是false,则不再向后调用
* handler:描述处理器方法的一个对象
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandler");
return true;
}
/**
* 处理器(Controller)的方法已经执行完毕,正准备将处理结果 (ModelAndView对象)返回给DispatcherServlet之前,
* 执行postHandle方法。可以在该方法里面,修改处理结果。
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle()");
}
/**
* 最后执行的方法
* 注意:只有当preHandle方法返回值为true时,该方法才会执行
* ex:是处理器所抛出的异常,可以写一个拦截器用来处理处理器所抛出的异常
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion()");
}
}
step2:实现具体的拦截处理逻辑,比如,session验证。
step3:配置拦截器
<!-- 配置拦截器 -->
<!-- 如果有多个拦截器,会按照配置的先后顺序来执行 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="interceptors.SomeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
五、异常处理
可以将异常抛给spring,由spring来处理这些异常,具体有两种方式。
1.使用简单异常处理器
step1:配置简单异常处理器
step2:添加异常处理页面
<!-- 简单异常处理配置 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.NumberFormatException">error1</prop>
</props>
</property>
</bean>
2.使用@ExceptionHandler注解
step1:在处理器类当中,添加一个异常处理方法,该方法必须使用@ExceptionHandler修饰。
注:在该方法里面,依据异常类型,分别进行不同的处理
step2:添加异常处理页面
@ExceptionHandler
//这是一个异常处理方法
//ex:是其他方法所抛出的异常
public String exHandle(Exception ex,HttpServletRequest request) {
System.out.println("exHandle()");
//依据异常类型的不同,分别进行相应的处理
if(ex instanceof NumberFormatException) {
request.setAttribute("errorMsg", "亲,请输入正确的数字");
return "error";
}else if(ex instanceof StringIndexOutOfBoundsException) {
request.setAttribute("errorMsg", "亲,下标越界");
return "error";
}else {
//其他异常
return "system_error";
}
}