SSM框架(四)SpringMVC的应用二

目录

 

1. 解决中文乱码问题

2. SpringMVC中的转发和重定向

3. SpringMVC拦截器

4. SpringMVC中的异常处理


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、信息安全等相关知识哦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值