请求转发
forward
: 请求
redirect
: 重定向
在框架中都是关键字,有一个共同的特点,不和视图解析器一起工作。
语法: setViewName("forward:视图完整路径")。
setViewName("redirect:视图完整路径") // 框架会把简单类型数据转化为string放到url中。此时用取数据要${request.getParameter("")}取数据。
并且重定向不能访问WEB-INF下的资源
mv.addObject("msg", "data");
@RequestMapping(value = "/forward.do", method = RequestMethod.POST)
public ModelAndView doForward(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "hhhhhhhhhh");
modelAndView.setViewName("forward:/WEB-INF/view/show.jsp");
return modelAndView;
}
异常处理
- 集中异常处理(aop设计思想,代理处理)
springmvc采用统一,全局异常处理。
把controller中的所有异常都集中到一个地方。采用的是aop的思想,把业务逻辑和异常处理代码分开,解耦合。
- @ExceptionHandler
- @ControlerAdvice
- 处理异常步骤:
- 新建maven 项目
- 加入依赖
- 自定义异常类
- 在controller抛出NameException,AgeException
- 创建一个普通类, 作用全局异常处理类
在类上面载入@ControllerAdvice
在类中定义方法,方法上面加入@ExceptionHandler- 创建处理异常的视图页面
- springmvc配置文件
组件扫描器,扫描@Controller注解
组件扫描器,扫描@ControllerAdvice所在包名
声明注解驱动
//必须让springmvc知道你在哪
// 声明组件扫描器
@ControllerAdvice
public class GlobalExceptionHandler {
// 定义方法, 处理发生的异常
// 处理异常的方法和控制器方法定义地点一样
// @ExceptionHandler(异常的class)标识发生此异常时用此方法处理
@ExceptionHandler(value = NameException.class)
public ModelAndView doNameException(Exception ex){
// 通过形参获取异常信息
// 异常发生时的处理逻辑
// 1. 需要把异常记录下来, 记录到数据库, 日志文件
// 记录日志发生的时间,哪个方法发生的,异常错误内容
// 2. 发送通知,把一场信息通过邮件等等
// 3. 给用户提示
ModelAndView mv = new ModelAndView();
mv.addObject("msg","姓名必须是zs");
mv.addObject("ex", ex);
mv.setViewName("nameError");
return mv;
}
@ExceptionHandler(value = AgeException.class)
public ModelAndView doAgeException(Exception ex){
// 通过形参获取异常信息
// 异常发生时的处理逻辑
// 1. 需要把异常记录下来, 记录到数据库, 日志文件
// 记录日志发生的时间,哪个方法发生的,异常错误内容
// 2. 发送通知,把一场信息通过邮件等等
// 3. 给用户提示
ModelAndView mv = new ModelAndView();
mv.addObject("msg","年龄不能大于80");
mv.addObject("ex", ex);
mv.setViewName("ageError");
return mv;
}
// 处理其他异常 NameException ,age 以外的异常
// 不加value时, 不是以上两种时 , 由此方法执行
@ExceptionHandler
public ModelAndView doOtherException(Exception ex){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","其他异常");
mv.addObject("ex", ex);
mv.setViewName("defaultError");
return mv;
}
}
拦截器
- 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。
- 拦截器和过滤器类似,功能方向侧重点不同,过滤器是用来过滤请求参数,设置编码集等工作。
拦截器是拦截用户请求, 做请求做判断处理的 - 拦截器是全局的,可以对多个Controller做拦截
一个项目中可以有0个或者多个拦截器,他们一起拦截用户的请求。拦截器常用在:用户登录处理,权限检查,记录日志。 - 拦截器的使用步骤:
- 定义类实现HandlerInterceptor接口
实现接口中的三个方法- 在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。
组件扫描器扫描@Controller注解,声明拦截器并指定拦截的请求uri地址
-
拦截器执行时间
在请求处理之前,也就是controller类中的方法执行之前先被拦截。
在控制器方法执行之后也会执行拦截器
在请求处理完成后也会执行拦截器
- 拦截器类
// 拦截器类 , 拦截用户请求。
public class MyHandlerInterceptor implements HandlerInterceptor {
Long bigtime ;
Long etime ;
/**
* preHandle:预处理方法
* 整个项目的入口
* true,false 表示是否通过
* Object handler: 被拦截的控制器对象
* 返回的boolean
* 特点在: 方法在控制器MyController的dosome之前先执行的
* 在这个方法中可以获取请求信息,验证请求是否符合要求。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
bigtime = System.currentTimeMillis();
System.out.println("先处理方法");
// request.getRequestDispatcher("/tips.jsp").forward(request,response);
return true;
}
/**
* modelAndView : 处理器方法的返回值
* 特点:
* 1. 在处理器方法之后执行的。
* 2. 能够获取处理器方法的返回值ModelAndView
* 3. 主要是可以对原来的执行结果做二次修正
*
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
etime = System.currentTimeMillis();
System.out.println("postHandler");
System.out.println(etime - bigtime);
// 对原来的结果进行调整
if(mv != null){
mv.addObject("mydate", new Date());
mv.setViewName("other");
}
}
/**
*
* exL程序中发生的异常
*
* 特点:
* 在请求处理完成后执行的,框架中规定当你的视图处理完成后,对视图执行了forward
* 一般做资源回收工作的,程序请求过程中创建了一些对象, 在这里创建了一些对象,在理可以先删除,把占用的内存回收
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("after");
}
}
- springmvc配置文件
-
一个拦截器处理过程
- 多个拦截器
配置文件中先声明先执行, 框架中保存多个拦截器是ArrayList, 按照声明顺序放入ArrayList中
执行顺序 preHandler1 --> preHandler2 ---> controller犯法---> postHandler2 --- > postHandler1 ----> after2 ----> after1
-
拦截器执行链
拦截器和过滤器的区别
- 过滤器是servlet中的对象, 拦截器是框架中的对象。
- 过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor
- 过滤器是用来设置request,response参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能阶段请求。
- 过滤器是在拦截器之前先执行的。
- 过滤器是tomcat抚慰群殴创建的对象。
拦截器是springmvc容器中创建的对象- 过滤器是一个执行时间点, 拦截器三个
- 过滤器可以处理jsp,js,html
过滤器是侧重拦截对Controller的对象,如果你的请求不能被DispathcherServlet接受。- 拦截器拦截普通类方法执行,过滤器过滤servlet请求响应。
拦截器实现登录验证
步骤
- 创建maven
- 修改web.xml 注册中央调度器
- 创建jsp发起请求
- 创建controller处理请求
- 创建结果show.jsp
- 创建login.jsp,模拟登陆(把用户信息放到session)
创建jsp,loginout.jsp模拟退出(从session中删除) - 创建拦截器,从session中获取用户登录数据,验证能否访问系统。
- 创建一个验证的jsp,如果验证视图,给出提示
- 创建springmvc配置文件
组件扫描器, 声明拦截器。
springmvc执行流程
- 用户发起请求
- DispatcherServlet 接收请求some.do, 把请求转交给处理器映射器。
- 框架把找到的处理器对象放到一个叫处理器对象的处理器执行链的类保存。
HandlerExecutionChain: 保存着 处理器对象(controller), 项目中所有拦截器对象 - HandlerExecutionChain返回个中央调度器,中央调度器把HandlerExecutionChain交给处理器适配器(HandlerAdapter), 处理器适配器执行放法,然后返回视图给中央调度器
- 中央调度器在将视图交给视图解析器(InternalResourceViewResolver),
实现了ViewResolver接口,
视图解析器作用: 组成视图完整路径,使用前缀后缀,并创建view对象。返回给中央调度器 - DispatcherServlet把view对象获取到后,调用view方法,把model数据放大request作用域中,执行对象视图的forward,请求结束。
处理器映射器(应该用RequestMappingHandlerMapping)
作用:处理器映射器: springmvc框架中的一种对象, 框架把实现了HandlerMapping接口的类叫做映射器(多个)。
根据请求,从springmvc容器对象中获取处理器对象。
完结。。。。。。。