SpringMVC数据校验及访问数据模型

来源:互联网 发布:学生考试成绩分析软件 编辑:程序博客网 时间:2024/05/29 18:04

一、数据校验框架

1.1什么是数据校验?
为保证数据的完整性进行的一种验证操作,比如用户注册时用户名、密码不能为空……用户登录时,用户名、密码都要跟数据库中的一样才能登录成功……这些都叫校验。
前台验证:没有经过数据库,在页面做简单验证(不安全,可以通过一些手段绕过,要想安全需要用HTTPS)
后台验证:必须经过数据库,会提交到后台(安全的)
1.2JSR 303框架
特点是使用注解校验,JSR303 用于对JavaBean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来,是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回一般用于表单提交页面(如用户名必填、只能由数字字母组成等等)。Spring 3.0拥有自己独立的数据校验框架,同时支持JSR 303标准的校验框架。Spring 的DataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。在Spring MVC中,则可直接通过注解驱动的方式进行数据校验。Spring的org.springframework.validation是校验框架所在的包

1.3JSR303 校验框架注解类:
@NotNull 注解元素必须是非空
@Null 注解元素必须是空
@Digits 验证数字构成是否合法
@Future 验证是否在当前系统时间之后
@Past 验证是否在当前系统时间之前
@Max 验证值是否小于等于最大指定整数值
@Min 验证值是否大于等于最小指定整数值
@Pattern 验证字符串是否匹配指定的正则表达式
@Size 验证元素大小是否在指定范围内
@DecimalMax 验证值是否小于等于最大指定小数值
@DecimalMin 验证值是否大于等于最小指定小数值
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
HibernateValidator 扩展
HibernateValidator扩展注解类:

@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
注意:null不占空间,””后也会有\0,表示字符串,会占空间
@NotNull:属性名!=null
@NotEmpty:属性名!=null && !属性名.equals(“”)

1.4后台验证步骤
1.javabean添加验证注解
2.action中使用@Valid表示javabean,使用Errors或BindingResult判断是否验证失败
3.会出现jar包冲突(版本4.3.2)

二、访问数据模型
2.1层级结构:必须配置在spring.xml中
这里写图片描述
2.2数据模型访问结构
2.2.1访问数据模型:ModelAndView
ModelAndView:绑定数据到视图(ModelMap用于传递数据到view对象用于跳转)
2.2.2访问数据模型:@ModelAttribute
SpringMVC 中Model相关的对象是处理和数据相关的对象。
@ModelAttribute:用于重命名参数数据
2.2.3访问数据模型:Map及Model
对象Model:传递数据到视图(request.setAttribute)
对象ModeMap:LinkedHashMap的子类
Map:建议用Map传值
2.2.2访问数据模型:@SessionAttributes
如果希望在多个请求之间共用某个模型属性数据,则可以在控制器类标注一个 @SessionAttributes,Spring MVC会将模型中对应的属性暂存到HttpSession中。
请求转发:forword
请求重定向:redirect(使用sessionAttributes方式用于在重定向中传值,将值存储在session中,用完要清除)
2.2.3对入参标注@ModelAttribute(“xxx”)的处理方法(@ModelAttribute(“user”) User user):
1)如果隐含模型拥有名为xxx的属性,将其赋给该入参,再用请求消息填充该入参对象直接返回,否则到2步 。
2)如果xxx是会话属性,即在处理类定义处标注了@SessionAttributes(“xxx”),则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出HttpSessionRequiredException异常。否则到 3。
3)如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参的对象实例,再用请求消息填充该入参。

三、SpringMVC视图解析
这里写图片描述
在Spring Web MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring Web MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义了resolverViewName方法,根据viewName创建合适类型的View实现
视图解析器ViewResolver:是把一个逻辑上的视图名称解析为一个真正的视图
视图View:是用于处理视图,然后返回给客户端
Spring 默认提供了多种视图解析器,比如,我们可以使用最常用解析器 InternalResourceViewResolver 来查找 JSP 视图(与之相对应的视图类为 InternalResourceView)。通常,一个视图解析器只能查找一个或多个特定类型的视图,在遇到 Spring 不支持的视图或者我们要自定义视图查找规则的情况下,我们就可以通过扩展 Spring 来自定义自己所需的视图解析器。

常用视图解析器如下:
1:XmlViewResolver:接口ViewResolver的实现,从XML配置文件中查找视图实现(默认 XML 配置文件为 /WEB-INF/views.xml)
2:ResourceBundleViewResolver:接口ViewResolver的实现,用于从 properties 文件中查找视图
3:UrlBasedViewResolver:接口ViewResolver的实现,用于根据请求的URL路径返回相应的视图,该视图需为抽象类AbstractUrlBasedView的实现,它还有些子类,如InternalResourceView和JstlView 等
4:InternalResourceViewResolver:UrlBasedViewResolver的子类,通常用于查找 JSP和JSTL等视图
5:VelocityViewResolver /FreeMarkerViewResolver:UrlBasedViewResolver的子类分别用于支持Velocity(类VelocityView)和FreeMark视图(类 FreeMarkerView)
6:ContentNegotiatingViewResolver:接口ViewResolver的实现,用于根据请求文件的后缀名或请求的header中的accept字段查找视图
7:BeanNameViewResolver:在spring容器内查找实现了View接口的Bean,设置Bean的名称为逻辑视图名称

InternalResourceViewResolver是实际开发中最常用的,但在使用它的时候,通常要把它配置到最后一个,因为该视图解析器即使没有找到正确的文件,也会返回一个视图,而不是返回 null,这样优先级比该视图解析器低的解析器,将不会被执行。
UrlBasedViewResolver
基本功能
UrlBasedViewResolver是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要提供一种拼接URL的方式来解析视图,它可以通过prefix属性指定一个前缀,通过suffix属性指定一个后缀,然后把返回的逻辑视图名称加上指定的前缀和后缀就是视图的URL了。
AbstractCachingViewResolver介绍 :
这是一个抽象类,它会对它解析过的视图实现缓存的功能,这样可以把解析视图的性能问题降到最低。
URL在客户端跳转的配置,也就是redirect
可以在返回的视图名称中使用redirect:前缀,这样就可以支持在客户端的跳转,如当返回的视图名称是”redirect:login”的时候,URLBasedViewResolver发现返回的视图名称包含”redirect:”前缀,于是把返回的视图名称前缀”redirect:”去掉,后面的按照上面讲的方式来进行处理
同理可以使用forward:前缀来指定是forward跳转
使用UrlBasedViewResolver的时候必须指定属性viewClass,表示解析成哪种视图,一般使用较多的就是InternalResourceView,利用它来展现jsp,但是当我们使用JSTL的时候我们必须使用JstlView。

InternalResourceViewResolver
这个是最常用的,基本功能是:
它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持。它会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。
示例:

<bean id= "defaultViewResolver"class= "org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name= "viewClass"value= "org.springframework.web.servlet.view.JstlView"/>        <property name= "contentType" value= "text/html"/>        <property name= "prefix" value= "/WEB-INF/jsp/"/>        <property name= "suffix" value= ".jsp"/></bean>

四、SpringMVC本地化(国际化:跟浏览器有关)
一般情况下,Web应用根据客户端浏览器的设置判断客户端的本地化类型,用户可以通过IE菜单:工具→Internet选项…→语言…在打开的“语言首选项”对话框中选择本地化类型。
浏览器中设置的本地化类型会包含在HTML请求报文头中发送给Web服务器,确切地说是通过报文头的Accept-Language参数将“语言首选项”对话框中选择的语言发送到服务器,成为服务器判别客户端本地化类型的依据。
4.1SpringMVC的本地化解析器
1)AcceptHeaderLocaleResolver:根据HTTP报文头的Accept-Language参数确定本地化类型,如果没有显式定义本地化解析器,Spring MVC默认采用AcceptHeader- LocaleResolver。
 2)CookieLocaleResolver:根据指定Cookie值确定本地化类型。
 3)SessionLocaleResolver:根据Session中特定的属性值确定本地化类型。
 4)LocaleChangeInterceptor:从请求参数中获取本次请求对应的本地化类型。
这里写图片描述
配置国际化资源文件:
这里写图片描述
标签库:这里写图片描述
显示消息:
这里写图片描述
五、SpringMVC静态资源处理
原理图:
这里写图片描述
1.静态资源处理方式
配置:
web.xml让所有请求都由Spring MVC处理

<servlet>    <servlet-name>springServlet</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>springServlet</servlet-name>    <url-pattern>/</url-pattern></servlet-mapping>

2.物理静态资源路径映射逻辑资源路径

<mvc:resources mapping="/resources/**"  location="/"/>

这里写图片描述
location必须是存在的物理路径 /表示上下文根路径
mapping表示映射的地址 **表示目录下所有的文件及子文件
假设 存在WEB-INF/img/test.png 由于安全问题 WEB-INF是
无法直接访问 设置以下映射

<mvc:resources mapping="/img/**"  location="/WBE-INF/img/"/>

直接通过地址: http://localhost:8080/上下文路径/img/test.png访问
注意:spring4.2: servlet3.0(Javaee6)支持
spring4.0: servlet2.5(Javaee5)支持

六、自定义拦截器
过滤器:Servlet中的概念
拦截器:SpringMVC中的概念,DispatcherServlet是核心。
原理:拦截器是类似过滤器的拦截机制,过滤器用于拦截Servlet的一些资源,SpringMVC是通过Servlet实现的,它的中央处理器是DispatcherServlet,它实现了自己的一套过滤机制,专门用于拦截action,其必须实现接口HandleIntercept,包括preHandle、postHandle、afterCompletion三个方法。
这里写图片描述
七、解决重复提交

防止表单重复提交的几种策略:
1、js禁掉提交按钮。
表单提交后使用JavaScript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。
2、使用Post/Redirect/Get模式。
在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。
这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。
3、在session中存放一个特殊标志。
这里写图片描述

在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。这使web应用有了更高级的XSRF保护。
请见如下代码:
这里写图片描述
在mvc-servlet.xml中配置:
这里写图片描述

这里写图片描述

这里写图片描述
自定义标签,生成一个唯一的标识符,将它存入session
这里写图片描述

引用自定义标签
这里写图片描述


这里写图片描述
自定义拦截器TokenInterceptor 实现HandlerInterceptor接口里的方法:在action执行前执行preHandle方法(避免重复提交的逻辑)
这里写图片描述

这里写图片描述
4.使用header函数转向
除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。

if (isset($_POST['action']) && $_POST['action'] == 'submitted') {//处理数据,如插入数据后,立即转向到其他页面header('location:submits_success.PHP');}

这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。
5.表单过期的处理
在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。
1.使用header头设置缓存控制头Cache-control。
header(‘Cache-control: private, must-revalidate’); //支持页面回跳
2.使用session_cache_limiter方法。
session_cache_limiter(‘private, must-revalidate’); //要写在session_start方法之前
下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:
session_cache_limiter(‘nocache’);
session_cache_limiter(‘private’);
session_cache_limiter(‘public’);
session_start();
//以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空
将该段代码贴到所要应用的脚本顶部即可。
Cache-Control消息头域说明
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate和max-age。各个消息中的指令含义如表5-3所示。
表5-3
缓存指令 说 明
public 指示响应可被任何缓存区缓存
private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效
no-cache 指示请求或响应消息不能缓存
no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存
max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应
min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应
max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息
这里写图片描述

6.判断表单动作的技巧
表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑,要怎么判别使用者按下的按钮内容不过是个小问题。
其实只要通过提交按钮的name 就可以知道了,表单在提交出去的时候,只有按下的submit类型的按钮才会被送到表单数组去,所以只要判断按钮的值就可以知道使用者按下哪一个按钮

7、在数据库里添加约束。
在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。
你是如何克服数据重复提交问题的?你遇到过什么重复提交数据的现实例子吗?
使用客户端脚本
提到客户端脚本,经常使用的是JavaScript进行常规输入验证。在下面的例子中,我们使用它处理表单的重复提交问题,请看下面的代码:
这里写图片描述
当用户单击“提交”按钮后,该按钮将变为灰色不可用状态。
上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。

8.使用Cookie处理
使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单
如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意。

八、AJAX
8.1AJAX原理
Ajax 是Web 开发一个流行的词汇,全称 Asynchronous JavaScript and XML,异步的JavaScript和XML 。是几种技术的强强联合。
Ajax如何工作
Ajax(即异步 JavaScript 和 XML)是一种 Web 应用程序开发的手段,它采用客户端脚本与 Web 服务器交换数据。
为什么要学习Ajax
使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。

交互流程:
这里写图片描述

XMLHttpRequest对象简介:
1)XMLHTTPRequest对象是整个AJAX开发的基础
2)提供客户端和服务器异步通信的能力
3)能够向服务器发出请求
4)能够接收服务器的返回页面
5)最早出现在IE,随着应用的广泛,渐渐推广到其他浏览器中
6)为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject
这里写图片描述

发送请求:如需将请求发送到服务器,使用XMLHttpRequest对象的open()和send()方法
这里写图片描述
回调onreadystatechange事件:
当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。 readyState 属性存有 XMLHttpRequest 的状态信息。
这里写图片描述
8.2JAX开发步骤

8.3数据格式JSON
8.3.1什么是JSON
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式
JSON 独立于语言 *
JSON 具有自我描述性,更易理解
* JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
这里写图片描述
SpringMVC响应json
1)使用OutputStream直接输出:
这里写图片描述
2)使用消息转换器返回字节数组
这里写图片描述

使用MappingJackson2HttpMessageConverter转换器:
1)添加Jackson的json库

2)SpringMVC配置文件中配置消息转换器
这里写图片描述
3)在springmvc中返回被转换的数据类型 添加@ResponseBody注解
这里写图片描述

原创粉丝点击