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 **/
@Controller
public 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 **/
@Controller
public 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="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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 **/
@Controller
public 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="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/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="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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 **/
@Controller
public 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="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/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="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 包扫描器 --><context:component-scan base-package="cn.controller"></context:component-scan><!-- 注册自定义异常处理器 --><bean class="cn.resolvers.MyHandlerExceptionResolver"/></beans>

其它与上述的一样

转载于:https://www.cnblogs.com/6zhi/p/6250293.html

Spring MVC重定向和转发及异常处理相关推荐

  1. Spring MVC重定向和转发

    技术交流群:233513714 转发和重定向 开始Java EE时,可能会对转发(forward)和重定向(redirect)这个两个概念不清楚.本文先通过代码实例和运行结果图片感性 认识二者的区别, ...

  2. springmvc重定向到另一个项目_Spring MVC重定向和转发详解

    Spring MVC请求方式分为转发.重定向两种,是用forward和redirect关键字在controller层进行处理.本文我们就来探讨一下Spring MVC请求方式中的Spring MVC重 ...

  3. spring mvc重定向_Spring的Web MVC –重定向到内存泄漏

    spring mvc重定向 他们说一块岩石会引起雪崩. 最近,我的一位同事Marcin Radoszewski给了我一块岩石. 您可能永远不会猜到它是什么,但是有机会在许多Web应用程序中使用它. 请 ...

  4. spring mvc 入门DispatcherServlet转发

    目录 一,配置相关 二,java类测试 三,测试 一,配置相关 maven坐标依赖 <dependencies><!-- spring context --><depen ...

  5. Spring Mvc 数据回显、异常处理、文件上传、json交互、ResTful、拦截器的使用(高级三)

    1,数据回显 SpringMvc包含三种数据回显机制 第一种:对于简单数据类型,如:Integer.String.Float等使用Model将传入的参数再放到request域实现显示. (回顾jsp四 ...

  6. Spring mvc 重定向

    @RequestMapping("/test") public void testVoid(HttpServletRequest request, HttpServletRespo ...

  7. Spring MVC框架——Web开发框架

    1.MVC设计模式 一般指MVC框架,M(Model)数据模型层,V(View)视图层,C(Controller)控制层. Controller层:获取用户的请求,处理相关业务逻辑,并成功跳转页面,负 ...

  8. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

  9. spring mvc controller间跳转 重定向 传参

    spring mvc controller间跳转 重定向 传参 1. 需求背景     需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形 ...

最新文章

  1. ASIHTTPRequest的环境配置和使用示例
  2. GC优化利器 - HBase2.0全链路offheap
  3. TCP/IP的二层负载
  4. asp.net mvc+httpclient+asp.net mvc api入门篇
  5. Binary Search
  6. 551. 学生出勤记录
  7. Redis(十二):Redis事务的基本操作
  8. python是什么类型的语言-Python是什么?简单了解pythonp-入门
  9. heartbeat双机热备配置(适用centos6\rhel6)
  10. 《硅谷钢铁侠:埃隆·马斯克的冒险人生》文摘
  11. 做最好的自己——摘自李镇西的《做最好的老师》
  12. 统计学中的quartile
  13. 这家SaaS公司估值50亿美元,竟然没有一个销售人员
  14. 写作活动第三期!让我们再挣200元稿费吧!
  15. 社会信用编码的验证(18位)
  16. 【正点原子I.MX6U-MINI应用篇】6、嵌入式Linux在LCD屏幕上显示字符
  17. 34、HTML制做奖多多采购页面(仅供参考)
  18. 使用eCharts做了一个中国地图的各地之间的线路连接
  19. razer鼠标测试软件,驱动软实力对比测试_Razer 炼狱蝰蛇2013鼠标_键鼠评测-中关村在线...
  20. MyBatis关联映射:一对一、一对多

热门文章

  1. c语言变量作用域生命周期,C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期...
  2. springboot多模块项目,无法找到另一个模块的实体类
  3. maven <skip></skip>属性
  4. 002_JDK的Comparable接口
  5. python requests text content_python request text 和 content的区别
  6. c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...
  7. Android开源项目
  8. androidannotations
  9. 强大的数据库管理工具Navicat Premium安装教程
  10. mysql 多个游标_mysql 存储过程中使用多游标