springMVC框架--入门程序(一)
2016-10-20 11:42
435 查看
1 springMVC框架
1.1 springMVC是什么
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,springMVC是spring的一个模块,提供web层解决方案。1.2 springMVC的框架
第一步:用户发起request请求,请求至DispatcherServlet前端控制器
第二步:DispatcherServlet前端控制器请求HandlerMapping处理器映射器查找Handler
DispatcherServlet:前端控制器,相当于中央调度器,各各组件都和前端控制器进行交互,降低了各各组件之间耦合度。
第三步:HandlerMapping处理器映射器,根据url及一些配置规则(xml配置、注解配置)查找Handler,将生成的Handler对象和处理器拦截器链一并返回给DispatcherServlet前端控制器
第四步:DispatcherServlet前端控制器调用适配器执行Handler,(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)有了适配器通过适配器去扩展对不同Handler执行方式(比如:原始servlet开发,注解开发)
第五步:适配器执行具体的Handler也就是controller,将request域中的数据注入到controller方法的形参中,
在填充controller方法的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
第六步:Handler执行完成返回ModelAndView
ModelAndView:springmvc的一个对象,对Model和view进行封装。
第七步:适配器将ModelAndView返回给DispatcherServlet
第八步:DispatcherServlet调用视图解析器进行视图解析,解析后生成view
视图解析器根据逻辑视图名解析出真正的视图。
View:springmvc视图封装对象,提供了很多view,jsp、freemarker、pdf、excel等
第九步:ViewResolver视图解析器给前端控制器返回view
第十步:DispatcherServlet调用view的渲染视图的方法,将模型数据填充到request域。
第十一步:DispatcherServlet向用户响应结果(jsp页面、json数据等)
2 入门程序
2.1 环境搭建所需的jar包
使用spring3.2.0(带springwebmvc模块)的jar包2.2 前端控制器配置
在web.xml中配置:<!-- 前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 加载springmvc配置 --> <init-param> <param-name>contextConfigLocation</param-name> <!-- 配置文件的地址 如果不配置contextConfigLocation, 默认查找的配置文件名称classpath下的:servlet名称+"-serlvet.xml"即:springmvc-serlvet.xml --> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 可以配置/ ,此工程所有请求全部由springmvc解析,此种方式可以实现 RESTful方式,需要特殊处理对静态文件的解析不能由springmvc解析 可以配置*.do或*.action,所有请求的url扩展名为.do或.action由springmvc解析,此种方法常用 不可以/*,如果配置/*,返回jsp也由springmvc解析,这是不对的。 --> <url-pattern>*.action</url-pattern> </servlet-mapping>
2.3 处理器映射器
在springmvc.xml中配置:BeanNameUrlHandlerMapping: 根据请求url(XXXX.action)匹配spring容器bean的 name
找到对应的bean(程序编写的Handler)
<!--配置处理器映射器 springmvc框架根据HandlerMapping接口判断是否是处理器映射器 --> <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 所有处理器映射器都实现HandlerMapping接口。
2.4 处理器适配器
在springmvc.xml配置:<!--配置处理器适配器springmvc框架根据HandlerAdapter接口判断是否是处理器适配器
-->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
所有的适配器都是实现了HandlerAdapter接口。
程序编写Handler根据适配器的要求编写。
SimpleControllerHandlerAdapter适配器要求:
通过supports方法知道Handler必须要实现Controller接口:
publicboolean supports(Object handler) {
return (handlerinstanceofController);
}
2.5 Handler编写
pojo商品信息:Item.javapublic class Items { private Integer id; private String name; private Float price; private String pic; private Date createtime; private String detail; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Float getPrice() { return price; } public void setPrice(Float price) { this.price = price; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic == null ? null : pic.trim(); } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail == null ? null : detail.trim(); } }
编写ItemController1.java
public class ItemController1 implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 使用静态数据将商品信息列表显示在jsp页面 // 商品列表 List<Items> itemsList = new ArrayList<Items>(); Items items_1 = new Items(); items_1.setName("联想笔记本"); items_1.setPrice(6000f); items_1.setCreatetime(new Date()); 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 = new ModelAndView(); //将数据填充到request // request.setAttribute("itemsList",itemsList); modelAndView.addObject("itemsList", itemsList); //指定转发的jsp页面 modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp"); return modelAndView; } }
2.6 配置Handler
在springmvc.xml配置Handler由spring管理Handler。<!--配置Handler由于使用了BeanNameUrlHandlerMapping处理映射器,name配置为url
-->
<beanid="itemController1"name="/itemList.action"
class="cn.itcast.springmvc.first.ItemController1"/>
2.7 配置视图解析器
配置视图解析,能够解析jsp视图:<!--配置视图解析器要求将jstl的包加到classpath
-->
<!-- ViewResolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>
2.8 springmvc.xml所有配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> <!-- 配置Handler 由于使用了BeanNameUrlHandlerMapping处理映射器,name配置为url --> <bean name="/itemList.action" class="cn.itcast.springmvc.first.ItemController1"/> <!-- 配置处理器映射器 springmvc框架根据HandlerMapping接口判断是否是处理器映射器 --> <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 配置处理器适配器 springmvc框架根据HandlerAdapter接口判断是否是处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 配置视图解析器要求将jstl的包加到classpath--> <!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> </bean> </beans>
2.9 工程部署
将整个入门程序加载到tomcat,然后访问:http://localhost:8080/springMVCfirst/itemList.action3 其它非注解处理器映射器和适配器
3.1 BeanNameUrlHandlerMapping(映射器)
根据请求url(XXXX.action)匹配spring容器bean的 name找到对应的bean(程序编写的Handler)
3.2 SimpleUrlHandlerMapping(映射器)
<!--简单url映射集中配置bean的id对应的url-->
<beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<propertyname="mappings">
<props>
<prop key="/itemsTest1.action">itemController1</prop>
<prop key="/itemsTest2.action">itemController2</prop>
</props>
</property>
</bean>
注意:在springmvc.xml配置了多个处理器映射器,多个处理器映射器可以共存。
3.3 SimpleControllerHandlerAdapter(适配器)
要求程序编写的Handler(Controller)需要实现 Controller接口。3.4 HttpRequestHandlerAdapter(适配器)
在springmvc.xml配置:HttpRequestHandlerAdapter要求Handler 实现HttpRequestHandler接口
这里就相当于使用原始servlet开发
3.4.1 根据HttpRequestHandlerAdapter开发Handler
public class ItemController2 implements HttpRequestHandler { public void handleRequest(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException { // 使用静态数据将商品信息列表显示在jsp页面 // 商品列表 List<Items> itemsList = new ArrayList<Items>(); Items items_1 = new Items(); items_1.setName("联想笔记本"); items_1.setPrice(6000f); items_1.setCreatetime(new Date()); 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); //转发到jsp页面 request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request, response); } }
3.4.2 配置Handler
<!--handler2 --><beanid="itemController2"class="cn.itcast.springmvc.first.ItemController2"></bean>
映射器可以随便使用哪个配置这里使用SimpleUrlHandlerMapping映射器
key="/itemsTest2.action">itemController2</prop>
4 DispatcherServlet.properoties
DispatcherServlet.properoties 这个配置文件是DispatcherServlet前端控制器加载默认加载配置文件,里面配置了各种处理器的映射器和适配器从而默认加载各各组件。
如果在springmvc.xml中配置了处理器映射器和适配器,则以sprintmvc.xml中配置的为准
5 注解映射器和适配器
5.1 注解映射器
spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,
3.1之后要使用:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
使用RequestMappingHandlerMapping需要在Handler 中使用@controller标识此类是一个控制器,使用@requestMapping指定Handler方法所对应的url。
5.2 注解适配器
spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,
3.1之后要使用:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
RequestMappingHandlerAdapter,不要求Handler实现任何接口,它需要和RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。
5.3 注解开发Hanlder
@Controller public class ItemController3 { //商品列表,@RequestMapping中url建议和方法名一致,方便开发维护 @RequestMapping("/queryItems") public ModelAndView queryItems(){ // 使用静态数据将商品信息列表显示在jsp页面 // 商品列表 List<Items> itemsList = new ArrayList<Items>(); Itemsitems_1 = new Items(); items_1.setName("联想笔记本"); items_1.setPrice(6000f); items_1.setCreatetime(new Date()); 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 = new ModelAndView(); modelAndView.addObject("itemsList", itemsList); //指定逻辑视图名 modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp"); return modelAndView; } //其他方法 }
5.1 配置Handler
<!--注解的handler,单个配置 --><!-- <beanclass="cn.itcast.springmvc.first.ItemController3"/> -->
<!--
使用spring组件扫描 -->
<context:component-scanbase-package="cn.itcast.springmvc.first"/>
建议使用组件扫描,组件扫描可以扫描@Controller、@Service、@component、@Repsitory
6 小结
DispatcherServlet:前端控制器,相当于中央调度器,可以降低组件之间的耦合度。HandlerMapping:处理器映射器,负责根据url查找Handler
HandlerAdapter:处理器适配器,负责根据适配器要求的规则去执行处理器。可以通过扩展适配器支持不同类型的Handler。
viewResolver:视图解析器,根据逻辑视图名解析成真正的视图,
<!--配置视图解析器要求将jstl的包加到classpath
-->
<!-- ViewResolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="prefix"value="/WEB-INF/jsp/"/>
<propertyname="suffix"value=".jsp"/>
</bean>
真正的视图=前缀+逻辑视图名+后缀
框架源码分析
1、DispatcherServlet在doDispatch(HttpServletRequestrequest, HttpServletResponse response)z这个初始化的方法中通过mappedHandler查找HandlerExecutionChina
2、DispatcherServlet通过适配器去执行Handler,得到ModelAndview
3、视图解析
视图解析完成得到一个view:
4、进行视图渲染
将Model中的数据填充到request域。
相关文章推荐
- 【SSM-SpringMVC框架】SpringMVC入门小程序
- 简易的springmvc入门程序-springmvc框架的搭建
- SpringMvc一个简单的框架入门程序
- 【SpringMVC框架】springmvc入门程序-环境搭建
- 【SpringMVC框架】springmvc入门程序-环境搭建
- Springmvc框架(入门程序)
- SpringMVC框架(一)环境搭建及入门程序
- hessian入门与springMVC框架集成---客户端调用
- 和大彪一起来学习-SpringMvc之第一回(框架了解和第一个SpringMvc程序) 分类: SpringMvc 2015-01-14 21:08 635人阅读 评论(0) 收藏
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署
- springMVC学习笔记(二)-----注解和非注解入门小程序
- [04] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截
- 和大彪一起来学习-SpringMvc之第一回(框架了解和第一个SpringMvc程序) 分类: SpringMvc 2015-01-14 21:08 636人阅读 评论(0) 收藏
- 入门级正向连接程序框架-用pipe绑定cmd和socket的输入输出
- hello-win程序入门win32基本窗口框架全解析
- 和大彪一起来学习-SpringMvc之第一回(框架了解和第一个SpringMvc程序)
- SpringMvc如何学习框架技术? 就像如上的图示一样,先掌握新技术的体系流程图。在快速弄明白程序执行流程后,在使用过程中 了解细节。
- 微软同步框架入门之七--定制同步提供程序(SyncProvider)
- SpringMVC入门小程序 -- Myeclipse 9.1下