springmvc(2)处理器设配器和映射器

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

一.处理器映射器

 1.BeanNameUrlHandlerMapping

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

Handler的实现:

<!-- 配置Handler -->
<bean name="/queryItems.action" class="com.MrChengs.controller.ItemsController"></bean>

 

 2.SimpleUrlHandlerMapping

<!-- 处理器映射器2 -->
<bean id="itemsController" class="com.MrChengs.controller.ItemsController"></bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/queryItems1.action">itemsController</prop> <prop key="/queryItems2.action">itemsController</prop> </props> </property> </bean>

  

此时可以访问一下两个都可以得到结果

queryItems1.action
queryItems2.action

 注意:   多个映射器可以并存,前端控制器判断能让那些映射器映射,就让正确的映射器处理。

 二.处理器适配器

 1.SimpleControllerHandlerAdapter

<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

注意: 要求是编写的Handler必须实现Controller接口

public class ItemsController implements Controller {
...
}

  

2.HttpRequestHandlerAdapter

<!-- 处理器适配器2 -->
<!-- 要求编写的Handler实现 HttpRequestHandler接口。 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

  

 看源码:

 

可以看出这个类需要实现 HttpRequestHandler 接口

public class ItemsController2 implements HttpRequestHandler {
     @Override
     public void handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
           
           List<Items> itemsList = new ArrayList<Items>();
           //向list中填充静态数据
           
           Items items_1 = new Items();
           items_1.setName("手机");
           items_1.setPrice(6000f);
           items_1.setDetail("这是一个新的手机");
//设置模型数据
           arg0.setAttribute("itemsList", itemsList);
           
           //设置转发视图
           arg0.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(arg0, arg1);
     }
}

 在springmvc.xml

<!-- 处理器适配器2 -->
<!-- 要求编写的Handler实现 HttpRequestHandler接口。 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean id="itemsController2" class="com.MrChengs.controller.ItemsController2"></bean>


<bean  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
     <property name="mappings">
           <props>
                <prop key="/queryItems1.action">itemsController</prop>
                <prop key="/queryItems2.action">itemsController</prop>
                <prop key="/queryItems3.action">itemsController2</prop>
           </props>
     </property>
</bean>

访问上面红色的地址即可得到正确的答案!!

使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");

关于DispatcherServlet.properties

在springmvc中去除这些代码依然可以执行

<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 处理器适配器2 -->
<!-- 要求编写的Handler实现 HttpRequestHandler接口。 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

# 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
在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注解适配器。

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

 1.配置注解映射器/适配器

 在springmvc.xml文件

<!-- 注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!--
mvc:annotation-driven:
代替上面注解映射器&注解适配器的配置
其默认加载很多的参数绑定方法
实际开发使用mvc:annotation-driven
-->
<mvc:annotation-driven></mvc:annotation-driven>

2.Handler

@Controller
写在类的上面,标注其是一个注解
@Controller
public class ItemsController3{
     //商品查询
     @RequestMapping("/queryItemsByMapping")
     public ModelAndView queryItems() throws Exception{
           List<Items> itemsList = new ArrayList<Items>();
           //向list中填充静态数据
           
           Items items_1 = new Items();
           items_1.setName("手机");
           items_1.setPrice(6000f);
           items_1.setDetail("这是一个手机");

           itemsList.add(items_1);

           ModelAndView modelAndView = new ModelAndView();
           //相当于request的setAttribute
           modelAndView.addObject("itemsList", itemsList);
           
           //指定视图
           modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
           return modelAndView;
     }
}
//@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
//一般建议将url和方法写成一样

3.在容器中加载Handler

<!-- 对于注解的Handler可以单独配置 -->
<!-- 建议使用组建扫描...... -->
<context:component-scan base-package="com.MrChengs"></context:component-scan>

测试时访问@RequestMapping("/queryItemsByMapping")中的queryItemsByMapping

源码追踪一探究竟:

小结:

前端控制器配置:
第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析
第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需
      要配置不让DispatcherServlet进行解析使用此种方式可以实现 RESTful风格的url
<mvc:annotation-driven></mvc:annotation-driven>可以代替下边的配置:
 
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> 
实际开实际开发使用:mvc:annotation-driven

视图解析器配置前缀和后缀:

<!-- 视图显示器 -->
<!-- 解析jsp视图 -->
<!-- 默认使用jstl的包 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="prefix" value="/WEB-INF/jsp/items"></property>
     <property name="suffix" value=".jsp"></property>
</bean>
@Controller
public class ItemsController3{

     @RequestMapping("/queryItemsByMapping")
     public ModelAndView queryItems() throws Exception{
    
...... //指定视图 modelAndView.setViewName("/itemsList"); return modelAndView; } }

  

到这里基本的就结束了...

原文地址:https://www.cnblogs.com/Mrchengs/p/9940491.html