目录
五、响应数据与结果视图
1、返回值分类
2、springmvc的请求转发和重定向
六、异常处理
1、处理思路
2、自定义异常处理器
七、springmvc中的拦截器
1、拦截器概述
2、自定义拦截器步骤
五、响应数据与结果视图
1、返回值分类
返回String:Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
返回值是void:如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。默认会跳转到@RequestMapping(value="/initUpdate") initUpdate的页面。可以使用请求转发或者重定向跳转到指定的页面
返回值是ModelAndView对象:ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
2、springmvc的请求转发和重定向
forward请求转发
@RequestMapping("/save4.do")public String save4(){System.out.println("执行了...");return "forward:/pages/suc.jsp";}
redirect重定向
@RequestMapping("/save5.do")public String save5(){System.out.println("执行了...");return "redirect:/pages/suc.jsp";}
六、异常处理
1、处理思路
Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。
2、自定义异常处理器
public class SysExceptionResolver implements HandlerExceptionResolver {
/*** 程序出现了异常,调用异常处理器中的方法* @param o* @param e* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {// 在控制台打印异常的信息e.printStackTrace();// 做强转SysException exception = null;// 判断if(e instanceof SysException){exception = (SysException)e;}else{exception = new SysException("系统正在维护,请联系管理员");}
// 存入异常提示信息ModelAndView mv = new ModelAndView();mv.addObject("errorMsg",e.getMessage());// 设置跳转的页面mv.setViewName("error");return mv;}
}
七、springmvc中的拦截器
- 底层实现:过滤器是基于函数回调的,而拦截器是基于Java的反射机制(动态代理)实现的。
1、拦截器概述
- SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
- 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
- 拦截器和过滤器的功能比较类似,有区别
- 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
- 拦截器是SpringMVC框架独有的。
- 过滤器配置了/*,可以拦截任何资源。
- 拦截器只会对控制器中的方法进行拦截。
- 拦截器也是AOP思想的一种实现方式
- 想要自定义拦截器,需要实现HandlerInterceptor接口。
2、自定义拦截器步骤
创建类,创建拦截器类 实现HandlerInterceptor接口,重写需要的方法,修改配置信息在springmvc.xml中配置拦截器类
拦截器类
public class MyInterceptor2 implements HandlerInterceptor{
/*** 拦截controller中方法。放行了,执行controller中方法。* return true 方向* return false 拦截* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器preHandle方法执行了...");// 手动跳转页面// request.getRequestDispatcher("/index.jsp").forward(request,response);// 拦截,不放行//return false;// 放行return true;}
}
配置信息
<!--配置拦截器们--><mvc:interceptors><!--配置拦截器--><mvc:interceptor><!--该拦截器拦截哪些资源--><mvc:mapping path="/dept/**"/><!--哪些资源不想拦截<mvc:exclude-mapping path="" />--><!--拦截器对象--><bean class="com.qcbyjy.demo4.MyInterceptor2" /></mvc:interceptor></mvc:interceptors>
3、HandlerInterceptor接口中的方法
- preHandle方法是controller方法执行前拦截的方法
- 可以使用request或者response跳转到指定的页面
- return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
- return false不放行,不会执行controller中的方法。
- postHandle是controller方法执行后执行的方法,在JSP视图执行前。
- 可以使用request或者response跳转到指定的页面
- 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
- postHandle方法是在JSP执行后执行
- request或者response不能再跳转页面了
4、配置多个拦截器
<!--配置拦截器们--><mvc:interceptors><!--配置拦截器--><mvc:interceptor><!--该拦截器拦截哪些资源--><mvc:mapping path="/dept/**"/><!--哪些资源不想拦截<mvc:exclude-mapping path="" />--><!--拦截器对象--><bean class="com.qcbyjy.demo4.MyInterceptor2" /></mvc:interceptor>
<!--配置拦截器--><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.qcbyjy.demo4.MyInterceptor3" /></mvc:interceptor></mvc:interceptors>