SpringMVC-03

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 使用

  1. 实现拦截器接口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





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

J.K.Roling

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

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

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

打赏作者

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

抵扣说明:

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

余额充值