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

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):

@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学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结的更多相关文章

  1. SpringMVC中注解和非注解方式下的映射器和适配器总结

    1. 非注解方式 1.1 处理器适配器 上一节中使用的处理器适配器是:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapte ...

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

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

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

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

  4. (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解

    http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...

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

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

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

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

  7. (转)SpringMVC学习(三)——SpringMVC的配置文件

    http://blog.csdn.net/yerenyuan_pku/article/details/72231527 读者阅读过SpringMVC学习(一)——SpringMVC介绍与入门这篇文章后 ...

  8. (转)SpringMVC学习(五)——SpringMVC的参数绑定

    http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...

  9. (转)SpringMVC学习(一)——SpringMVC介绍与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/72231272 SpringMVC介绍 SpringMVC是什么? SpringMVC和Stru ...

随机推荐

  1. zabbix报警邮件qq邮箱收不到的问题

    出现这样问题的根本原因是因为zabbix对中文支持不太友好,乱码导致了邮件无法正常接收. 一.解决zabbix邮件内容为附件 1.安装发送邮件的mailx 以及windows文件转unix文件的命令 ...

  2. 【转载】性能监视器(SSAS)

    使用性能监视器,您可以通过性能计数器监视 Microsoft SQL Server Analysis Services (SSAS) 实例的性能. 性能监视器是用于跟踪资源使用情况的 Microsof ...

  3. 2018 ICPC 徐州邀请赛 总结

    Day 0 上午在高铁里面,很困但是睡不着…… 中午到矿大报道. 食堂饭菜不错,有西瓜,就是有点辣. 下午热身赛,D题队友想了个假算法……GG. 评测机摸底考试正常进行. 热身赛之后精疲力尽,赶到宾馆 ...

  4. 洛谷——P1029 最大公约数和最小公倍数问题

    P1029 最大公约数和最小公倍数问题 题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1 ...

  5. Redis主从复制、哨兵模式

    1.部署主从 环境:主IP:10.0.0.15,端口6379;从IP:10.0.0.16,端口6379. 原理:基于RDB持久化的功能来实现主从复制的功能. a.linux-redis1(10.0.0 ...

  6. 【BZOJ2276】Temperature

    题面 Description The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The ...

  7. Leave It Behind and Carry On ---- 高一下期末考反思 [补档]

    背景 这个学期的前\(\frac{3}{4}\), 我都是在停课集训中度过的, 先是GDKOI, 再是北京集训, 最后是GDOI, 结果GDOI还没进day3就滚粗了. 学校的内容是考完GDOI后回学 ...

  8. Windows 8.1中WinRT的变化(二)——新增功能

    首先我们来看看现有控件中新增的功能: FlipView编程方式切换时支持平滑滚动: 在Windows8中,FlipView在用手触控翻页的时候是有动画效果的,但当我们使用键盘或代码编程翻页时,却没有这 ...

  9. sql server 存储过程中使用变量表,临时表的分析(续)

    最近,我有一朋友,对我说他的数据库中的很多存储过程,执行都是超时.让我替他看看是什么原因.我一看,原来他的存储过程中用了很多的临时表与变量表.于是我跟他说过犹不及. 在存储过程中使用临时表或变量表,使 ...

  10. linux之ssh无密码访问

    1. windows下用putty执行ssh连接vmware中的linux虚拟机 linux虚拟机的网络选择bridge模式,ifconfig 看到ip后与windows local machine之 ...