Spring表单标签
- 必须在JSP页面的开头处声明taglib指令.
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
- Spring常用表单标签
名称 | 说明 |
---|---|
<fm:form/> | 渲染表单元素 |
<fm:input/> | 输入框组件标签 |
<fm:password/> | 密码框组件标签 |
<fm:hidden/> | 隐藏框组件标签 |
<fm:textarea/> | 多行输入框组件标签 |
<fm:radiobutton/> | 单选框组件标签 |
<fm:checkbox/> | 复选框组件标签 |
<fm:select/> | 下拉列表组件标签 |
<fm:error/> | 显示表单数据校验所对应的错误信息 |
- <fm :form>标签属性
- modelAttribute
指定绑定的模型属性,默认为command
建议指定 - action
指定表单提交的目标URL
可不指定,则自动提交到获取表单页面的URL - method
GET
POST
- modelAttribute
- <fm:input/>标签属性
属性 | 说明 |
---|---|
path | 属性路径,表示表单对象属性,如userName、userCode等 |
cssClass | 表单组件对应的CSS样式类名 |
cssErrorClass | 当提交表单后报错(服务端错误),采用的CSS样式类 |
cssStyle | 表单组件对应的CSS样式 |
htmlEscape | 绑定的表单属性值是否要对HTML特殊字符进行转换,默认为true |
- 注:表单组件标签也拥有HTML标签的各种属性,比如:id、onclick等等,都可以根据需要,灵活使用
- 利用Spring自带的验证框架和JSR 303实现数据校验
- 数据校验注解详解:
约束 | 说明 |
---|---|
@NotEmpty | 被注释的元素不能是null和 " ",可以判断null和 “” |
@ NotNull | 被注释的元素必须不为null |
@Null | 被注释的元素必须为null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@DateTimeFormat(pattern = “”) | 日期时间格式 |
-
控制层和视图层
-
Controller
使用注解所声明的限制规则来进行数据的校验
处理方法的入参,标注@Valid注解和BindingResult参数 -
@Valid注解标示的参数后面,必须紧挨着一个BindingResult参数,否则Spring会在校验不通过时直接抛出异常
-
View
将验证的错误信息显示在页面中,进行相应的信息提示
使用fm:errors/标签在JSP页面显示错误信息
-
-
代码示例:
-
导入jar文件
- hibernate-validator-4.3.2.Final.jar
- jboss-logging-3.1.0.CR2.jar
- validation-api-1.0.0.GA.jar
-
视图层 jsp/provideradd1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@include file="/jsp/common/head.jsp"%>
<%@taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<div>
<fm:form modelAttribute="provider" method="post">
供应商编码:<fm:input path="proCode" /><br>
<fm:errors path="proCode" /><br>
供应商名称:<fm:input path="proName"/><br>
<fm:errors path="proName"/><br>
联系人:<fm:input path="proContact"/><br>
<fm:errors path="proContact"/><br>
联系电话:<fm:input path="proPhone" id="proContact"/>
<fm:errors path="proPhone"/><br><br>
<div>
- 控制层
@RequestMapping(value = "/addProvider" , method = RequestMethod.GET)
public String addProvider(@ModelAttribute("provider") Provider provider) {
return "jsp/provideradd1";
}
@RequestMapping(value = "/addProvider" , method = RequestMethod.POST)
public String addProvider(@Valid Provider provider, BindingResult result , MultipartFile workPicPath , HttpServletRequest request , Model model) {
if (result.hasErrors()){
return "jsp/provideradd1";
}
provider.setCreatedBy(((User) request.getSession().getAttribute(Constants.USER_SESSION)).getId());
provider.setCreationDate(new Date());
boolean flag = false;
flag = providerService.add(provider);
if (flag) {
return "redirect:query";
} else {
return "jsp/provideradd1";
}
}
- 实体类
public class Provider {
private Integer id; //id
@NotEmpty(message = "供应商名称不能为空")
private String proName; //供应商名称
@NotEmpty(message = "联系人不能为空")
private String proContact; //供应商联系人
REST风格
- Representational State Transfer,表述性状态转移,是一种软件架构风格。
- 通俗来说就是隐藏参数结构,只显示值,不显示键。
- 示例:
/**
* 正常情况下的访问链接
* http://localhost:8081/chaoshidingdan/login/rest?id=33
* REST风格、封装数据结构
* http://localhost:8081/chaoshidingdan/login/rest/33
*
* /rest/{id}:URL中的{xxx}占位符参数
* @PathVariable String id :接收REST风格URL中的参数
*/
@RequestMapping("/rest/{id}")
public void testRest(@PathVariable String id , Model model){
logger.info("==========================================");
logger.info(id);
}
文件上传
SpringMVC—文件上传
- MultipartResolver接口
- 用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作。
- 两个实现类
- StandardServletMultipartResolver
- 使用了Servlet3.0标准的上传方式。
- CommonsMultipartResolver
- 使用了Apache的commons-fileupload来完成具体的上传操作。
- StandardServletMultipartResolver
步骤
- 导入jar文件
- commons-io-2.4.jar
- commons-fileupload-1.2.2.jar
- 配置MultipartResolver(springmvc-servlet.xml)
- 使用CommonsMultipartResolver配置一个MultipartResolver解析器。
<!--配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置文件上传大小限制和文件编码-->
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
-
编写文件上传表单页
- method=“POST”
- enctype=“multipart/form-data”
- 指定表单内容类型,支持文件上传
- <input type=“file” name=“a_idPicPath”/>
- 用来上传文件的file组件
-
编写控制器、处理上传的文件。
- MultipartFile:Spring MVC会将上传文件绑定到MultipartFile对象中,并通过该对象完成文件的上传操作
提供的方法。 - File.separator:适应路径分隔符,低入侵性的代码实现。
- MultipartFile:Spring MVC会将上传文件绑定到MultipartFile对象中,并通过该对象完成文件的上传操作
@RequestMapping(value = "/addProvider" , method = RequestMethod.POST)
public String addProvider(MultipartFile workPicPath , HttpServletRequest request , Model model) {
// 判断文件是否为空
if (workPicPath.isEmpty()){
model.addAttribute("errorUploadImg" , "文件上传失败");
return "";
}
// 路径和名称
String path = request.getServletContext().getRealPath("images");
String fileName = System.currentTimeMillis() + workPicPath.getOriginalFilename();
File file = new File("F:" , fileName);
try {
// 把上传的文件复制到file中
workPicPath.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}
}
多文件上传思路
- 上传文件的组件名一致,以数组的形式传递给控制器的处理方法。
<label for="a_idPicPath">证件照:</label>
<input type="file" name="attachs" id="a_idPicPath"/>
<label for="a_workPicPath">工作证照片:</label>
<input type="file" name="attachs" id="a_workPicPath"/>
-
控制器-处理方法
- 修改入参MultipartFile为数组:MultipartFile[] attachs
- MultipartFile[] 数组内存放文件对象顺序:按照form表单的file标签的顺序进行存储。
- 若入参对象MultipartFile为数组时,该参数前面必须要加上@RequestParam注解,否则会报错。
-
多文件上传也可采用单独入参。
- jsp页面
<label for="a_idPicPath">证件照:</label>
<input type="file" name="a_idPicPath" id="a_idPicPath"/>
<label for="a_workPicPath">工作证照片:</label>
<input type="file" name=" a_workPicPath" id="a_workPicPath"/>
- 后端控制器
public void add(@RequestParam(value="a_idPicPath",required=false) MultipartFile idPicFile ,
@RequestParam(value="a_workPicPath",required=false) MultipartFile workPicFile)
)