Web中的Spring
2019-05-11 21:53:47 0 举报
AI智能生成
Spring实战-Web篇
作者其他创作
大纲/内容
SpringMVC起步
SpringMVC请求流程
从离开浏览器开始到获取响应返回,它会经历好多站,在每站都会留下一些信息同时也会带上其他信息
分支主题
1.请求旅程的第一站是Spring的DispatcherServlet(前端控制器),
一个单实例的Servlet将请求委托给应用程序的其他组件来执行实际的处理.
2.DispatcherServlet需要知道应该将请求发送给哪个控制器。所以DispatcherServlet会查询一个或多个处理器映射(handler mapping) 来确定请求的下一站在哪里。
处理器映射会根据请求所携带的URL信息来进行决策。
在典型的应用程序中可能会有多个控制器。
3.到了控制器,请求会卸下其负载(用户提交的信息)并耐心等待控制器处理这些信息
4.控制器在完成逻辑处理后,通常会产生一些信息,这些信息需要返回给用户并在浏览器上显示。这些信息被称为模型(model)
5.DispatcherServlet将会使用视图解析器(view resolver) 来将逻辑视图名匹配为一个特定的视图实现,它可能是也可能不是JSP。
6.最后一站是视图的实现(可能是JSP) ,在这里它交付模型数据。
请求的任务就完成了。视图将使用模型数据渲染输出
搭建SpringMVC
使用Java配置
扩展(继承)AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自
动地配置DispatcherServlet和Spring应用上下文
使用 XML
web.xml 中配置Spring父容器 IoC -- ContextLoaderListener
web.xml 中配置SpringMVC子容器 -- DispatcherServlet
两个应用上下文
当DispatcherServlet启动的时候,它会创建Spring应用上下文,并加载配置文件或配置类中所声明的bean。
ContextLoaderListener上下文
PS:这两个上下文,都会随AbstractAnnotationConfigDispatcherServletInitializer创建
启用SpringMVC
XML方式:<mvc:annotation-driven>启用注解驱动的Spring MVC
配置类添加@EnableWebMvc注解
增强功能
配置视图解析器,如 InternalResourceViewResolver
启用组件扫描 @ComponentScan
忽略静态资源
编写基本的控制器
使用@Controller注解标识控制器
方法上添加了@RequestMapping注解,声明要处理的请求
@RequestMapping 还可以应用到类上,方法上如果有会进行叠加
最后 return 一个视图名(String)
传递模型数据到视图
1.方法中给定了一个Model作为参数,然后调用addAttribute()方法添加数据
2.直接 return List 等其他对象,模型的 key 会根据其类型推断得出,而逻辑视图的名称将会根据请求路径推断得出(去掉开头的斜线)
3.方法中给定个 Map 对象
PS:当视图是JSP的时候,模型数据会作为请求属性放到请求(request)之中
接受请求的输入
数据传送方式
1.查询参数(Query Parameter)
2.表单参数(Form Parameter)
3.路径变量(Path Variable)
查询参数
在方法的形参使用@RequestParam注解
Value对应请求的key,可设置defaultValue属性
请求的key和形参名一样的话可以省略定义 Value,直接加个注解即可
路径参数
形如:/spittles/12345
在 @RequestMapping 中使用占位符:@RequestMapping(value="/spittles/{sid}")
在方法参数前使用 @PathVariable("sid") 注解获取
方法的参数名与占位符的名称相同可省略 val
处理表单
如果没有设置action属性,则提交到当前地址
使用重定向:返回的视图格式中的“redirect:”前缀表示要将其解析为重定向的规则,而不是视图的名称;
类似的还有 “forward:”前缀
控制器方法参数直接写对应的对象,会使用请求中的同名参数进行填充
校验表单
从Spring 3.0开始,在Spring MVC中提供了对Java校验API的支持
要保证在类路径下包含这个Java API的实现即可,比如Hibernate Validator
启用校验
控制器方法参数对象前使用@Valid注解
需要有一个 Errors 参数,其要紧跟在带有@Valid注解的参数后面
在Spitter属性上添加校验限制并不能阻止表单提交
如果有错误的话,Errors.hasErrors()将会返回 true,需要手动调用这个来检查是否有误
测试
Spring现在包含了一种mock Spring MVC并针对控制器执行HTTP请求的机制
分支主题
Java校验API注解(可放到属性上)
@AssertFalse 所注解的元素必须是Boolean类型,并且值为 false
@AssertTrue 所注解的元素必须是Boolean类型,并且值为 true
@DecimalMax 所注解的元素必须是数字,并且它的值要小于或等于给定的 BigDecimalString 值
@DecimalMin 所注解的元素必须是数字,并且它的值要大于或等于给定的 BigDecimalString 值
@Digits 所注解的元素必须是数字,并且它的值必须有指定的位数
@Future 所注解的元素的值必须是一个将来的日期
@Max 所注解的元素必须是数字,并且它的值要小于或等于给定的值
@Min 所注解的元素必须是数字,并且它的值要大于或等于给定的值
@NotNull 所注解元素的值必须不能为 null
@Null 所注解元素的值必须为 null
@Past 所注解的元素的值必须是一个已过去的日期
@Pattern 所注解的元素的值必须匹配给定的正则表达式
@Size 所注解的元素的值必须是 String 、集合或数组,并且它的长度要符合给定的范围
可以使用 message 来自定义提示信息,可以使用 {} 占位符从ValidationMessages.properties 获取
可进行国际化配置,配置文件中可使用 {min} 和 {max} 等占位符来避免硬编码
使用Spring Web Flow
Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序;
Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序,它将流程的定义与实现流程行为的类和视图分离开来
配置流程执行器
使用<flow:flow-executor>元素会创建一个流程执行器
当用户进入一个流程时,流程执行器会为用户创建并启动一个流程执行实例。当流程暂停的时候(如为用户展示视图时),流程执行器会在用户执行操作后恢复流程。
配置流程注册表
使用<flow:flow-registry>配置流程注册表
分支主题
分支主题
处理流程请求
需要一个FlowHandlerMapping来帮助DispatcherServlet将流程请求发送给Spring Web Flow
分支主题
FlowHandlerAdapter等同于Spring MVC的控制器,它会响应发送的流程请求并对其进行处理
分支主题
流程组件
状态
状态(State)是流程中事件发生的地点
流程中的状态是业务逻辑执行、做出决策或将页面展现给用户的地方
就像公路旅行中停下来的地点
转移
连接这些点的公路
通过转移的方式从一个状态到另一个状态
流程数据
在流程处理中,它要收集一些数据
关于状态
行为(Action) 行为状态是流程逻辑发生的地方
<action-state>元素来声明
一般都会有一个<evaluate>作为子元素。<evaluate>元素给出了行为状态要做的事情
在2.1+版本中使用的是SpEL
决策(Decision) 决策状态将流程分成两个方向,它会基于流程数据的评估结果确定流程方向
通过<decision-state>元素进行定义
通过 <if> 判断来产生分支
结束(End) 结束状态是流程的最后一站。一旦进入End状态,流程就会终止
使用 <end-state> 来进行定义
子流程(Subflow) 子流程状态会在当前正在运行的流程上下文中启动一个新的流程
<subflow-state>允许在一个正在执行的流程中调用另一个流程
视图(View) 视图状态会暂停流程并邀请用户参与流程
<view-state>用于定义视图状态
关于转移
使用<transition>元素来进行定义
作为各种状态的子元素
可以配置全局转移 <global-transitions>
关于流程数据
使用 <var> 来定义,变量始终是流程作用域的
使用 <set> 和 <evaluate>元素,可以指定作用域
作用域
Conversation 最高层级的流程开始时创建,在最高层级的流程结束时销毁。被最高层级的流程和其所有的子流程所共享
Flow 当流程开始时创建,在流程结束时销毁。只有在创建它的流程中是可见的
Request 当一个请求进入流程时创建,在流程返回时销毁
Flash 当流程开始时创建,在流程结束时销毁。在视图状态渲染后,它也会被清除
View 当进入视图状态时创建,当这个状态退出时销毁。只在视图状态内是可见的
.jspx、${flowExecutionKey} 等
渲染Web视图
Spring中的视图解析器
BeanNameViewResolver 将视图解析为Spring应用上下文中的bean,其中bean的ID与视图的名字相同
ContentNegotiatingViewResolver 通过考虑客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器
FreeMarkerViewResolver 将视图解析为FreeMarker模板
InternalResourceViewResolver 将视图解析为Web应用的内部资源(一般为JSP)
JasperReportsViewResolver 将视图解析为JasperReports定义
ResourceBundleViewResolver 将视图解析为资源bundle(一般为属性文件)
TilesViewResolver 将视图解析为Apache Tile定义,其中tile ID与视图名称相同。注意有两个不同的 TilesViewResolver 实现,分别对应于Tiles 2.0和Tiles 3.0
UrlBasedViewResolver 直接根据视图的名称解析视图,视图的名称会匹配一个物理视图的定义
VelocityLayoutViewResolver 将视图解析为Velocity布局,从不同的Velocity模板中组合页面
VelocityViewResolver 将视图解析为Velocity模板
XmlViewResolver 将视图解析为特定XML文件中的bean定义。类似于 BeanNameViewResolver
XsltViewResolver 将视图解析为XSLT转换后的结果
Spring的JSP库
表单相关
分支主题
<sf:checkbox> 渲染成一个HTML <input> 标签,其中 type 属性设置为 checkbox
<sf:checkboxes> 渲染成多个HTML <input> 标签,其中 type 属性设置为 checkbox
<sf:errors> 在一个HTML <span> 中渲染输入域的错误
<sf:form> 渲染成一个HTML <form> 标签,并为其内部标签暴露绑定路径,用于数据绑定
<sf:hidden> 渲染成一个HTML <input> 标签,其中 type 属性设置为 hidden
<sf:input> 渲染成一个HTML <input> 标签,其中 type 属性设置为 text
<sf:label> 渲染成一个HTML <label> 标签
<sf:option> 渲染成一个HTML <option> 标签,其 selected 属性根据所绑定的值进行设置
<sf:options> 按照绑定的集合、数组或Map,渲染成一个HTML <option> 标签的列表
<sf:password> 渲染成一个HTML <input> 标签,其中 type 属性设置为 password
<sf:radiobutton> 渲染成一个HTML <input> 标签,其中 type 属性设置为 radio
<sf:radiobuttons> 渲染成多个HTML <input> 标签,其中 type 属性设置为 radio
<sf:select> 渲染为一个HTML <select> 标签
<sf:textarea> 渲染为一个HTML <textarea> 标签
校验失败会自动回显数据,Collection 中需要将对象数据模型装填到 Mode 中
通用标签库
分支主题
<s:bind> 将绑定属性的状态导出到一个名为 status 的页面作用域属性中,与 <s:path> 组合使用获取绑定属性的值(废弃,被表单相关取代)
<s:escapeBody> 将标签体中的内容进行HTML和/或JavaScript转义
<s:hasBindErrors> 根据指定模型对象(在请求属性中)是否有绑定错误,有条件地渲染内容
<s:htmlEscape> 为当前页面设置默认的HTML转义值
<s:message> 根据给定的编码获取信息,然后要么进行渲染(默认行为),要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过使用 var 和 scope 属性实现)
<s:nestedPath> 设置嵌入式的path,用于 <s:bind> 之中
<s:theme> 根据给定的编码获取主题信息,然后要么进行渲染(默认行为),要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过使用 var 和 scope 属性实现)
<s:transform> 使用命令对象的属性编辑器转换命令对象中不包含的属性
<s:url> 创建相对于上下文的URL,支持URI模板变量以及HTML/XML/JavaScript转义。可以渲染URL(默认行为),也可以将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过使用 var 和 scope 属性实现)
<s:eval> 计算符合Spring表达式语言(Spring Expression Language,SpEL)语法的某个表达式的值,然后要么进行渲染(默认行为),要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过使用 var 和 scope 属性实现)
HTML转义:htmlEscape属性
JavaScript转义:javaScriptEscape属性
Apache Tiles布局引擎
解决页面的重用问题
TilesConfigurer bean,它会负责定位和加载Tile定义并协调生成Tiles
TilesViewResolver bean 将逻辑视图名称解析为Tile定义
可以使用Ant风格的通配符(**)
使用Thymeleaf
它是Jsp的挑战者
JSP最明显的问题在于它看起来像HTML或XML,但它其实上并不是
JSP规范是与Servlet规范紧密耦合的
优点
原生的,不依赖于标签库
能在接受原始HTML的地方进行编辑和渲染
它没有与Servlet规范耦合
配置Thymeleaf视图解析器
ThymeleafViewResolver:将逻辑视图名称解析为Thymeleaf模板视图;
SpringTemplateEngine:处理模板并渲染结果;
TemplateResolver:加载Thymeleaf模板。
使用
“@{}”表达式
使用Thymeleaf的Spring方言
“*{}”表达式,为所有的表单域绑定后端对象,选择表达式
“${}”表达式,变量表达式 // OGNL
SpringMVC高级技术
添加其他Servlet和Filter
实现Spring的WebApplicationInitializer接口(addServlet 和 addFilter 方法)
如果要映射到DispatcherServlet上的话,直接重载AbstractAnnotationConfigDispatcherServletInitializer的getServletFilters()方法
使用Web.xml配置上下文
分支主题
DispatcherServlet会根据Servlet的名字找到一个文件,并基于该文件加载应用上下文,上面的例子中就是从 “WEB-INFappServlet-context.xml”加载,也可以手动指定:Servlet 节点中配置 init-param
使用Java配置文件
分支主题
处理multipart形式的数据
配置multipart解析器
CommonsMultipartResolver:使用Jakarta Commons FileUpload解析multipart请求
CommonsMultipartResolver 不会强制要求设置临时文件路径。默认情况下,这个路径就是Servlet容器的临时目录。
如需要自定义,需要在创建 Bean 时进行指定
StandardServletMultipartResolver:依赖于Servlet 3.0对multipart请求的支持(始于Spring 3.1)
直接配一个空构造的Bean即可
通过Dynamic的setMultipartConfig配置
或者重载customizeRegistration()方法配置
web.xml来配置MultipartConfigElement的话,那么可以使用<servlet>中的<multipart-config>元素
处理multipart请求
最常见的方式就是在某个控制器方法参数上添加@RequestPart注解
可以使用 byte[] 来接收,如果用户提交表单的时候没有选择文件,那么这个数组会是空(而不是null)
Spring还提供了MultipartFile接口,它为处理multipart数据提供了内容更为丰富的对象
Spring MVC也能接受javax.servlet.http.Part作为控制器方法的参数(Servlet3.0+)
MultipartFile的一个替代方案,他们很相似
只有使用MultipartFile的时候,我们才需要MultipartResolver
处理异常
异常转换为响应方式
特定的Spring异常将会自动映射为指定的HTTP状态码;
异常上可以添加@ResponseStatus注解,从而将其映射为某一个HTTP状态码;
分支主题
在方法上可以添加@ExceptionHandler注解,使其用来处理异常
分支主题
它能处理同一个控制器中所有处理器方法所抛出的异常
为控制器添加通知
运用到整个应用程序的所有控制器中,应用到带有@RequestMapping注解的方法上
控制器通知(controlleradvice)是任意带有@ControllerAdvice注解的类
包含方法
@ExceptionHandler注解标注的方法;
@InitBinder注解标注的方法;
@ModelAttribute注解标注的方法
PS:并非要全部定义
注解本身已经使用了@Component
重定向传递数据
使用URL模板以路径变量和/或查询参数的形式传递数据
构建URL或SQL查询语句的时候,使用String连接是很危险的
使用占位符(自动转义):redirect:/app/user/{uid}
模型中没有匹配的占位符时,会自动以查询参数的形式附加到重定向URL上
通过flash属性发送数据
原理:在重定向发生之前将数据放到会话中,并在重定向后,从会话中将其取出。
当然,还要在重定向后在会话中将其清理掉
Spring提供了通过RedirectAttributes设置flash属性的方法
addFlashAttribute()方法来添加flash属性;不设置 key 会自动推断
另外,可以使用父类 Mode 的 addAttribute() 方法添加普通属性
Collection 在从数据库中查找之前,它会首先从模型中检查对象
分支主题
收藏
0 条评论
下一页