【SpringMVC学习03】SpringMVC中注解和非注解方式下的映射器和适配器总结
从上一篇的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中注解和非注解方式下的映射器和适配器总结的更多相关文章
- SpringMVC中注解和非注解方式下的映射器和适配器总结
1. 非注解方式 1.1 处理器适配器 上一节中使用的处理器适配器是:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapte ...
- springMVC学习笔记(二)-----注解和非注解入门小程序
最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了.终于在上周五上线了,可以轻松几天了.闲话不扯淡了,继续谈谈springMvc的学习. 现在,用到SpringMvc的大部分使用全注解配置 ...
- SpringMVC学习记录二——非注解和注解的处理器映射器和适配器
3 非注解的处理器映射器和适配器 3.1 非注解的处理器映射器 处理器映射器: org.springframework.web.servlet.handler.BeanNameUr ...
- (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解
http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...
- SpringMVC由浅入深day01_3非注解的处理器映射器和适配器
3 非注解的处理器映射器和适配器 3.1 非注解的处理器映射器 3.1.1 HandlerMapping处理器映射器 HandlerMapping 负责根据request请求找到对应的Handler ...
- 【SpringMVC框架】非注解的处理器映射器和适配器
参考来源: http://blog.csdn.net/acmman/article/details/46968939 处理器映射器就是根据URL来找Handler,处理器适配器就是按照它要求的 ...
- (转)SpringMVC学习(三)——SpringMVC的配置文件
http://blog.csdn.net/yerenyuan_pku/article/details/72231527 读者阅读过SpringMVC学习(一)——SpringMVC介绍与入门这篇文章后 ...
- (转)SpringMVC学习(五)——SpringMVC的参数绑定
http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...
- (转)SpringMVC学习(一)——SpringMVC介绍与入门
http://blog.csdn.net/yerenyuan_pku/article/details/72231272 SpringMVC介绍 SpringMVC是什么? SpringMVC和Stru ...
随机推荐
- 6.安装和配置OpenStack图片服务组件
安装和配置图片服务组件 这里是安装在控制器上 安装和配置图片服务组件 yum install –y openstack-glance python-glanceclient 编辑/etc/glance ...
- 将打开的网页以html格式下载到本地
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- UVA 11925:Generating Permutations(冒泡排序 Grade D)
VJ题目链接 题意:n个数(n<300),是一个1~n的某个排列.有两种操作:操作1把前两个数换位置,操作2把第一个数移动到最后.问给出一个排列,问通过怎样的操作,能把1,2,3,...,n变到 ...
- vagrant virtualbox VM inaccessible解决办法
vagrant无法访问的提示:Please open VirtualBox and clear out your inaccessible virtual machines or find a way ...
- windows7_64位安装sql_server_2000成功
对于4合一的版本来说只要找到安装包里的 STANDARD.PERSONAL.ENTERPRISE.DEVELOPER文件夹下的 X86\SETUP\SETUPSQL.EXE 任何一个运行即可,(理论上 ...
- Kali Linux Wine32英文字体不显示问题
Kali Linux Wine32英文字体不显示问题 Kali Linux提供了Wine32工具.在运行Wine32后,界面可以显示中文,但不能显示英文文字.英文文字均显示为方块.这是由于缺少对应的 ...
- python 设计模式之中介模式
Mediator Pattern:中介模式 中介模式提供了一系列统一的系统接口.此模式也被认为是行为模式,因为他能选择程序处理流程. 当许多类开始在交互中产生结果时,可以选用中介模式.当软件开始组织 ...
- 基于Bootstrap的下拉框插件bootstrap-select
写在前面: 在这次的项目中,没有再使用liger-ui做为前端框架了,改为了Bootstrap,这次也好接触下新的技术,在学习的过程中发现,Bootstrap的一些组件基本都是采用class的形式,就 ...
- sed 中如何替换换行符
使用如下解决方案: sed ':a;N;$!ba;s/\n/ /g' 这将在一个循环里读取整个文件,然后将换行符替换成一个空格. 说明: 通过 :a创建一个标记 通过N追加当前行和下一行到模式区域 如 ...
- 初识交替最小二乘ALS
ALS是alternating least squares的缩写 , 意为交替最小二乘法:而ALS-WR是alternating-least-squares with weighted-λ -regu ...