SpringMVC学习笔记(二)

springmvc框架:

DispatcherServlet 前端控制器:接收request,进行response

HandlerMapping 处理器映射器:根据url查找Handler(通过xml配置方式或注解方式)

HandlerAdapter 处理器适配器:决定了用何种特定规则去编写和之后执行Handler。

Handler处理器(后端控制器):需要程序员编写,常用注解开放方式。
Handler处理器执行后结果是ModelAndView,具体开发是Handler返回方法值类型包括:
ModelAndView
String(逻辑视图名)
void(通过在Handler形参中添加request和response,类似原始Servlet开发,注意:可以通过指定response响应的结果类型实现json数据传输)

经过处理器适配器后都会变成ModelAndView

ViewResolver视图解析器:根据逻辑视图名生成真正的视图(在springmvc中使用View对象表示)
注解开发:
使用注解方式的处理器映射器和适配器:

<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
在实际开发中,使用< mvc:annotation-driven> 代替上边处理器映射器和适配器配置。

@controller 注解必须要加,作用:标识一个Handler处理器。
@requestMapping 注解必须要加,作用:
1、对url和Handler的方法进行映射。
2、可以窄化请求映射,设置Handler的根路径,URL就是根路径+自路径请求方式
3、可以限制http请求的方法
@RequestMapping(value=”/editItems”,method={RequestMethod.POST,RequestMethod.GET})
映射成功后,springmvc框架生成一个Handler对象,对象中只包括一个映射成功的method。

注解开发中参数绑定:
将request请求过来的key/value的数据(理解一个串),通过转换(参数绑定的一部分),将key/value串转成形参,将转换后的结果传给形参(整个参数绑定过程)。

springmvc支持的参数绑定:
1、默认支持很多类型:HttpServlet、response、session、model、modelMap(将模型数据填充到request域)
2、支持简单数据类型,整形、字符型、日期
只要保证request请求的参数名和形参名称一致,自动绑定成功
如果request请求的参数名和形参名称不一致,可以使用@RequestParam(指定request请求的参数名),@RequestParam加在形参的前边。
3、支持pojo类型
只要保证Request请求的参数名称和pojo中的属性名一致,自动将Request请求的参数设置到pojo的属性中。
注意:形参中既有pojo类型又有简单类型,参数绑定互不影响。

自定义参数绑定:
日期类型绑定自定义:
定义Converter<源类型,目标类型> 接口实现类,比如:
Converter< String,Data >表示:将请求的日期数据串转成Java中的日期类型。
注意:要转换的目标类型一定和接收的pojo中的属性类型一致。

将定义的Converter实现类注入到处理器适配器中。

<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<!-- conversionService --www.yuheng119.com/>
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
</list>
</property>
</bean>
springmvc和strut2区别:
springmvc面向方法开发(接近service接口的开发方式),strut2面向类开发。
springmvc可以单例开发,strut2只能是多例开发。

1、Validation校验

b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的,本节主要学习springmvc实现控制层添加校验。
Spring3支持JSR-303验证框架,JSR-303 是Java EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是hibernate Validator(与Hibernate ORM 没有关系),www.22yigouyule.cn/ JSR 303 用于对Java Bean 中的字段的值进行验证。

服务端校验:
控制层controller:校验页面请求的参数的合法性。在服务端控制层controller校验,不区分客户端类型(浏览器、手机客户端、远程调用)
业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。
持久层dao:一般是不校验的。
1.1 需求

在商品信息修改提交时对商品信息内容进行校验,例如商品名称必须输入,价格合法性校验。

1.2 加入jar包

hibernate的校验框架validation所需要jar包:
这里写图片描述

1.3 配置校验器

springmvc.xml

<!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- hibernate校验器 --www.xuancayule.com>
<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</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" http://www.gouyily.cn//>
</bean>
1.4 将validator加到处理器适配器

1.4.1 方式一

增加 validator=”validator” 属性

<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>
1
1
1.4.2 方式二

<!-- 自定义webBinder -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator" ref="validator" />
</bean>
<!-- 注解适配器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder"></property>

1.5 添加验证规则

public class Items {
//验证明名称在1到30字符中间
//message是提示校验出错显示的信息
@Size(min=1,max=30,message="{items.name.length.error}")
private String name;

//非空验证
@NotNull(message="{items.createtime.isNull}www.yigouyule2.cn/")
private Date createtime;
11
1.6 CustomValidationMessages.properties

在classpath下,新建CustomValidationMessages.properties文件,配置校验错误信息:

#添加校验错误提交信息
items.name.length.error=请输入1到30个字符的商品名称
items.createtime.isNull=请输入商品的生产日期

如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”添加propedit插件。

1.7 捕获错误

修改Controller方法:

@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,Integer id,@Validated ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception{
//获取校验错误信息
if(bindingResult.hasErrors()){
//输出错误信息
List<ObjectError> allErrors=bindingResult.getAllErrors();
for(ObjectError objectError : allErrors ){
System.out.println(objectError.getDefaultMessage());
}
//将错误信息传到页面
model.addAttribute("allErrors",allErrors);
return "items/editItems";
}

//调用service更新商品信息,页面需要将商品信息传到此
itemsService.updateItems(id, itemsCustom);

return "success";

3
商品修改页面显示错误信息:

<!-- 显示错误信息 -->
<c:if test="${allErrors!=null }">
<c:forEach items="${allErrors }" var="error">
${error.defaultMessage }
</c:forEach>
<
6
1.8 分组校验

1.8.1需求

在pojo中定义校验规则,而pojo是被多个 controller所共用,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。

解决方法:
定义多个校验分组(其实是一个java接口),分组中定义有哪些规则
每个controller方法使用不同的校验分组

1.8.2 校验分组

新建接口ValidGroup1.class和ValidGroup2.class

public interface ValidGroup1 {
//接口中不需要定义任何方法,仅是对不同的校验规则进行分组

public interface ValidGroup2 {
//接口中不需要定义任何方法,仅是对不同的校验规则进行分组

1.8.3 在验证规则中添加分组

public class Items {

//验证明名称在1到30字符中间
//message是提示校验出错显示的信息
@Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})
private String name;

//非空验证
@NotNull(message="{items.createtime.isNull}",groups={ValidGroup2.class})
private Date createtime;
...

1.8.4 在controller方法使用指定分组的校验

@Validated(value={ValidGroup1.class})

public String editItemsSubmit(Model model,Integer id,@Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception{
}
1
2
1
2
在@Validated中添加value={ValidGroup1.class}表示商品修改使用了ValidGroup1分组校验规则,也可以指定多个分组中间用逗号分隔,
@Validated(value={ValidGroup1.class,ValidGroup2.class })

1.9 校验注解

@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
2、数据回显

posted @ 2017-05-16 14:58  王二狗的人生  阅读(173)  评论(0编辑  收藏  举报