目录
五、响应数据与结果视图
1、返回值分类
返回String:Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
返回值是void:如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。默认会跳转到@RequestMapping(value="/initUpdate") initUpdate的页面。可以使用请求转发或者重定向跳转到指定的页面
返回值是ModelAndView对象:ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
2、springmvc的请求转发和重定向
forward请求转发
java
@RequestMapping("/save4.do")
public String save4(){
System.out.println("执行了...");
return "forward:/pages/suc.jsp";
}
redirect重定向
java
@RequestMapping("/save5.do")
public String save5(){
System.out.println("执行了...");
return "redirect:/pages/suc.jsp";
}
六、异常处理
1、处理思路
Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。
2、自定义异常处理器
java
public class SysExceptionResolver implements HandlerExceptionResolver {
/**
* 程序出现了异常,调用异常处理器中的方法
* @param o
* @param e
* @return
*/
@Override
public 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中配置拦截器类
拦截器类
java
public class MyInterceptor2 implements HandlerInterceptor{
/**
* 拦截controller中方法。放行了,执行controller中方法。
* return true 方向
* return false 拦截
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public 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;
}
}
配置信息
XML
<!--配置拦截器们-->
<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、配置多个拦截器
XML
<!--配置拦截器们-->
<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>