1.请求重定向和转向
springMVC 框架把原来Servlet中的请求转发和重定向操作进行了封装。现在可以使用简单的方式实现转发和重定向。
forward:表示转发,实现request.getRequestDispatcher("xx.jsp").forward()
redirect:表示重定向,实现response.sendRedirect("xxx".jsp)
1.1 请求转发
1.2 重定向
相当于 请求了 两个request域
重定向操作:
小结:
2.异常处理
统一异常处理:
springmvc 框架采用的是统一的,全局的异常处理。
把controller中所有异常处理都集中到一个地方。采用的是aop的思想。
把业务逻辑和异常处理的代码分开。解耦合
使用两个注解:
@ExceptionHandler
表示异常的类型,当前发生此类型时,由当前方法处理
@ControllerAdvice:
处理异常类:
练习:
/**
* @Description:
*
* @ControllerAdvice: 控制器增强(也就是说给控制器类增加功能 -- 异常处理功能)
* 位置: 在类的上面
* 特点:必须在springmvc中配置 文件声明的组件扫描器。
* 指定@ControllerAdvice所在的包名
*
* @Author : Jerry
* @create : 2022-04-19 16:00
*/
package com.bjpowernode.handler;
import com.bjpowernode.exception.AgeException;
import com.bjpowernode.exception.NameException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
/**
* @Description:
*
* @ControllerAdvice: 控制器增强(也就是说给控制器类增加功能 -- 异常处理功能)
* 位置: 在类的上面
* 特点:必须在springmvc中配置 文件声明的组件扫描器。
* 指定@ControllerAdvice所在的包名
*
* @Author : Jerry
* @create : 2022-04-19 16:00
*/
@ControllerAdvice
public class GlobalExceptionHandler {
//定义方法,处理发生的异常
//处理异常的方法和控制器的方法一样,可以有多个参数,可以有ModelAndView,
//String,Void 对象的返回值
@ExceptionHandler(value = NameException.class)
public ModelAndView doNameException(Exception e){
//处理Exception的异常
/*
* 异常处理的逻辑:
* 1.把异常记录下来,记录到数据库或日志文件
* 异常发生的时间,方法,异常报错内容
* 2.发送通知,把异常的信息通过邮件,短信,微信,发送给相关人员
* 3.给用户友好的提示
*
* */
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "姓名必须是zs,其他用户不能访问");
mv.addObject("e", e);
mv.setViewName("nameError");
return mv;
}
@ExceptionHandler(value = AgeException.class)
public ModelAndView doAgeException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "您的年龄不合法");
mv.addObject("e", e);
mv.setViewName("ageError");
return mv;
}
//处理其他未捕获的异常
@ExceptionHandler
public ModelAndView doOtherException(Exception e){
//处理其他的异常
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "姓名必须是zs,其他用户不能访问");
mv.addObject("e", e);
mv.setViewName("defaultError");
return mv;
}
}
配置文件:
<?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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--声明主键扫描器-->
<context:component-scan base-package="com.bjpowernode.controller"/>
<!--声明springMVC框架中的视图解析器,帮助开发人员设置视图文件的路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/" />
<!--后缀:视图文件的扩展名-->
<property name="suffix" value=".jsp" />
</bean>
<!--处理需要的两步-->
<context:component-scan base-package="com.bjpowernode.handler"/>
<!--注解驱动-->
<mvc:annotation-driven/>
</beans>
controller类:
package com.bjpowernode.controller;
import com.bjpowernode.exception.AgeException;
import com.bjpowernode.exception.MyUserException;
import com.bjpowernode.exception.NameException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @ResquestMapping:
* value: 所有请求地址的公共部分,模块名称
* 位置:放在类的上面
*/
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(String name,Integer age)throws MyUserException {
System.out.println("doSome,name="+name+", age="+age);
ModelAndView mv = new ModelAndView();
//根据请求参数抛出异常
if(!"zs".equals(name)){
throw new NameException("姓名不正确!!!");
}
if(age==null|| age>80){
throw new AgeException("年龄不正确!!!");
}
mv.addObject("myName", name);
mv.addObject("myAge", age);
mv.setViewName("show");
return mv;
}
}