spring的概念就不说了 网上太多了 ,我们先来看看springMVC的流程
1. 用户发起请求到前端控制器(DispatcherServlet)
2. 前端控制器请求HandlerMapping查找Handler,可以根据xml配置、注解进行查找
3. 处理器映射器HandlerMapping 向前端控制器返回Handler
4. 前端控制器调用处理器适配器去执行Handler
5. 处理器适配器去执行Handler
6. Handler执行完成给适配器返回ModelAndView
7. 处理器适配器向前端控制器返回ModelAndView
8. 前端控制器请求试图解析器去进行试图解析,根据逻辑视图名解析成真正的试图
9. 试图解析器向前端控制器返回View
10. 前端控制器进行试图渲染 试图渲染将模型数据(在ModelAndView对象中)填充到request域
11. 前端控制器向用户响应结果。
springmvc和struts2的区别
1. springmvc基于方法开发,struts基于类开发的 。springmvc将url和controller方法映射,映射成功后springmvc生成一个Handler对象 , 对象中只包括了一个method 。方法执行结束,形参数据销毁。
2. springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例 ,只能使用多例 。
3. 经过实际测试 ,struts2速度慢 ,在于使用了struts标签,所以 如果使用了struts2建议使用jstl。
Validation
b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的,本节主要学习springmvc实现控制层添加校验。
Spring3支持JSR-303验证框架,JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。
需求 : 在商品信息修改提交时对商品信息内容进行校验,例如商品名称必须输入,价格合法性校验。
第一步 : 下载并解压 hibernate-validator
jboss-logging-3.1.0.CR2.jar
hibernate-validator-4.3.0.Final.jar
validation-api-1.0.0.GA.jar
第二步:在springmvc.xml中配置如下内容:
<!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器-->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages.properties</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
将validator加到处理器适配器
<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>
添加验证规则
public class Items {
private Integer id;
@Size(min=1,max=30,message="{item.name.length.error}")
private String name;
@NotEmpty(message="{pic.is.null}")
private String pic;
6.1.6 错误消息文件
CustomValidationMessages.properties
item.name.length.error=商品名称在1到30个字符之间
pic.is.null=请上传图片
捕获错误
Controller方法:
// 商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(@Validated @ModelAttribute("item") Items items,BindingResult result,
@RequestParam("pictureFile") MultipartFile[] pictureFile,Model model)
throws Exception {
//如果存在校验错误则转到商品修改页面
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
for(ObjectError objectError:errors){
System.out.println(objectError.getCode());
System.out.println(objectError.getDefaultMessage());
}
return "item/editItem";
}
注意:添加@Validated表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。
商品修改页面显示错误信息:
页头:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
在需要显示错误信息地方:
<spring:hasBindErrors name="item">
<c:forEach items="${errors.allErrors}" var="error">
${error.defaultMessage }<br/>
</c:forEach>
</spring:hasBindErrors>
说明:
<spring:hasBindErrors name="item">
表示如果item参数绑定校验错误下边显示错误信息。
上边的方法也可以改为:
在controller方法中将error通过model放在request域,在页面上显示错误信息:
controller方法:
if(bindingResult.hasErrors()){
model.addAttribute("errors", bindingResult);
}
页面:
<c:forEach items="${errors.allErrors}" var="error">
${error.defaultMessage }<br/>
</c:forEach>