`
86asm
  • 浏览: 199813 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

spring-mvc入门(三):映射处理器(下)

阅读更多

3.实例: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中增加如下配置:

<bean id="simpleUrlHandlerMapping"		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 为映射处理器引入拦截器bean -->
		<property name="interceptors">
			<list>
				<ref bean="workTimeInterceptor" />
			</list>
		</property>
		<property name="mappings">
			<props>
				<prop key="/op/*/login.do">userController</prop>
			</props>
		</property>
	</bean>

	<bean id="userController" class="com.asm.UserController">
		<property name="commandClass" value="com.asm.User"/>
	</bean>

	<!-- 拦截器bean -->
	<bean id="workTimeInterceptor"
		class="com.asm.LoginTimeInterceptor">
		<property name="startTime" value="6" />
		<property name="endTime" value="18" />
	</bean>

 

说明:(1)通过前面实例我们可以知道,SimpleController这样的后端控制器必须绑定一个commandClass对象,在这里我们通过配置文件<property name="commandClass" value="com.asm.User"/>绑定。
2
<prop key="/op/*/login.do">userController</prop>配置说明只要访问是以op开头,中间*可以是任意字符,并以login.do结尾的请求,便能访问到userController 控制器。

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

<property name="mappings">

       <value>

           /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.iteye.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>

    登录成功!欢迎来到后台管理页面

</body>

index.jsp代码:

  <form action="<%=request.getContextPath()%>/op/luanXie/login.do" method="post">

    用户名:<input type="text" name="username"><br/>

    密 码:<input type="password" name="password"><br/>

    <input type="submit" value="登录">

  </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)执行后,得到如下打印结果,通过打印结果我们知道它的一个大致执行过程。

执行preHandle方法-->01

formBackingObject方法执行-->01

initBinder方法执行-->02

onBind方法执行-->03

onBindAndValidate方法执行-->04

调用逻辑层,处理表单

Admin----123456

执行postHandle方法-->02

执行afterCompletion方法-->03

1
5
分享到:
评论

相关推荐

    Spring Web MVC入门教程

    第一章:Spring Web MVC入门 包括:是什么、能干什么、有什么、各个组成部分的功能、HelloWorld等 第二章:理解DispatcherServlet 包括:功能、配置、上下文关系、初始化顺序等 第三章:注解式控制器开发详解 ...

    Spring MVC 入门实例

    如果你手上有一本《Spring in Action》, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用...

    Spring MVC+MyBatis开发从入门到项目实战

    第3篇是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和拦截...

    springmvc demo

    Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发...

    spring security 参考手册中文版

    5.1.3使用Spring MVC的AbstractSecurityWebApplicationInitializer 32 5.2 HttpSecurity 32 5.3 Java配置和表单登录 34 5.4授权请求 35 5.5处理注销 36 5.5.1 LogoutHandler 37 5.5.2 LogoutSuccessHandler 37 5.5.3...

    SPRING入门

    应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)...

    SpringMVC MyBatis项目实战 入门

    第三部分是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和...

    SpringMVC教程

    第二章 Spring MVC入门 .pdf 第三章 DispatcherServlet详解.pdf 第四章 Controller接口控制器详解(1).pdf 第四章 Controller接口控制器详解(2).pdf 第四章 Controller接口控制器详解(3).pdf 第四章 Controller...

    跟我学SpringMVC 教程

    第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller接口控制器详解(2) 第四章 Controller接口控制器详解(3) 第四章 Controller接口控制器详解...

    Spring攻略(第二版 中文高清版).part1

    14.1 用Spring Portlet MVC开发一个简单的Portlet 544 14.1.1 问题 544 14.1.2 解决方案 545 14.1.3 工作原理 546 14.2 将Portlet请求映射到处理程序 553 14.2.1 问题 553 14.2.2 解决方案 553 14.2.3...

    跟我学SpringMVC

    第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller接口控制器详解(2) 第四章 Controller接口控制器详解(3) 第四章 Controller接口控制器详解(4) ...

    Spring攻略(第二版 中文高清版).part2

    14.1 用Spring Portlet MVC开发一个简单的Portlet 544 14.1.1 问题 544 14.1.2 解决方案 545 14.1.3 工作原理 546 14.2 将Portlet请求映射到处理程序 553 14.2.1 问题 553 14.2.2 解决方案 553 14.2.3...

    springmvc深入浅出(备java基础,javaee课程,struts同类)

    Spring web mvc架构、springmvc入门程序、非注解处理器映射器和适配器、注解开发处理器映射器和适配器、springmvc整合Mybatis、RequestMapping、Controller方法返回值、springmvc与struts2区别、springmvc上传图片、...

    JAVA上百实例源码以及开源项目源代码

    创建发送者和映射消息。发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器  Tcp服务端与客户端的...

    JAVA上百实例源码以及开源项目

    创建发送者和映射消息。发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器  Tcp服务端与客户端的...

Global site tag (gtag.js) - Google Analytics