本节讨论非注解开发和注解开发的不同
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