Spring篇--06 Spring MVC之系统分层、编码、拦截器、异常处理

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";
		}		
	}	

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值