2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Spring MVC重定向和转发及异常处理

Spring MVC重定向和转发及异常处理

时间:2024-03-06 09:20:21

相关推荐

Spring MVC重定向和转发及异常处理

SpringMVC核心技术---转发和重定向

当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向。而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器。

对于请求转发的页面,也可以是WEB-INF中页面;对于重定向的页面,不能为WEB-INF中的页面。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问WEB-INF中资源的

1)重定向到页面

FirstController.java

package cn.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;/*** * @author **/@Controllerpublic class FirstController {@RequestMapping(value="/first.do")public String doAddOrder(Model model,String uname,int uage){model.addAttribute("uname", uname);model.addAttribute("uage",uage);return "redirect:/welcome.jsp";}}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><style type="text/css">form{margin:0px auto;/* border:1px solid red; */width:500px;}</style><title></title></head><body><form action="${pageContext.request.contextPath }/first.do" method="post">姓名:<input name="uname"/><br/><br/>年龄:<input name="uage"/><br/><br/><input type="submit" value="注册"/></form></body></html>

welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>欢迎页面</title></head><h1>欢迎访问${uname }${param.uage }</h1></body></html>

2)重定向到控制器:

FirstController.java

package cn.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;/*** * @author **/@Controllerpublic class FirstController {//处理器方法 doFirst==========》doSecond@RequestMapping(value="/first.do")public String doAddOrder(Model model,String uname,int uage){model.addAttribute("uname", uname);model.addAttribute("uage",uage);return "redirect:second.do";}@RequestMapping(value="/second.do")public String doList(Model model,String uname,int uage){model.addAttribute("uname", uname);model.addAttribute("uage",uage);System.out.println(uname+"==================");return "redirect:/welcome.jsp";}}

其它与上述相同

转发与重定向一样,就不多做解释

异常处理

描述

在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。

那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的。下面将介绍使用Spring MVC统一处理异常的解决和实现过程。

分析

Spring MVC处理异常常见有4种方式:

1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver

2)实现Spring的异常处理SimpleMappingExceptionResolver自定义自己的异常处理器

3)实现HandlerExceptionResolver 接口自定义异常处理器

4)使用注解@ExceptionHandler实现异常处理

我们先介绍三种:

案例

系统异常处理SimpleMappingExceptionResolver

web.xml配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xmlns:web="/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd" version="2.5"><display-name></display-name><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>

index.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><style type="text/css">form{margin:0px auto;background-color:pink;width:500px;}</style><title></title></head><body><h1>系统异常处理</h1><form action="${pageContext.request.contextPath }/first.do" method="post">姓名:<input name="name"/><br/><br/>年龄:<input name="age"/><br/><br/><input type="submit" value="注册"/></form></body></html>

errors.jsp(报错是跳转到此页面)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>错误页面</title></head><body><h1>我是所有错误消息显示页面</h1>${ex.message }</body></html>

MyController.java(定义处理器)

package cn.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/*** * @author **/@Controllerpublic class MyController {//处理器方法@RequestMapping(value="/first.do")public String doFirst(){//构造异常 int result=5/0;return "/WEB-INF/index.jsp";}}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop" xmlns:tx="/schema/tx" xmlns:mvc="/schema/mvc" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd/schema/context /schema/context/spring-context.xsd/schema/aop /schema/aop/spring-aop.xsd/schema/tx /schema/tx/spring-tx.xsd/schema/mvc /schema/mvc/spring-mvc.xsd"><!-- 包扫描器 --><context:component-scan base-package="cn.controller"></context:component-scan><!-- 注册系统异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="defaultErrorView" value="errors.jsp"></property><property name="exceptionAttribute" value="ex"></property></bean></beans>

效果:

实现Spring的异常处理接口SimpleMappingExceptionResolver自定义自己的异常处理器

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xmlns:web="/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd" version="2.5"><display-name></display-name><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>

error包中是指定错误页面

nameerrors.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>错误页面</title></head><body><h1>用户名错误</h1>${ex.message }</body></html>

ageerrors.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>错误页面</title></head><body><h1>年龄错误</h1>${ex.message }</body></html>

FirstController.java

package cn.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import cn.exceptions.AgeException;import cn.exceptions.NameException;import cn.exceptions.UserInfoException;/*** * @author **/@Controllerpublic class FirstController {//处理器方法 @RequestMapping(value="/first.do")public String doFirst(String name,int age) throws UserInfoException{if (!"hh".equals(name)) {throw new NameException("用户名错误");}if (age>40) {throw new AgeException("年龄太大");}return "index.jsp";}}

exception包下,指定异常类

UserInfoException.java

package cn.exceptions;/*** * @author **/public class UserInfoException extends Exception{public UserInfoException() {super();// TODO Auto-generated constructor stub}public UserInfoException(String message) {super(message);// TODO Auto-generated constructor stub}}

NameException.java

package cn.exceptions;/*** * @author **/public class NameException extends UserInfoException{public NameException() {super();// TODO Auto-generated constructor stub}public NameException(String message) {super(message);// TODO Auto-generated constructor stub}}

AgeException.java

package cn.exceptions;/*** * @author **/public class AgeException extends UserInfoException{public AgeException() {super();// TODO Auto-generated constructor stub}public AgeException(String message) {super(message);// TODO Auto-generated constructor stub}}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop" xmlns:tx="/schema/tx" xmlns:mvc="/schema/mvc" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd/schema/context /schema/context/spring-context.xsd/schema/aop /schema/aop/spring-aop.xsd/schema/tx /schema/tx/spring-tx.xsd/schema/mvc /schema/mvc/spring-mvc.xsd"><!-- 配置包扫描器--><context:component-scan base-package="cn.controller"></context:component-scan><!-- 注册系统异常处理器 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="defaultErrorView" value="errors.jsp"></property><property name="exceptionAttribute" value="ex"></property><property name="exceptionMappings"><props><prop key="cn.exceptions.NameException">error/nameerrors.jsp</prop><prop key="cn.exceptions.AgeException">error/ageerrors.jsp</prop></props></property></bean></beans>

效果:

实现HandlerExceptionResolver 接口自定义异常处理器

使用Springmvc定义好的SimpleMappingExceptionResolver异常处理器,可以实现发生指定异常后的跳转。但是若要实现在捕获到指定异常时,执行一些操作的目的,它是完成不了的。此时,就需要自定义异常处理器。自定义异常处理器,需要实现HandlerExceptionResolver接口,并且该类需要在Springmvc配置文件中进行注册

定义自己的异常处理类

package cn.resolvers;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerExceptionResolver;import org.springframework.web.servlet.ModelAndView;import cn.exceptions.AgeException;import cn.exceptions.NameException;/*** * @author **/public class MyHandlerExceptionResolver implements HandlerExceptionResolver{public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {ModelAndView mv=new ModelAndView();mv.addObject("ex",ex);mv.setViewName("/errors.jsp");//viewif(ex instanceof NameException){mv.setViewName("/error/nameerrors.jsp");}if(ex instanceof AgeException){mv.setViewName("/error/ageerrors.jsp");}return mv;}}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop" xmlns:tx="/schema/tx" xmlns:mvc="/schema/mvc" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd/schema/context /schema/context/spring-context.xsd/schema/aop /schema/aop/spring-aop.xsd/schema/tx /schema/tx/spring-tx.xsd/schema/mvc /schema/mvc/spring-mvc.xsd"><!-- 包扫描器 --><context:component-scan base-package="cn.controller"></context:component-scan><!-- 注册自定义异常处理器 --><bean class="cn.resolvers.MyHandlerExceptionResolver"/></beans>

其它与上述的一样

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。