Spring MVC入门第1天--框架说明与快速入门
Posted 鹿天斐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC入门第1天--框架说明与快速入门相关的知识,希望对你有一定的参考价值。
文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.06.29 | lutianfei | none |
- 内容安排:
- 第一天:springmvc的基础知识
- 什么是springmvc?
- springmvc框架原理(掌握)
- 前端控制器、处理器映射器、处理器适配器、视图解析器
- springmvc入门程序
- 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习
- 非注解的处理器映射器、处理器适配器
- 注解的处理器映射器、处理器适配器(掌握)
- springmvc和mybatis整合(掌握)
- springmvc注解开发:(掌握)
- 常用的注解学习
- 参数绑定(简单类型、pojo、集合类型(明天讲))
- 自定义参数绑定(掌握)
- springmvc和struts2区别
- 第二天:springmvc的高级应用
- 参数绑定(集合类型)
- 数据回显
- 上传图片
- json数据交互
- RESTful支持
- 拦截器
- 第一天:springmvc的基础知识
springmvc框架
- springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
- springmvc是一个基于mvc的web框架。
springmvc业务流程框架
- 第一步:用户发送请求至
DispatcherServlet前端控制器
- 第二步:
DispatcherServlet前端控制器
收到请求调用HandlerMapping处理器映射器
查找Handler处理器
- 可以根据xml配置、注解进行查找
- 第三步:
HandlerMapping处理器映射器
根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(即HandlerExecutionChain执行链
)并返回给DispatcherServlet前端控制器
。 - 第四步:
DispatcherServlet前端控制器
通过HandlerAdapter处理器适配器
调用Handler处理器
- 第五步:
HandlerAdapter处理器适配器
去执行Handler处理器
(Controller,也叫后端控制器)。 - 第六步:
Handler处理器
执行完成给HandlerAdapter处理器适配器
返回ModelAndView - 第七步:
HandlerAdapter处理器适配器
将Handler处理器
执行结果ModelAndView返回给DispatcherServlet前端控制器
ModelAndView
是springmvc框架的一个底层对象,包括 Model和view
- 第八步:
DispatcherServlet前端控制器
将ModelAndView传给ViewReslover视图解析器
- 根据逻辑视图名解析成真正的视图(jsp)
- 第九步:
ViewReslover视图解析器
向DispatcherServlet前端控制器
返回View - 第十步:
DispatcherServlet前端控制器
对View进行渲染视图(即将模型数据填充至视图中)。
- 视图渲染将模型数据(在ModelAndView对象中)填充到request域
- 第十一步:
DispatcherServlet前端控制器
向用户响应结果
springmvc框架组件说明
1、
前端控制器DispatcherServlet
(不需要程序员开发)- 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
2、
处理器映射器HandlerMapping
(不需要程序员开发)- HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、
处理器Handler
(需要程序员开发)- Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。需要程序员根据业务需求开发Handler。
- 注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
4、
处理器适配器HandlerAdapter
- 作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
- 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
5、
视图解析器View resolver
(不需要程序员开发)- 作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
- View Resolver负责将处理结果生成View视图,View Resolver首先根据
逻辑视图名
解析成物理视图名
即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
6、
视图View
(需要程序员开发jsp)- View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
- springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
- 一般情况下需要通过
页面标签
或页面模版技术
将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
Spring MVC入门程序
需求: springmvc和mybaits使用一个案例(商品订单管理)。
环境准备
- 数据库环境:mysql5.1
- java环境:
- jdk1.7.0_72
- eclipse indigo
- springmvc版本:spring3.2
- 需要spring3.2所有jar(一定包括spring-webmvc-3.2.0.RELEASE.jar)
配置前端控制器
- 在web.xml中配置前端控制器。
配置处理器适配器
- 在classpath下的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 ">
<!-- 处理器映射器 -->
<!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
通过查看原代码:
- 此适配器能执行实现 Controller接口的Handler并返回ModelAndView类型数据。
开发Handler
- 需要实现 controller接口,才能由
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
适配器执行。
public class ItemsController1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) 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的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
视图编写
- 添加itemsList.jsp页面
配置Handler
- 将编写Handler在spring容器加载(springmvc.xml)。
配置处理器映射器
- 在classpath下的springmvc.xml中配置处理器映射器
配置视图解析器
- 需要配置解析jsp的视图解析器。
部署调试
处理器映射器根据url找不到Handler,报下边的错误。说明url访问地址错误。
处理器映射器根据url找到了Handler,转发的jsp页面找到,报下边的错误,说明jsp页面地址错误了。
- 修改
ItemsController1.java
文件中的modelAndView指定的视图地址即可。
非注解的处理器映射器 和 适配器
非注解的处理器映射器
- 上面入门所用的处理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
问题:url配置是在bean中完成的
url和handler集中配置的映射器(简单映射器):
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
结论:多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。
- handler要加入id属性
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />
非注解的处理器适配器
- 入门所使用适配器:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求: 编写的Handler实现 Controller接口。
另一种适配器:
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
- 添加适配器声明 :
<!-- 另一个非注解的适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
- 要求编写的Handler实现 HttpRequestHandler接口。
- 添加handle属性
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems1.action"> itemsController1</prop>
<prop key="/queryItems2.action"> itemsController2</prop>
</props>
</property>
</bean>
- 使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");*/
springmvc的默认加载
在 DispatcherSerlvet.properties 中
前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的。
注解的处理器映射器和适配器
在spring**3.1之前使用的注解映射器:org.springframework.web.servlet.mvc.annotation.**DefaultAnnotationHandlerMapping。
在spring3.1之后使用的注解映射器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping。
在spring**3.1之前使用的注解适配器 : org.springframework.web.servlet.mvc.annotation.**AnnotationMethodHandlerAdapter。
在spring3.1之后使用的注解适配器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter。
配置注解映射器和适配器
- 开发中使用
mvc:annotation-driven
代替上边注解映射器和注解适配器配置
mvc:annotation-driven
默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,如果使用mvc:annotation-driven
不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
//springmvc.xml
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
开发注解Handler
注解的映射器
和注解的适配器
必须配对使用- @RequestMapping(“/queryItems”):这里映射可以不加后缀
.action
但是输入网址时必须加。
//使用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的setAttribut,在jsp页面中通过itemsList取数据
modelAndView.addObject("itemsList", itemsList);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
在spring容器中加载Handler
- 对于注解的Handler可以单个配置,但实际开发中建议使用组件扫描
- 组件扫描可以扫描controller、service、…
<!--
Handler的单个配置
-->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->
<!--
组件扫描:这里扫描的是controller包
-->
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
视图解析器配置前缀和后缀
<!-- 视图解析器
解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 配置jsp路径的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
- 此时程序中不用指定前缀和后缀,上述
ItemsController3.java
最后可修改如下:
//指定视图
//下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
//上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
modelAndView.setViewName("items/itemsList");
源码分析(了解)
通过前端控制器源码分析springmvc的执行过程。
第一步:前端控制器接收请求
- 由
web.xml
的org.springframework.web.servlet.DispatcherServlet
转到DispatcherServlet
- 找到方法:
doDispatch
- 由
第二步:前端控制器调用处理器映射器查找 Handler
- 在
doDispatch
方法的第896行找到getHandler()函数并进入HandlerExcecutionChain
- 继续进入下一层
getHandler
函数,找到最终的HandlerExcecutionChain
定义
- 在
第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView
- 在
doDispatch
函数第925行左右
- 在
第四步:视图渲染,将model数据填充到request域。
- 在
DispatcherServlet.class
992行找到render
函数,并点入
- 视图解析,得到view:
- 调用view的渲染方法,将model数据填充到request域
- 渲染方法:
- 在
入门程序小结
通过入门程序理解springmvc前端控制器、处理器映射器、处理器适配器、视图解析器用法。
前端控制器配置:
- 第一种:
*.action
,访问以.action结尾 由DispatcherServlet进行解析 - 第二种:
/
,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用此种方式可以实现 RESTful风格的url
- 第一种:
处理器映射器:
- 非注解处理器映射器(了解)
- 注解的处理器映射器(掌握)
- 对标记
@Controller类
中标识有@RequestMapping
的方法进行映射。在@RequestMapping
里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。
处理器适配器:
- 非注解处理器适配器(了解)
- 注解的处理器适配器(掌握)
- 注解处理器适配器和注解的处理器映射器是配对使用。理解为不能使用非注解映射器进行映射。
- 实际开发使用:
mvc:annotation-driven
以上是关于Spring MVC入门第1天--框架说明与快速入门的主要内容,如果未能解决你的问题,请参考以下文章