1. 非注解方式

1.1 处理器适配器

  上一节中使用的处理器适配器是:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter。即: 
 
  SimpleControllerHandlerAdapter适配器能执行实现了Controller接口的Handler,所以我们所写的Handler需要实现Controller接口。 
  除了这个适配器外,还有另一个适配器,叫org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter。即可以配置: 
 
  HttpRequestHandlerAdapter适配器能执行实现了HttpRequestHandler接口的Handler,所以我们所写的Handler需要实现HttpRequestHandler接口,这跟实现Controller接口稍微有点不同,比如我们写一个Handler:

public class ItemsController2 implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //实际中是调用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);

        //设置模型数据
        request.setAttribute("itemsList", itemsList);

        //设置转发的视图
        request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);

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

  前面获取数据都是一模一样的,后面转到视图部分和实现Controller接口是不同的,实现HttpRequestHandler接口的话,最后这里处理和原来的servlet是一样的,往request域中存入数据,然后跳转到新的jsp视图页面。不过这种方式还可以修改response,设置响应的数据格式等。 
  不管是用那个适配器,一个相同点就是:每个Handler中只能有一个方法,因为要继承Controller或者HttpRequestHandler,就要重写相对应的那个方法,在那个方法中处理逻辑。也就是说一个Handler中不能有两个方法或两个以上的来处理不同的逻辑,这是弊端,但是也有它的好处,限定了程序员的编程,比较规范。 
  这两个适配器可以同时使用,我测试了一下,不会冲突,我配了两个适配器,写了两个Handler,分别去实现Controller和HttpRequestHandler接口,都可以被执行。

1.2 处理器映射器

  上一节中使用的映射器是:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping。即: 
 
  这个映射器根据名字也可以看得出,是根据bean的name作为url进行查找,所以配置Handler的bean的时候,要配置一下name属性,设置为要请求的url即可正确映射。 
  还有一种处理器映射器叫简单映射器:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping。它的映射方式是直接根据url来的,如下: 
 
  这种可以直接配url,然后对应的url指定一个Handler,使用的是该Handler对应bean的id,所以只要在bean中配好id,然后将url和这个id对应上即可。 
  经测试,这两个映射器也可以一起使用,互不冲突,匹配到哪个就用哪个。

2. 注解方式

2.1 处理器适配器和映射器

  在spring3.1之前使用:

注解映射器:org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 
注解适配器:org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

  在spring3.1之后使用:

注解映射器:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 
注解适配器:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

  毫无疑问,现在都已经到了版本4以上了,肯定有后者了,如果使用了注解方式的适配器和映射器,就不需要前面那些非注解的适配器和映射器了,所以只需要两行代码即可: 
 
  我们可以看到,上面还配了个Handler,那么url的映射怎么办?我怎么知道对应到哪个Handler呢?不着急,这些全交给注解!下面来写这个Handler:

@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的setAttribute,在jsp页面中通过itemsList取数据
        modelAndView.addObject("itemsList", itemsList);

        // 指定视图
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

        return modelAndView;
    }

    @RequestMapping("/queryItems2")
    public ModelAndView queryItems2() throws Exception {

        // 实际中是调用service查找数据库,查询商品列表,这里直接使用静态数据来模拟了
        List<Items> itemsList = new ArrayList<Items>();
        // 向list中填充静态数据
        Items items_1 = new Items();
        items_1.setName("联想笔记本2");
        items_1.setPrice(6000f);
        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");

        Items items_2 = new Items();
        items_2.setName("苹果手机2");
        items_2.setPrice(5000f);
        items_2.setDetail("iPhone6苹果手机!");

        itemsList.add(items_1);
        itemsList.add(items_2);

        // 返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();

        // 相当于request的setAttribute,在jsp页面中通过itemsList取数据
        modelAndView.addObject("itemsList", itemsList);

        // 指定视图
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

        return modelAndView;
    }
}

  从上面的代码中可以看出,首先,我一个Handler中可以写多个方法了,现在是两个,逻辑一模一样,就是item的名字稍微变了一下好用来测试。在类的上面加上@Controller注解,可以指定bean的名字,也可以不指定,默认为类名首字母小写。然后url映射交给@RequestMapping类处理,可以指定url,一个url对应一个方法。

  这样就很清晰了,前台传了个url进来,映射器根据这个url找到Handler,然后根据Handler选择一个适配器去执行,这里全部用的都是注解,这样就将url和这个Handler连到一起了,也把url和具体的处理方法连到一起了,由此可见,使用注解的开发方式比较方便。开发中常用的是注解的方式。

2.2 继续优化注解

  使用注解要注意一个问题,就是注解适配器和映射器必须配对使用,也就是说,不能一个用注解,一个用非注解。要用一起用,要么都不用。其实在springmvc中还有更加简便的注解: 
 
  只要这一个注解即可,适配器和映射器就可以省略不配了。另外,如果Controller很多的话,我们还得针对这些Controller配好多个bean,也不方便,所以springmvc中也提供了扫描包的方式来配置,如下: 
 
  所以到最后,使用注解的方法,适配器、映射器、Controller等的配置加在一起就两行代码!搞定!当然,视图解析器还是和上一节一样,自己配一下即可。 
  到这就基本总结完了springmvc中使用非注解方式和注解方式的适配器和映射器了,很明显,开发中我们使用最后面的那个注解配置,非常方便。

SpringMVC中注解和非注解方式下的映射器和适配器总结的更多相关文章

  1. 【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结

    从上一篇的springmvc入门中已经看到,springmvc.xml中的配置了映射器和适配器,是使用非注解的方式来配置的,这是非注解方式的一种,这里再复习一下: 1. 非注解方式 1.1 处理器适配 ...

  2. springMVC学习笔记(二)-----注解和非注解入门小程序

    最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了.终于在上周五上线了,可以轻松几天了.闲话不扯淡了,继续谈谈springMvc的学习. 现在,用到SpringMvc的大部分使用全注解配置 ...

  3. SpringMVC学习记录二——非注解和注解的处理器映射器和适配器

    3      非注解的处理器映射器和适配器 3.1      非注解的处理器映射器 处理器映射器: org.springframework.web.servlet.handler.BeanNameUr ...

  4. SpringMVC由浅入深day01_3非注解的处理器映射器和适配器

     3 非注解的处理器映射器和适配器 3.1 非注解的处理器映射器 3.1.1 HandlerMapping处理器映射器 HandlerMapping 负责根据request请求找到对应的Handler ...

  5. 【SpringMVC框架】非注解的处理器映射器和适配器

    参考来源:     http://blog.csdn.net/acmman/article/details/46968939 处理器映射器就是根据URL来找Handler,处理器适配器就是按照它要求的 ...

  6. springmvc03 非注解和注解处理器映射器和适配器

    1其它非注解处理器映射器和适配器 .1BeanNameUrlHandlerMapping(映射器) 根据请求url(XXXX.action)匹配spring容器bean的 name 找到对应的bean ...

  7. SpringMVC由浅入深day01_5注解的处理器映射器和适配器

    5 注解的处理器映射器和适配器 在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandle ...

  8. springmvc 源码分析(三) -- 自定义处理器映射器和自定义处理器适配器,以及自定义参数解析器 和错误跳转自定页面

    测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git DispatcherServlet ...

  9. SpringMVC的映射器,适配器,控制器

    一.各司其职   (1)HandlerMapping映射器 根据客户端请求的url,找到处理本次请求的处理器,即将请求的路径和controller关联起来 (2)HandlerAdapter适配器 对 ...

随机推荐

  1. w3cmark前端精彩博文周报 10.13-10.19

    w3cmark推出每周精选前端博文推荐,通过阅读别人的代码,学习别人的经验,提升自己的水平.欢迎关注 @前端笔记网 微博.其实如果是关注我们微博的朋友都对下面的文章熟悉,因为我们会一旦发现有价值的.精 ...

  2. Android传感器编程带实例

    看了程序人生 网站的 编程高手的编程感悟 深有感触,好像也是一个android 程序员写的,推荐大家也看看.话不多说,还是言归正传吧. 一.前言 我很喜欢电脑,可是笔记本还是太大,笔记本电脑再小还是要 ...

  3. Android 滑动效果进阶篇(五)—— 3D旋转

    前面介绍了利用Android自带的控件,进行滑动翻页制作效果,现在我们通过代码实现一些滑动翻页的动画效果. Animation实现动画有两个方式:帧动画(frame-by-frame animatio ...

  4. JAVA线程池简介

    一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.uti ...

  5. How to Display Image In Picturebox in VC++ from Iplimage and Mat

    Introduction This tip/trick will be useful to OpenCV programmers, who wish to use Windows Form appli ...

  6. 图片onerror(转)

    <script type="text/javascript"> <!– function nofind(){ var img=event.srcElement; ...

  7. graylog2+syslog-ng+mongodb构建集中管理日志服务器 --转载

    原文地址:http://blog.chinaunix.net/uid-11065483-id-3654882.html 由于公司内需要监控QQ的上下线记录,原本使用了分光+Panabit+Splunk ...

  8. cocos2d-x中使用Http

    一.如何使用 //发送接口 void CmdHelper::postRequest(const char* cmdTag, const char* url, const char* postData, ...

  9. Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值

    package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...

  10. Org-mode 任务添加提醒

    org-mode中的约会日程有提醒功能,这样设置就行: ;; ;;; 提醒 ;; (require 'appt) ;; (appt-activate t);启用约会提醒 ;; (setq appt-d ...