SpringMVC
2021-06-18 20:47:44 47 举报
AI智能生成
SpringMVC架构图
作者其他创作
大纲/内容
说明
Spring MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。
通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
springMVC是spring框架的一个模块,springMVC和spring无需通过中间整合层进行开发。
Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来
分支主题
基础原理
MVC处理请求原理
原理示意图
分支主题
具体执行步骤如下
1、首先用户发送请求->前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图2-1中的1、2步骤;
2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);图2-1中的3、4、5步骤;
3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图2-1中的步骤6、7;
4、前端控制器再次收回控制权,将响应返回给用户,图2-1中的步骤8;至此整个结束。
Spring MVC 架构
分支主题
架构图对应的DispatcherServlet核心代码
核心架构的具体流程步骤
SpringMVC工作流程描述
1、向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。
2、DispatcherServlet 根据 <servlet-name>-servlet.xml 中的配置对请求的URL进行解析,得到请求资源标识符(URI)。 然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
3、DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)。
4、提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
4.1、HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
4.2、数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
4.3、数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
4.4、数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
5、Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
6、根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
7、ViewResolver 结合Model和View,来渲染视图。
8、视图负责将渲染结果返回给客户端。
核心开发步骤
1. DispatcherServlet在web.xml中的部署描述,从而拦截请求到Spring Web MVC
2. HandlerMapping的配置,从而将请求映射到处理器
3. HandlerAdapter的配置,从而支持多种类型的处理器
4. ViewResolver的配置,从而将逻辑视图名解析为具体视图技术
5. 处理器(页面控制器)的配置,从而进行功能处理
核心编程技术
注解的使用
@Controller
标识一个控制器
@RequestMapping
标识一个相对路径或访问路径
注:如果@RequestMapping注解在类级别上,则表示一相对路径,在方法级别上,则标记访问的路径;
作用
spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求。
类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于WEB 应用的根目录
常用属性
value:表示请求 URL
path:表示请求 URL
method:表示请求方法
params:表示请求参数
heads:表示请求头的映射条件
模糊匹配
?:匹配一个字符
*:匹配任意字符
**:匹配多层路径
示例
@RequestParam
作用
在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法
属性
value:参数名
required:是否必须。默认为 true, 表示请求参数中必须包含对应 – 的参数,若不存在,将抛出异常
defaultValue:默认值
注意:value属性值可以与控制器处理方法的形参名称不一致
示例
@PathVariable
作用
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:
URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。
示例
@RequestHeader
作用
请求头包含了若干个Header属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中
示例
@CookieValue
作用
@CookieValue 可• 让处理方法入参绑定某个 Cookie 值。
示例
注解开发配置
参数传递
使用POJO对象传递参数
作用
当控制器的处理方法需要多个参数时,使用@RequestParam进行表示就显得很臃肿了,此时我们可以将请求参数映射到一个POJO对象中。
Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。
示例
使用 Servlet API 作为入参
说明
SpringMVC支持将Servlet API 作为入参传递给Controller的处理方法。
可接收的类型
HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
示例
处理模型数据
基本类型、包装类型
简单对象、复杂对象
集合处理
List类型数据
Set类型数据
Map类型数据
输出模型数据
ModelAndView
处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
概述
控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
核心方法
添加模型数据
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map< String, ?> modelMap )
设置视图
void setView(View view )
void setViewName(String viewName)
示例
Map及Model
入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或 java.uti.Map时,处理方法返回时,Map 中的数据会自动添加到模型中。
原理
Spring MVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据。
Spring MVC 在调用方法前会创建一个–隐含的模型对象作为模型数据的存储容器。
如果方法的入参为 Map 或 Model 类型,Spring MVC 会隐含模型的引用传递给这些入参。
在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。
示例
@SessionAttributes
将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
@ModelAttribute
方法入参标注该注解后, 入参的对象就会放到数据模型中
数据校验
说明
在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验。
服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,
在服务端控制层conroller的校验,不区分客户端类型(浏览器、手机客户端、远程调用);
service层主要校验关键业务参数,仅限于service接口中使用的参数。
使用Annotaion JSR-303标准的验证
1. 环境准备
springmvc中我们使用hibernate的校验框架validation(注:和hibernate没有任何关系)
2. 配置校验器
分支主题
3.添加校验
常用注解校验器
示例
分支主题
异常消息文件
分支主题
4.校验信息处理
分支主题
5.校验信息显示
6. 分组校验
问题:在pojo中定义了校验规则,但是pojo是被多个controller使用的,
现在假如两个不同的controller使用的校验规则是不一样的,这样就没法做了,因为两个controller都使用同一个pojo。
定义分组接口
注意:接口中不需要定义任何方法,仅仅是对不同的校验规则进行分组
在使用的校验器中添加属性: groups={分组接口.class}
在处理器中修改 @Validated(value= {分组接口.class})
基于Validator接口的验证
文件上传
RestFul
发出rest风格的请求
编写rest风格的映射方法
配置rest风格的方法转换过滤器
定时任务
配置
1.在springmvc.xml里加入task的命名空间
2.配置定时任务的线程池
<task:scheduler id="myScheduler" pool-size="5"/>
3.启用注解驱动的定时任务
<task:annotation-driven scheduler="myScheduler"/>
任务示例
cron表达式详
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
0 条评论
下一页