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

本节讨论非注解开发和注解开发的不同


1.1非注解的处理器映射器

处理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

另一个映射器:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

  一个是根据Bean的name作为url进行查找对应的handler,我们在配置handler的bean对象的时候还要加上name属性来以备handlermapping进行查找。

<!--简单url映射  -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<!-- 对itemsController1进行url映射,url是/queryItems1.action -->
				<prop key="/queryItems1.action">itemsController1</prop>
				<prop key="/queryItems2.action">itemsController1</prop>
				<prop key="/queryItems3.action">itemsController2</prop>
			</props>
		</property>
	</bean>

  简单url映射需要配置handler的id,这种映射可以同时指定哪些handler可以使用这种映射器,并且用属性的key规定映射的url。

  而且多个映射器可以并存,也就是说同一个handler可以使用不同的映射器方法进行映射,一般情况下输入不同映射的url所产生的页面结果都是能成功的,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。

1.2非注解的处理器适配器

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求编写的Handler实现 Controller接口。

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求编写的Handler实现 HttpRequestHandler接口。

  同样,非注解的处理器适配器也有两个,不过对于我们书写的handler要实现的接口有区别。正是因为他们实现的接口是不同,那么对应的实现方法也有不同。

public interface Controller {
	ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

public interface HttpRequestHandler {
	void handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException;
}

  首先是简单的处理器适配器,对于请求处理的方法返回类型是modelandview。
  Http请求处理器适配器则没有返回值,但是实现这种接口的handler,可以用过使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");

1.3前端控制器的默认属性dispacthersevlet.properties

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

  这里面规定了一些前端控制器的默认组件,前端控制器从springmvc-sevlet.xml和dispacthersevlet.properties文件中加载处理器映射器、处理器适配器、视图解析器等组件,如果springmvc-sevlet.xml文件中没有明确配置使用什么组件,那么就会默认加载dispacthersevlet.properties里面的。

2.1注解的处理器映射器和适配器

在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。

在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。

2.2配置注解的处理器映射器和适配器

<!--注解映射器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

<!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
	mvc:annotation-driven默认加载很多的参数绑定方法,
	比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的 
    RequestMappingHandlerMapping和RequestMappingHandlerAdapter
	实际开发时使用mvc:annotation-driven -->

<!-- <mvc:annotation-driven></mvc:annotation-driven> -->

  由于我的环境里面使用的是3.2版本spring,所以采用新版本的注解映射器和注解适配器,配置注解的处理器映射器和适配器的方法有两种,一个是直接一个Bean对象来表示,另一种是使用<mvc:annotation-driven></mvc:annotation-driven>注解驱动来加载注解

2.3开发注解的Handler

//使用Controller标识 它是一个控制器
@Controller
public class ItemsController3 {
	
	//商品查询列表
	//@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
	//一般建议将url和方法写成一样
	@RequestMapping("/queryItems")
	public ModelAndView queryItems()throws Exception{
		
		//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
		List<Items> itemsList = new ArrayList<Items>();
		//向list中填充静态数据
		
		Items items_1 = new Items();
		items_1.setName("联想笔记本");
		items_1.setPrice(6000f);
		items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
		
		Items items_2 = new Items();
		items_2.setName("苹果手机");
		items_2.setPrice(5000f);
		items_2.setDetail("iphone6苹果手机!");
		
		itemsList.add(items_1);
		itemsList.add(items_2);
		
		//返回ModelAndView
		ModelAndView modelAndView =  new ModelAndView();
		//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
		modelAndView.addObject("itemsList", itemsList);
		
		//指定视图
		modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
		
		return modelAndView;
		
}

  在这里只需要在类的前面加上一个@Controller就能表示这个类是一个处理器控制器;在返回modelandview的方法前面加上@RequestMapping("/queryItems")就能把这个方法和url进行一个映射

2.4在Spring容器中加载Handler

<!-- 对于注解的Handler可以单个配置实际开发中建议使用组件扫描 -->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->
<!-- 可以扫描controller、service、...这里让扫描controller,指定controller的包 -->
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>

  这里使用组件扫描的方式,因为我们前面已经写了 了注解的控制器了,只需要指定要扫描的包就可以了,不需要一个个的去配置Bean对象

3.1部署实施

  访问:http://localhost:8080/springmvcfirst1208/queryItems.action

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值