springMVC异常&&重定向&&转发
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; @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; @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; @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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://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; @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; 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; 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; 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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://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; 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"); //view
if(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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://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>
其它与上述的一样
异常处理注解@ExceptionHandler
1)异常处理注解@ExceptionHandler第一版
其它配置都一样
@ExceptionHandler()可以不写或者顶级异常或者与之指定的异常
package cn.controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import cn.exceptions.AgeException;
import cn.exceptions.NameException;
import cn.exceptions.UserInfoException; @Controller
public class MyController extends BaseController{
//处理器方法
@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 "/WEB-INF/jsp/index.jsp";
} @ExceptionHandler
public ModelAndView handlerException(Exception ex){
ModelAndView mv=new ModelAndView();
mv.addObject("ex",ex); mv.setViewName("/errors.jsp"); //view
if(ex instanceof NameException){
mv.setViewName("/error/nameerrors.jsp");
} if(ex instanceof AgeException){
mv.setViewName("/error/ageerrors.jsp");
} return mv;
}
}
applicationContext.xml===(只需写一个包扫描器就行)
index.jsp
error.jsp(错误页面)
效果:
springMVC异常&&重定向&&转发的更多相关文章
- springMVC 异常
springMVC 异常 0.依赖(不只是本次案例所需) <?xml version="1.0" encoding="UTF-8"?> <p ...
- http status 301/302 & java重定向/转发
一.301/3021.什么是301转向?什么是301重定向? 301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header) ...
- SpringMVC异常的处理机制
SpringMVC异常的处理机制 处理流程图 其本质还是把异常交给SpringMVC框架来处理 系统的dao.service.controller出现异常都通过throws Exception向上抛出 ...
- SpringMVC传值、转发、重定向例子
练习接收页面参数值 使用request 使用@RequestParam注解 使用实体对象 练习向页面传出数据 使用HttpServletRequest和session 使用ModelAndView对象 ...
- 关于SpringMVC中的转发与重定向的说明
写的非常详细,参看该地址:https://www.zifangsky.cn/661.html 总结: 1.请求转发:url地址不变,可带参数,如?username=forward 2.请求重定向:ur ...
- 12.SpringMVC核心技术-请求转发和重定向
默认情况下,跳转到指定的View,使用的是请求转发.也可以显示的进行指出 此时,需在setViewName() 指定的视图前添加 forword: , 且此时的视图不会再与视图解析器中的前缀和后缀进 ...
- SpringMVC的请求转发的三种方法
SpringMVC请求转发的三种方法 首先明白请求转发是一次请求,地址栏不会发生变化,区别于重定向.springmvc环境自行配置. 以下举例中存在如下文件/WEB-INF/pages/success ...
- SpringMVC 的重定向时,参数非法问题
在重定向时,携带的参数出现非法 /shopping/editShippingAddressCart?cs=0eaa49d6-9c6e-4d02-85d0-40c3c7939207|ef9d80b1-7 ...
- SSM-SpringMVC-26:SpringMVC异常骇级之自定义异常注解版
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 注解的方法实现异常解析,话不多说,直接搞起,和以前一样的习惯,和上篇博客一样的代码放后面,不一样的在前面 案 ...
随机推荐
- ASP.NET Core 中文文档 第四章 MVC(3.6.2 )自定义标签辅助类(Tag Helpers)
原文:Authoring Tag Helpers 作者:Rick Anderson 翻译:张海龙(jiechen) 校对:许登洋(Seay) 示例代码查看与下载 从 Tag Helper 讲起 本篇教 ...
- 是时候 UWP 了 !
什么是 UWP? 很多程序员都有一个梦想:希望自己开发的软件能够轻而易举的在所有平台上运行,而不是把同样的需求,用不同的技术.工具重新开发才能够运行在所有平台上.这就是跨平台,很多软件从业者都在为这个 ...
- java.lang.Class.isAssignableFrom()用法解析
一.概述: 此方法主要用来判断 "参数类" 是否是 "源类" 的子类.接口实现类,或者与 "源类" 相同,在此情况下返回 true; 二.格 ...
- 两种常用的C语言排序算法
1. 要求输入10个整数,从大到小排序输出 输入:2 0 3 -4 8 9 5 1 7 6 输出:9 8 7 6 5 3 2 1 0 -4 解决方法:选择排序法 实现代码如下: #include &l ...
- PHP中this,self,parent三个关键字
this,self,parent三个关键字从字面上比较好理解,分别是指这.自己.父亲. this是指向当前对象的指针(姑且用C里面的指针来看吧)self是指向当前类的指针parent是指向父类的指针( ...
- ATM-PROGRAM 关于Proprties的问题
public static void turnMoney(String ToAccNo, int money){ d = new Date(); dateStr = noteDate.format(d ...
- Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境【转】
项目建设完成之后的结构: 数据库的表结构如下: 环境建设:搭建Maven环境.Tomcat环境.需要MySql 数据库支持,使用的编程工具Eclipse (这些是前期准备): 开始创建工程: 1.创建 ...
- 浏览器渲染引擎,提高css渲染速度。
一.渲染引擎渲染引擎的职责是……渲染,也就是把请求的内容显示到浏览器屏幕上.默认情况下渲染引擎可以显示HTML,XML文档以及图片. 通过插件(浏览器扩展)它可以显示其它类型文档. 二.各种渲染引擎我 ...
- oracle rman catalog备份和恢复
1.丢失控制文件 启动数据库至nomount状态:restore controlfile from autobackup/restore controlfile from '+data/ba ...
- CentOS7下安装Python的pip
root用户使用yum install -y python-pip 时会报如下错误: No package python-pip available Error:Nothing to do 解决方法如 ...