博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springmvc入门之映射处理器(二)
阅读量:7102 次
发布时间:2019-06-28

本文共 4864 字,大约阅读时间需要 16 分钟。

实例:SimpleUrlHandlerMapping

步骤一:建立后端控制器UserContrller.java.代码如下:

package com.asm;     //...省略导入的相关类          public class UserController extends SimpleFormController {      protected ModelAndView processFormSubmission(HttpServletRequest request, HttpServletResponse response,             Object command, BindException errors) throws Exception {         System.out.println("调用逻辑层,处理表单");         ModelAndView mav = new ModelAndView("loginSuc");         return mav;     }      }    复制代码复制代码

步骤二:在spmvc-servlet.xml中增加如下配置:

list> property>
userControllerprop> props> property> bean>
bean>
bean> 复制代码复制代码

说明:(1)通过前面实例我们可以知道,SimpleController这样的后端控制器必须绑定一个commandClass对象,在这里我们通过配置文件 绑定。

(2) userController配置说明只要访问是以op开头,中间*可以是任意字符,并以login.do结尾的请求,便能访问到userController 控制器。

(3)SimpleUrlHandlerMapping是一个更强大的映射处理器,它除了支持上面 的这种配置,还支持Ant风格的路径匹配。另外也可以进行如下形式的配置:

/op/*/login.do=userController value> 复制代码复制代码

property> (4)拦截器:为了为某些特殊请求提供特殊功能,spring为映射处理器提供了拦截器支持。它的配置文件很简单:一是把拦截器类纳入spring容器管理,二是在映射处理器引入配置的拦截器bean。

步骤三:编写拦截器LoginTimeInterceptor.java,主要代码如下:

package com.asm;      //...省略导入的相关类     public class LoginTimeInterceptor extends HandlerInterceptorAdapter {     private int startTime;     private int endTime;             public void setStartTime(int startTime) {          this.startTime = startTime;     }     public void setEndTime(int endTime) {         this.endTime = endTime;     }     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,             Exception ex) throws Exception {         System.out.println("执行afterCompletion方法-->03");         super.afterCompletion(request, response, handler, ex);     }     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,             ModelAndView modelAndView) throws Exception {         System.out.println("执行postHandle方法-->02");         super.postHandle(request, response, handler, modelAndView);     }     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)             throws Exception {         System.out.println("执行preHandle方法-->01");         Calendar cal = Calendar.getInstance();         int hour = cal.get(Calendar.HOUR_OF_DAY);            if (startTime <= hour && hour < endTime) {             return true;         } else {             response.sendRedirect("http://www.javaeye.com");             return false;         }     }           }    复制代码复制代码

说明:此拦截器作用:如果用户没有在6-18点登录,则重定向到javaeye站点(1)拦截器必须HandlerInterceptorAdapter接口(2)preHandle方法在后端控制器执行前被调用,postHandle方法在后端控制器执行后被调用;afterCompletion方法在整个请求处理完成后被调用。(3) preHandle方法:返回true,映射处理器执行链将继续执行;当返回false时,DispatcherServlet处理器认为拦截器已经处理完了请求,而不继续执行执行链中的其它拦截器和处理器。它的API文档解释如下:true if the execution chain should proceed with the next interceptor or the handler itself. Else, DispatcherServlet assumes that this interceptor has already dealt with the response itself.(4)这三个方法都是相同的参数,Object handler参数可以转化成一个后端控制器对象,比如这里可以转换成UserController对象。

步骤四:完成其它相关代码的编写

User.java代码

package com.asm;     public class User {   private String username;       private String password;           //省略getter/setter方法  复制代码复制代码

}

WEB-INF/page/loginSuc.jsp,主要代码如下:

   登录成功!欢迎来到后台管理页面          body> 复制代码复制代码

index.jsp代码:

用户名:
密 码:
form> 复制代码复制代码

步骤五:访问index.jsp页面,完成测试。

分析执行过程:为了清晰体会到整个处理器执行过程,我们首先在UserController.java中增加如下代码:

protected Object formBackingObject(HttpServletRequest request) throws Exception {       System.out.println("formBackingObject方法执行-->01");       return super.formBackingObject(request);     }      protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {       System.out.println("initBinder方法执行-->02");     super.initBinder(request, binder);     }       protected void onBind(HttpServletRequest request, Object command) throws Exception {      System.out.println("onBind方法执行-->03");      super.onBind(request, command);     }        protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors)         throws Exception {     System.out.println("onBindAndValidate方法执行-->04");     super.onBindAndValidate(request, command, errors);      }    复制代码复制代码

(1)当访问…/login.do时,会首先被前端控制器DispatcherServlet拦截到,前端控制器通过查找spmvc-servlet.xml配置文件,并交给后端控制器处理。

(2)执行后,得到如下打印结果,通过打印结果我们知道它的一个大致执行过程。

更多资料欢迎球球 2042849237

执行preHandle方法-->01

formBackingObject方法执行-->01

initBinder方法执行-->02

onBind方法执行-->03

onBindAndValidate方法执行-->04

调用逻辑层,处理表单

Admin----123456

执行postHandle方法-->02

执行afterCompletion方法-->03

转载于:https://juejin.im/post/5b7d0c59518825430a46c43e

你可能感兴趣的文章
Ubuntu 16.04 U盘安装过程
查看>>
UIApplication、AppDelegate、委托
查看>>
Android实用笔记——使用GridView以表格的形式显示多张图片
查看>>
内部类使用外部类的成员属性
查看>>
基于const的重载
查看>>
虹软AI 人脸识别SDK接入 — 性能优化篇(多线程)
查看>>
Spark examples 源码解析 (Spark SQL)
查看>>
无线路由器软件开发面试-曙光
查看>>
mac os x 查看网络端口情况
查看>>
编写shell脚本处理test文件
查看>>
搭建网络ghost服务器
查看>>
MySQL集群搭建步骤详解
查看>>
什么是活动目录
查看>>
spark install
查看>>
Ubuntu 16.04 部署自己的私有 Docker Registry
查看>>
Spring和SpringMVC的关系
查看>>
Weex从入门到放弃
查看>>
64位操作系统不能安装64位虚拟机的解决办法
查看>>
怎样在log4j.xml配置文件中引入变量:小公司经验较多的我和阿里UC等大公司经验较多的Boss,一些技术交流和探讨...
查看>>
OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)...
查看>>