博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springMVC异常&&重定向&&转发
阅读量:5046 次
发布时间:2019-06-12

本文共 9986 字,大约阅读时间需要 33 分钟。

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;@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+"/";%>                        
姓名:
年龄:

welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              欢迎页面      

欢迎访问${uname }${param.uage }

 


 

2)重定向到控制器:

FirstController.java

 

package cn.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;@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配置

springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext.xml
1
springmvc
*.do
index.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+"/";%>                         

系统异常处理

姓名:
年龄:

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

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>             错误页面             

我是所有错误消息显示页面

${ex.message }

MyController.java(定义处理器)

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

applicationContext.xml

效果:

 

 


 

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

 

web.xml

springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext.xml
1
springmvc
*.do
index.jsp

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+"/";%>             错误页面             

用户名错误

${ex.message }

ageerrors.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>             错误页面             

年龄错误

${ex.message }

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;@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;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

error/nameerrors.jsp
error/ageerrors.jsp

效果:

 

 

 

 


 

 实现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

其它与上述的一样

 


 

异常处理注解@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;@Controllerpublic 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(错误页面)

效果:

 

转载于:https://www.cnblogs.com/hr1997/p/6253472.html

你可能感兴趣的文章
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>
Android 内存泄漏优化总结
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>
oracle数据类型
查看>>
socket
查看>>
Vue中使用key的作用
查看>>
二叉索引树 树状数组
查看>>
日志框架--(一)基础篇
查看>>
Java设计模式之原型模式
查看>>
Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子
查看>>
哲理故事与管理之道(20)-用危机激励下属
查看>>
关于源程序到可运行程序的过程
查看>>
wepy的使用
查看>>