JAVAWEB开发之SpringMVC详解(一)——SpringMVC的框架原理、架构简介、与mybatis整合和注解方式的使用、

知识清单

基础知识清单

SpringMVC框架(重点)
  • MVC在B/S系统中的应用方式
  • SpringMVC框架原理(DispatcherServlet前端控制器、处理器映射器、处理器适配器、视图解析器)
SpringMVC入门程序
  • 需求:商品列表查询
  • 常用的处理器映射器,处理器适配器
  • 注解的处理器映射器,处理器适配器用于注解开发(重点)
注解开发基础
  • 常用注解的使用
  • 参数绑定
  • 自定义参数绑定
SpringMVC与Struts的区别

高级知识清单(第二部分)

使用SpringMVC上传图片
集合参数的绑定
validation校验器
异常处理器的使用(用于系统异常处理)
Restful支持
拦截器

SpringMVC框架

SpringMVC是什么?

springmvc是Spring的一个模块,提供web层解决方案(就与MVC设计架构)

MVC在B/S系统中的应用

MVC是一种设计模式,在B/S中的应用如下图所示:

SpringMVC的框架


执行过程大致如下:
第一步:用户发起request请求,请求至DispatcherServlet前端控制器。
第二步:DispatcherServlet前端控制器请求HandlerMapping处理器映射器查找Handler。 DispatcherServlet: 前端控制器,相当于中央调度器,各个组件都和前端控制器进行交互,降低了各个组件之间的耦合度。
第三步:HandlerMapping处理器映射器,根据url及一些配置规则(xml配置、注解配置)查找Handler,将Handler返回给DispatcherServlet前端控制器。
第四步:DispatcherServlet前端控制器调用适配器执行Handler,有了适配器通过适配器去扩展对不同Handler执行方式(比如:原始servlet开发,注解开发)
第五步:适配器执行Handler; Handler是后端控制器,可以当成模型
第六步:Handler执行完后后返回ModelAndView。ModelAndView: SpringMVC的一个对象,对model和view进行封装。
第七步:适配器将ModelAndView返回给DispatcherServlet前端控制器。
第八步:DispatcherServlet调用视图解析器进行视图解析,解析后生成view,视图解析器根据逻辑视图名解析出真正的视图。 view:SpringMVC视图封装对象,提供了很多view,比如jsp、freemarker、pdf、execel.......
第九步:ViewResolver视图解析器给前端控制器返回view。
第十步:DispatcherServlet调用view的渲染视图的方法,将模型数据填充到request域。
第十一步:DispatcherServlet向用户响应结果(jsp页面、json数据......).

DispatcherServlet:前端控制器,由SpringMVC提供。
HandlerMapping:处理器映射器,由SpringMVC提供。
HandlerAdapter:处理器适配器,由SpringMVC提供。
Handler:处理器,需要程序员开发。
ViewResolver:视图解析器,由SpringMVC提供。
view:真正的视图页面,由程序员编写。

入门程序

需求

实现商品列表查询

需要的jar包

使用spring3.2.0(带springmvc模块)   如下图所示

前端控制器

在web.xml中进行配置
[html]  view plain   copy
  1. <!-- 前端控制器 -->  
  2.     <servlet>  
  3.         <servlet-name>springmvc</servlet-name>  
  4.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  5.         <!-- 加载SpringMVC配置 -->  
  6.         <init-param>  
  7.             <!-- 配置文件的位置 -->  
  8.             <!-- 如果不配置contextConfigLocation,  
  9.                  默认查找的配置文件名称classpath下的: servlet名称+"servlet.xml"即springmvc-servlet.xml  
  10.              -->  
  11.             <param-name>contextConfigLocation</param-name>  
  12.             <param-value>classpath:springmvc.xml</param-value>  
  13.         </init-param>  
  14.     </servlet>  
  15.     <servlet-mapping>  
  16.         <servlet-name>springmvc</servlet-name>  
  17.         <!--   
  18.         可以配置/, 此工程 所有请求全部由springmvc解析,此种方式可以实现  
  19.         RESTful方式,需要特殊处理对静态文本的解析不能由springmvc解析  
  20.         可以配置*.do或*.action, 所有请求的url扩展名为.do或.action由springmvc解析,此种方法  
  21.         不可以使用/*,如果配置/*,返回的jsp也由springmvc解析,这是不对的  
  22.          -->  
  23.         <url-pattern>*.action</url-pattern>  
  24.     </servlet-mapping>  

springmvc.xml

在springmvc.xml中配置springmvc架构的三大组件(处理器映射器、处理器适配器、视图解析器)

工程结构


处理器映射器

在springmvc.xml中进行配置:
BeanNameURLHandlerMapping:根据url( xxx.action ) 匹配Spring容器的name。
找到对应的Bean(程序员编写的Handler)
[html]  view plain   copy
  1. <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->  
  2.         <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>  
注意:所有处理器映射器都实现HandlerMapping接口

处理器适配器

在springmvc.xml中配置:
[html]  view plain   copy
  1. <!-- 配置处理器适配器 springmvc框架根据HandlerAdapter接口判断是否是处理器适配器 -->  
  2.         <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>  
注意:所有的适配器都是实现了HandlerAdapter接口

程序员编写Handler要根据所配置的适配器的要求编写。
SimpleControllerHandlerAdapter适配器要求:通过supports方法知道Handler必须要实现哪个接口
查看HandlerAdapter(适配器接口)源代码如下:
[java]  view plain   copy
  1. public interface HandlerAdapter {  
  2.     // 已经去除文档注释  
  3.     boolean supports(Object handler);   
  4.           
  5.     ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;  
  6.   
  7.     long getLastModified(HttpServletRequest request, Object handler);  
  8.   
  9. }  
查看SimpleControllerHandlerAdapter适配器源码如下:
[java]  view plain   copy
  1. public class SimpleControllerHandlerAdapter implements HandlerAdapter {  
  2.   
  3.     public boolean supports(Object handler) {  
  4.         return (handler instanceof Controller);  
  5.     }  
  6.   
  7.     public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)  
  8.             throws Exception {  
  9.   
  10.         return ((Controller) handler).handleRequest(request, response);  
  11.     }  
  12.   
  13.     public long getLastModified(HttpServletRequest request, Object handler) {  
  14.         if (handler instanceof LastModified) {  
  15.             return ((LastModified) handler).getLastModified(request);  
  16.         }  
  17.         return -1L;  
  18.     }  
  19.   
  20. }  
可以发现SimpleControllerHandlerAdapter类型的处理器适配器通过support方法根据Handler对象是否实现了Controller接口来进行判断是否支持Handler,凡是实现了Controller接口的类都可以被简单类型的处理器适配器匹配调用,简单处理器适配器通过在handle方法中调用Handler实现Controller接口的HandleRequest方法向前端控制器返回ModelAndView。

Handler的编写

需要实现Controller接口
[java]  view plain   copy
  1. public class ItemController1 implements Controller {  
  2.   
  3.     public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  4.         // 使用静态数据将商品信息展示在jsp页面上  
  5.         // 商品列表  
  6.         List<Items> itemsList = new ArrayList<Items>();  
  7.   
  8.         Items items_1 = new Items();  
  9.         items_1.setName("联想笔记本");  
  10.         items_1.setPrice(6000f);  
  11.         items_1.setCreatetime(new Date());  
  12.         items_1.setDetail("ThinkPad T430 联想笔记本电脑!");  
  13.   
  14.         Items items_2 = new Items();  
  15.         items_2.setName("苹果手机");  
  16.         items_2.setPrice(5000f);  
  17.         items_2.setDetail("iphone6苹果手机!");  
  18.   
  19.         itemsList.add(items_1);  
  20.         itemsList.add(items_2);  
  21.   
  22.         ModelAndView modelAndView = new ModelAndView();  
  23.         // 将数据填充到request  
  24.         // request.setAttribute("itemList", itemsList);  
  25.         modelAndView.addObject("itemsList", itemsList);  
  26.         // 指定转发到JSP页面  
  27.         modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");  
  28.         return modelAndView;  
  29.     }  
  30.   
  31. }  

配置Handler

在springmvc.xml中配置Handler,由Spring管理Handler。
[html]  view plain   copy
  1. <!-- 配置Handler 由于使用了BeanNameUrlHandlerMapping处理器映射器,name配置为url -->  
  2.         <bean name="/itemList.action" class="lx.springmvc.first.ItemController1"/>  

配置视图解析器

配置视图解析,能够解析jsp视图
[html]  view plain   copy
  1. <!-- 配置视图解析器 -->  
  2.         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  3.         </bean>  

工程部署

访问:http://localhost:8080/springmvc_first/itemList.action

异常

地址中Handler名称输入错误

HandlerMapping没有找到Handler,message中不显示jsp路径,这种错误一般是由于输入地址操作导致

要转向的JSP页面不存在


其它非注解处理器映射器和适配器

BeanNameUrlHandlerMapping(映射器)

根据请求url (xxx.action)匹配Spring容器中bean的name
找到对应的bean(程序编写的Handler)

SimpleUrlHandlerMapping(映射器)

[html]  view plain   copy
  1. <!-- 简单url映射 集中配置bean的id对应的url -->  
  2.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  3.         <property name="mappings">  
  4.             <props>  
  5.                 <prop key="itemsTest1.action">itemController1</prop>  
  6.                 <prop key="itemsTest2.action">itemController1</prop>  
  7.             </props>  
  8.         </property>  
  9.     </bean>  
注意:在springmvc.xml中配置了多个处理器映射器,多个处理器映射器就可以共存,不会排斥

SimpleControllerHandlerAdapter(适配器)

要求程序编写的Handler (controller)需要实现Controller接口。

HttpRequestHandlerAdapter(适配器)

在springmvc.xml中配置:HttpRequestHandlerAdapter
要求编写的Handler实现 HttpRequestHandler接口

配置HttpRequestHandlerAdapter适配器

[html]  view plain   copy
  1. <!-- 配置HttpRequestHandlerAdapter适配器 -->  
  2.     <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>  

开发Handler

[java]  view plain   copy
  1. public class ItemController2 implements HttpRequestHandler {  
  2.   
  3.     public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  4.         // 使用静态数据将商品信息展示在jsp页面上  
  5.         // 商品列表  
  6.         List<Items> itemsList = new ArrayList<Items>();  
  7.   
  8.         Items items_1 = new Items();  
  9.         items_1.setName("联想笔记本");  
  10.         items_1.setPrice(6000f);  
  11.         items_1.setCreatetime(new Date());  
  12.         items_1.setDetail("ThinkPad T430 联想笔记本电脑!");  
  13.   
  14.         Items items_2 = new Items();  
  15.         items_2.setName("苹果手机");  
  16.         items_2.setPrice(5000f);  
  17.         items_2.setDetail("iphone6苹果手机!");  
  18.   
  19.         itemsList.add(items_1);  
  20.         itemsList.add(items_2);  
  21.           
  22.         request.setAttribute("itemsList", itemsList);  
  23.         request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request, response);  
  24.     }  
  25.   
  26. }  
可以发现。HttpRequestHandler的开发方式和原始的Servlet开发方式很相近

配置Handler

[html]  view plain   copy
  1. <!-- Handler2 -->  
  2. <bean id="itemController2"  class="lx.springmvc.first.ItemController2" />  
使用简单URL映射器
[html]  view plain   copy
  1. <!-- 简单url映射 集中配置bean的id对应的url -->  
  2.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  3.         <property name="mappings">  
  4.             <props>  
  5.                 <prop key="itemsTest1.action">itemController1</prop>  
  6.                 <prop key="itemsTest2.action">itemController2</prop>  
  7.             </props>  
  8.         </property>  
  9.     </bean>  

DispatcherServlet.properties



DispatcherServlet前端控制器加载DispatcherServlet.properties配置文件,从而默认加载各个组件。
如果在springmvc.xml中配置了处理器映射器和适配器,以springmvc.xml的为准。

注解映射器和适配器

注解映射器

Spring3.1之前默认加载器是org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,3.1之后要使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping。
在springmvc.xml中配置RequestMappingHandlerMapping:
[html]  view plain   copy
  1. <!-- 注解处理器映射器 -->  
  2.     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>  
使用RequestMappingHandlerMapping 注解映射器需要在Handler中使用@Controller标识此类是一个控制器,使用@RequestMapping指定Handler方所对应的url。

注解适配器

Spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,3.1之后要使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
RequestMappingHandlerAdapter 注解适配器不要求Handler实现任何接口,但它需要和RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。在springmvc.xml中配置RequestMappingHandlerAdapter如下:
[html]  view plain   copy
  1. <!-- 注解适配器 -->  
  2.     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>  

注解开发Handler

[java]  view plain   copy
  1. @Controller  
  2. public class ItemController3 {  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值