Springmvc中的转发重定向和拦截器的示例
本文介绍了Springmvc中的转发重定向和拦截器的示例,分享给大家,具体如下: 可变参数在设计方法时,使用 在实现方法体时,可变参数是作为数组来处理 public class Test{ public static void main(String[] args){ System.out.println(Test.sum(1,2,3)); System.out.println(Test.sum(1,3,4,54)); } public static int sum(int... numbers){ int sum=0; for(int i=0;i<numbers.length;i++){ sum+=numbers[i]; } return sum; } } 注意:每个方法中,最多只允许存在1个可变参数,并且,如果存在 可变参数,那么必须是最后一个参数 转发和重定向 在控制器内部处理请求的方法中,默认返回字符串时的处理方式是 转发 ,转发的值是 view 组件的名称,比如 return "login" ,实质上会根据视图解析器( ViewResolver )得到最终负责显示的页面,而通过 return redirect:路径 这样的语法表示重定向,在 redirect: 右侧的内容是路径,这个路径通常使用相对的路径,是以当前客户端的地址栏中的路径为标准进行参考,例如当前的地址为: http://localhost:8080/Project/user/reg.do ,然后 return "redirect:login.do",则会重定向到 http://localhost:8080/Project/user/login.do,如果 return "redirect:/main/index.do" 或者 return "redirect:../main/index.do" ,则会重定向到 http://localhost:8080/Project/main/index.do forward: 默认的方式,但是也是可以使用 return "forward:login" redirect: 重定向 : return "redirect:login.do" 实例 @RequestMapping(value="/handle_reg.do",method=RequestMethod.POST) public String handleReg(User user,ModelMap map){ try { userService.reg(user); System.out.println("注册成功!"); return "redirect:login.do"; //重定向到login.do这个控制方法,login.do对应的就是转发到login.jsp } catch (UsernameConflictException e) { System.out.println(e.getMessage()); map.put("errorMessage",e.getMessage()); return "error"; } } @RequestMapping(value="login.do") public String handleLogin(){ return "login"; } 拦截器 基本概念
使用拦截器 自定义拦截器类 创建一个拦截类( DemoInterceptor ),实现 HandlerInterceptor 接口 public class DemoInterceptorimplements HandlerInterceptor{ /** * 处理器执行之前调用 * @param request HttpServletRequest对象,可以获取请求参数等等 * @param response HttpServletResponse对象 * @param Handler 拦截器的Controller对象 * @return 如果返回false,就会中断处理流程,不会处理后续的拦截器和Controller。如果返回true,则会执行后续的拦截器和处理器 */ public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception { System.out.println("DemoInterceptor的PreHandler执行"); return true; } /** * 处理器执行之后调用,跳转到指定视图之前调用 * @param request HttpServletRequest对象 * @param response HttpServletResponse对象 * @param Handler 拦截器的Controller对象 * @param modelAndView ModelAndView对象,其中存放的是处理结果和视图的信息 */ public void postHandle(HttpServletRequest request,Object handler,ModelAndView modelAndView) throws Exception { /** * 1. 可以自己设计逻辑,例如某些情况下返回false,返回true * 2. 返回true表示执行后续的处理器和拦截器,返回false会中断处理流程 */ System.out.println("handler:"+handler); System.out.println("DemoInterceptor的PostHandler执行"); //设置视图的名称,那么执行完成之后就会条跳转到index.jsp页面 //modelAndView.setViewName("index"); } /** * 请求处理完成之后调用 */ public void afterCompletion(HttpServletRequest request,Exception ex) throws Exception { System.out.println("DemoInterceptor的afterCompletion执行"); } } 在springmvc的配置文件中配置
配置 必须按照上面的顺序配置,否则将会报错 <!-- 配置拦截器,其中可以配置多个拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 配置拦截器的拦截路径,拦截/user下的全部处理器方法映射 比如:http://localhost:8080/Springmvc/user/login.do这个请求就会被拦截 --> <mvc:mappingpath="/user/*"/> <!-- 配置不被该拦截器拦截器的controller方法,这个是可选配置 比如:http://localhost:8080/Springmvc/user/index.do将不会被拦截器 --> <mvc:exclude-mappingpath="/user/index.do"/> <mvc:exclude-mappingpath="/user/login.do"/> <!-- 配置拦截器的bean,指定的是全类名 --> <beanclass="cn.tedu.spring.interceptor.DemoInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> 其中实现的方法 public boolean preHandle(HttpServletRequest request,Object handler)
public void postHandle(HttpServletRequest request,ModelAndView modelAndView)
public void afterCompletion(HttpServletRequest request,Exception ex)
演示登录检查
自定义拦截器(LoginInterceptor) 具体流程在 prehandler 方法中写的很清楚 public class LoginInterceptorimplements HandlerInterceptor{ /* * 在处理器执行之前调用(non-Javadoc) * 1. 获取session * 2. 读取session中的uid的值 * 如果为null,表示没有登录,那么直接重定向到登录界面,同时返回false,不需要执行后面的流程了 * 如果不为null,表示已经登录了,那么直接返回true,继续执行后面的拦截器或者处理器 */ public boolean preHandle(HttpServletRequest request,Object handler) throws Exception { HttpSession session=request.getSession(); //获取session Object uid=session.getAttribute("uid"); //读取session中的对象 //如果uid存在,那么即可登录完成 if (uid!=null) { return true; //返回true,登录成功就需要执行后续的流程 } response.sendRedirect(request.getContextPath()+"/user/login.do"); //重定向到登录界面 return false; //返回false,后面的流程也不用执行了,直接中断 } public void postHandle(HttpServletRequest request,ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request,Exception ex) throws Exception { } } springmvc中配置拦截器 由于这里只是跳转到用户中心需要验证登录,那么只是匹配了 user_center.do <!-- 配置拦截器,其中可以配置多个拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mappingpath="/user/user_center.do"/> <beanclass="cn.tedu.spring.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> 多个拦截器的执行顺序 根据在 springmvc 配置文件中配置的顺序执行,即是在 <mvc:interceptors> 下配置的拦截器的顺序,如果对同一个路径进行了拦截器,那么先配置的先拦截 拦截器和过滤器的区别(主要的区别)
总结 当多种请求都需要做相同或者极为相似的任务时,可以使用拦截器 开发好拦截器,那么需要在 springmvc 的配置文件中配置 在 <mvc:interceptors> 可以有如果若干个 <mvc:interceptor>,即是配置若干个拦截器,配置的多个拦截器将会形成 拦截器链 ,如果配置多个拦截器对同一个路径都会拦截,那么会按照配置的节点顺序执行。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |