使用 JSR303 进行校验,对校验信息进行国际化。对学生信息进行校验,至少用到五种不同的校验,校验失败在输入页面显示错误信息。给出全部详细的代码包括下面的(定义校验规则的 bean、 输入信息页面、准备数据 action、校验 action、校验信息资源文件)
时间: 2024-05-08 15:18:52 浏览: 106
我明白你的问题。你想要一个使用JSR303对学生信息进行校验的代码,它至少使用了五种不同的校验,并且在校验失败时在输入页面上显示错误信息。
下面是你需要的全部详细代码,我已经包括了定义校验规则的bean、输入信息页面、准备数据action、校验action和校验信息资源文件。
首先是定义校验规则的bean:
```java
import javax.validation.constraints.*;
public class Student {
@NotNull(message="{student.name.notNull}")
@Size(min=2, max=30, message="{student.name.size}")
private String name;
@NotNull(message="{student.age.notNull}")
@Min(value=18, message="{student.age.min}")
@Max(value=40, message="{student.age.max}")
private Integer age;
@Email(message="{student.email.email}")
private String email;
@Pattern(regexp="(^$|[0-9]{10})", message="{student.phone.pattern}")
private String phone;
@NotEmpty(message="{student.address.notEmpty}")
private String address;
// getters and setters
}
```
这个bean使用了五种不同的校验:`@NotNull`,`@Size`,`@Min`,`@Max`和`@NotEmpty`。注意,在bean中还包括了错误信息的国际化,例如`{student.name.notNull}`代表名为`name`的属性校验失败时应该显示的错误信息。
下面是输入信息页面:
```html
<!DOCTYPE html>
<html>
<head>
<title>学生信息</title>
</head>
<body>
<h1>学生信息</h1>
<form action="validateStudent.action" method="post">
<label>姓名</label>
<input type="text" name="name" /><br/>
<label>年龄</label>
<input type="text" name="age" /><br/>
<label>邮箱</label>
<input type="text" name="email" /><br/>
<label>电话</label>
<input type="text" name="phone" /><br/>
<label>地址</label>
<input type="text" name="address" /><br/>
<input type="submit" value="保存" />
</form>
<br/>
<c:if test="${not empty errors}">
<h2>错误信息</h2>
<ul>
<c:forEach items="${errors}" var="error">
<li><c:out value="${error}"/></li>
</c:forEach>
</ul>
</c:if>
</body>
</html>
```
页面包含了所有要验证的学生信息字段以及一个"保存"按钮。当表单提交时,它将调用`validateStudent.action` action 进行校验。如果校验失败,错误信息将在页面上显示。这个页面还使用了JSTL标签库,用于显示错误信息。
下面是准备数据的action:
```java
public class PrepareDataAction extends ActionSupport {
private List<String> addresses;
public String execute() {
addresses = new ArrayList<String>();
addresses.add("北京");
addresses.add("上海");
addresses.add("广州");
addresses.add("深圳");
return SUCCESS;
}
public List<String> getAddresses() {
return addresses;
}
public void setAddresses(List<String> addresses) {
this.addresses = addresses;
}
}
```
这个action用于准备地址列表并将其设置为页面上拉框中的选项。
下面是校验action:
```java
public class ValidateStudentAction extends ActionSupport implements ModelDriven<Student> {
private static final long serialVersionUID = 1L;
private Student student;
@Override
public Student getModel() {
if (student == null) {
student = new Student();
}
return student;
}
public String execute() {
//校验
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Validator validator = vf.getValidator();
Set<ConstraintViolation<Student>> set = validator.validate(student);
//收集错误信息
List<String> errors = new ArrayList<String>();
for (ConstraintViolation<Student> cv : set) {
errors.add(cv.getMessage());
}
//将错误信息传递给页面
if (errors.size() > 0) {
request.setAttribute("errors", errors);
return INPUT;
} else {
return SUCCESS;
}
}
}
```
这个action实现了`ModelDriven`接口,并使用JSR303校验传入的学生信息。如果校验失败,它将收集错误信息并将它们传递到输入页面。如果没有错误,则显示成功页面。
最后是校验信息资源文件:
```properties
student.name.notNull=姓名不能为空!
student.name.size=姓名长度必须在2到30之间!
student.age.notNull=年龄不能为空!
student.age.min=年龄必须大于等于18岁!
student.age.max=年龄必须小于等于40岁!
student.email.email=邮件格式不正确!
student.phone.pattern=电话号码必须为10位数字!
student.address.notEmpty=地址不能为空!
```
这个资源文件包含了校验规则失败时应该显示的信息,例如,如果`name`属性为null,则应该显示"姓名不能为空!"。
完整的代码已经给出,但是要注意,在实际使用中,您需要根据自己的需求进行一些修改,例如更改bean中的属性名称和类型、更改输入页面的布局和样式等等。
阅读全文