非注解和注解的处理器映射器、处理器适配器

在上一篇日志中我们看到,配置Spring MVC,当用户发来一个HTTP请求,前端控制器DispatcherServlet首先会去接收,然后请求处理器映射器HandlerMapping,在处理器映射器中查找可以处理该请求的Handler,得到处理器映射器返回的执行链后,前端控制器再根据执行链,与处理器适配器HandlerAdapter进行匹配,找到可以处理的Handler,最后执行相关的handler()方法来获得ModelAndView对象。从这一系列过程来看,处理器映射器和处理器适配器起到了关键的作用,它们决定了选择哪个Handler来处理数据请求。处理器映射器和处理器适配器都有两种配置方式,非注解和注解的形式,上一篇Spring MVC配置中使用的就是非注解形式,在这篇日志中我会再总结两种方式的配置。

非注解形式

非注解形式,也就是把配置信息放在了XML文件中,如把处理器映射器和适配器的信息放在Spring MVC的配置文件springmvc.xml中。

非注解的处理器映射器配置

这里使用处理器映射器SimpleUrlHandlerMapping来做示例,SimpleUrlHandlerMapping映射器可以让我们自行配置url和处理器handler之间的映射关系:

<!-- 非注解形式配置处理器映射器 -->
		<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
			<!-- url映射 -->
			<property name="mappings">
				<props>
				<!-- 将不同的url请求映射响应的Controller处理器      -->
					<prop key="/queryUsersTest1.action">userController</prop>
					<prop key="/queryUsersTest2.action">userController</prop>
					<prop key="/queryUsersTest3.action">userController2</prop>
				</props>
			</property>
		</bean>
		<!-- 配置被url映射的Handler -->
		<bean id="userController" class="com.mvc.controller.UserControllerTest" />
		<bean id="userController2" class="com.mvc.controller.UserControllerTest2" />

在Spring MVC的配置文件springmvc.xml中,配置一个名为urlMapping的映射器,里面用prop标签对配置url请求与Controller控制器的映射关系,我们可以配置不同的url映射同一个控制器,如queryUserTest1和queryUserTest2都对应userController。也可以配置不同url映射不同的控制器,如queryUserTest3对应userController2。最后声明两个Controller对应的控制器实现类。

非注解的处理器适配器配置

为了判断处理器映射器返回的执行链,在处理器适配器中是否有匹配的控制器Handler,还需要配置处理器适配器,非注解方式的处理器适配器,同样在配置文件springmvc.xml中配置:

<!-- 非注解形式配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

示例使用HttpRequestHandlerAdapter,即HTTP请求适配器,负责处理用户的HTTP请求。既然用到HTTP请求适配器,自然我们需要一个实现HttpRequestHandler接口的Handler控制器。

实现HttpRequestHandler接口控制器

public class UserControllerTest2 implements HttpRequestHandler {
	private UserService userService = new UserService();
	
	@Override
	public void handleRequest(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		// 数据模型Model,模拟获取用户信息列表
		List<User> userList = userService.queryUserList();
		// 设置数据模型
		request.setAttribute("userList", userList);
		// 设置转发视图
		request.getRequestDispatcher("/WEB-INF/jsp/users/userList.jsp").forward(request, response);
	}

实现HttpRequestHandler接口的Handler处理器中,重写的handleRequest()方法不需要返回ModelAndView对象,而是设置返回请求参数response的一些参数,如设置其数据模型和视图,直接配置在了返回请求response中。之后,我们就可以通过访问地址:

http://localhost:8080/SpringMVC__Project/queryUsersTest1.action

得到请求的数据视图。

 

注解形式

使用注解方式的处理器映射器和处理器适配器,在xml文件中代码量减少了很多,只需要在处理器实现类以及具体Handler方法中使用注解即可。在Spring MVC中的处理器映射器和适配器分别是RequestMappingHandlerMapping和RequestMappingHandlerAdapter。

注解形式的处理器映射器配置

在springmvc.xml配置文件中,使用bean标签对配置注解的处理器映射器:

<!-- 注解形式的处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

注解形式的处理器映射器会对类中用@RequestMapping标记的方法进行映射。

注解形式的处理器适配器配置

同样地,使用注解形式的处理器适配器,会把使用@RequestMapping标记的方法与处理器映射器返回的执行链进行适配,匹配则执行相应的Handler方法:

<!-- 注解形式的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

以上是注解形式的其中一种配置方式,我们还可以使用简写的方式:

<!-- 简写方式 -->
<mvc:annotation-driven></mvc:annotation-driven>

这种简写方式配置中,会自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter。

 

注解的Handler控制器实现类

上面说到,使用注解形式配置的处理器映射器和适配器,需要在具体的Handler实现类中使用注解:

// 使用注解的控制器,@Controller标识它是一个控制器
@Controller
public class annotateControllerTest {
private UserService userService = new UserService();
	
	@RequestMapping("/queryUserList")
	public ModelAndView queryUserList() {
		// 数据模型Model,模拟获取用户信息列表
		List<User> userList = userService.queryUserList();
		// 返回的ModelAndView对象
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("userList", userList);
		// 指定视图View
		modelAndView.setViewName("/WEB-INF/jsp/users/userList.jsp");
		
		// 数据处理完后,返回视图和数据
		return modelAndView;
	}

在具体的控制器实现类中,使用了@Controller注解这是一个Handler控制器类,这样该类才可以被处理器适配器查找到。然后到了具体的实现方法queryUserList()上,有一个注解信息@RequestMapping,注解括号里指定了一个url请求,也就是该url匹配的是这个Handler方法()。

     最后,要在配置文件springmvc.xml中生命这个Handler类,这样才能让处理器映射器也找到这个控制器类:

<bean class="com.mvc.controller.annotateControllerTest"></bean>
<!-- 或者使用扫描配置,对包下的所有类扫描 -->
<!-- <context:component-scan base-package="com.mvc.controller"></context:component-scan> -->

声明的方式有两种,一种是直接使用bean标签对声明该Handler类,不过不推荐这种方式,因为随着控制器类越来越多,代码量也变得越来越多,所以推荐第二种方式,配置扫描包下的控制器类。

     所有东西配置完后,就可以重启Tomcat服务器,访问地址:

http://localhost:8080/SpringMVC__Project/queryUserList.action

得到访问结果:

 

完整代码已上传GitHub:

https://github.com/justinzengtm/SSM-Framework/tree/master/SpringMVC_Project

发布了97 篇原创文章 · 获赞 71 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/justinzengTM/article/details/102287447