1.类型转换器
Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型。 开发者在实际应用中使用框架内置的类型转换器基本上就够。
在日常的企业开发需求中,我们输入文本框的内容全部都是字符串类型,但是在后端处理的时候我们可以用其他基本类型来接受数据,也可以使用实体类来接受参数,这个是怎么完成的呢?就是通过SpringMVC提供的类型转换器,SpringMVC内部提供了非常丰富的类型转换器的支持.
对于自己构造类型转换器,需要做以下 5 件事:
1.创建实体类。
2.创建控制器类。
3.创建自定义类型转换器类。
4.注册类型转换器。
5.创建相关视图
这里不再展示,感兴趣的可以自己去了解一下
2.数据格式化
Spring 提供了两个可以用于格式化数字,日期和时间的注解@NumberFormat和 @DateTimeFormat,这两个标签可以用于javabean的属性或方法参数上。
@NumberFormat可以用来格式化任何的数字的基本类型(如int,long)或 java.lang.Number的实例(如 BigDecimal, Integer)。
@DateTimeFormat可以用来格式 化java.util.Date、java.util.Calendar和
java.util.Long类型.
要指定数字或日期/时间类型的属性,只需要在其上添加 @NumberFormat或 @DateTimeFormat注解可以了。
DateTimeFormat,互斥属性: iso。类型为DateTimeFormat.ISO
DateTimeFormat.ISO.DATE: 格式yyyy-MM-dd。
DateTimeFormat.ISO.DATE_TIME:格式yyyy-MM- dd HH:mm:ss .SSSZ。
DateTimeFormat.ISO.NONE: 表示不使用ISO格 式的时间。
NumberFormat pattern。
类型为String,使用自定义的数字格式化字符串,“##,###.##”,style。
类型为NumberFormat.Style,常用值:
1.Style.NUMBER正常数字类型
2.Style.PERCENT百分数类型
3.Style.CURRENCY 货币类型
需要将实现类改为:FormattingConversionServiceFactoryBean 才可以同时支持自定义类型转换器和格式化
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService"> </bean>
例子:
实体类对变量实现:
private Integer id; private String username; @DateTimeFormat(pattern ="yyyy-MM-dd") private Date birthday; @NumberFormat(style = NumberFormat.Style.CURRENCY) private Double balance; private String[] hobbies; @NumberFormat(pattern = "#,###.##") private Double salary; @NumberFormat(style = NumberFormat.Style.PERCENT) private Double taskCount;
3.数据校验
一般情况下我们会在前端页面实现数据的校验,但是大家需要注意的 是前端校验会存在数据的不安全问题,因此一般情况下我们都会使用前端校验 +后端校验的方式,这样的话既能够满足用户的体验度,同时也能保证数据的安 全,下面来说一下在springmvc中如何进行后端数据校验。
JSR303是 Java 为 Bean 数据合法性校验提供的标准,通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规 则,并通 j过标准的验证接口对 Bean 进行验证。 Hibernate Validator 实现了JSR349验证注解规范的技术 JSR303:
spring中拥有自己的数据校验框架,同时支持JSR303标准的校验框 架,可以在通过添加注解的方式进行数据校验。在spring中本身没有提供 JSR303的实现,需要导入依赖的包。
在maven仓库中导入相关依赖
示例:
@NotNull(message = "id不能为空") @Min(value=1,message = "id必须大于0") private Integer id; @NotEmpty(message = "用户名不能为空") @Length(min = 4,max = 8,message = "用户名的长度必须在{min}和{max}位之间") @Pattern(regexp="^[0-9a-zA-Z]+$",message = "用户名只能输入0-9或者a-z") private String username; @Past(message = "您难道穿越了吗?") @DateTimeFormat(pattern="yyyy/MM/dd") private Date birthday; @NumberFormat(style = NumberFormat.Style.CURRENCY ) //货币 private Double balance; //余额 ¥5000 private String[] hobbies; @NumberFormat(pattern = "#,###.##") @Range(min = 2000,max = 1000000,message = "工资必须在{min}和{max}之间") //Size的范围是int 不能用于验证Double private Double salary; //工资 10,000.00 @Range(min=0,max=100,message = "任务完成度必须在{min}和{max}之间") //Range的范围是Long所以,Range可以控制的范围更大 @NumberFormat(style = NumberFormat.Style.PERCENT) /*不加%会 *100来显示 加上会按你提交精度来显示*/ private Double taskCount;// 任务完成百分比 90%
4.Springmvc form标签
自动绑定,自动回显数据, 如果是新增的情况下也需要保证有该标签所需的对象 Form标签
- 支持全部http请求方法 比如method=”put” put\delete 提交方式
- 数据自动回显:需要使用modelAttribute指定数据的对象
- 使用path来双向绑定属性
- 动态数据绑定:Select 、 checkboxes、 radiobottons、都可以使用Items 制 定数据源 可以是list (当List的泛型是javaBean的时候需要制定itemValue和 itemLabel)、map(不需要制定itemValue和itemLabel)
add.jsp
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <form:form action="${pageContext.request.contextPath}/form/user" method="post" modelAttribute="user"> <p> id:<form:input path="id"></form:input><form:errors path="id"></form:errors> </p> <p> username:<form:input path="username"></form:input><form:errors path="username"></form:errors> </p> <p> birthday:<form:input path="birthday"></form:input><form:errors path="birthday"></form:errors> </p> <p> balance:<form:input path="balance"></form:input><form:errors path="balance"></form:errors> <p> salary:<form:input path="salary"></form:input><form:errors path="salary"></form:errors> </p> <p> taskCount:<input type="text" name="taskCount" value="${user.taskCount}"> </p> <p> hobbies: <form:checkbox path="hobbies" value="唱歌"></form:checkbox> <form:label path="hobbies">唱歌</form:label> <form:checkbox path="hobbies" value="跳舞"></form:checkbox> <form:label path="hobbies">跳舞</form:label> </p> <p> <form:button>提交</form:button> </p> </form:form>
UserControl 控制器类
@PostMapping("/form/user") public String springformAdd(@Valid User user, BindingResult result, Model model) { // 判断当前是否出现了错误 if(result.hasErrors()) { return "user/add"; } System.out.println(user); return "show"; }![请添加图片描述](https://ucc.alicdn.com/images/user-upload-01/ea66e7374f9146c0a5d0a8352f8897f6.gif) @GetMapping("/user/add") public String addview(User user){ return "user/add"; } }