SpringMVC 允许多种方式将客户端的数据传送到控制器的处理器方法中,包括:
*.查询参数
*.表单参数
*.路径变量
表单校验:可以使用Spring 对Java 校验API(Java Validation API,又称JSR-303),需要添加两个依赖:javax.validation.constrains 和 hibernate-validator
1.对于校验,需要在entity中添加注解@NotNull,表示不能为空;@Min 指定最小值1,并指定错误提醒,后面附上其他校验注解
Student 类:
public class Student {
private String id;
@NotNull
private String name;
@Min(value = 1, message = "年龄太小。。。")
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
//getter and setter
}
2.service 层接口与实现
public interface StudentService {
public List<Student> getStudents(int page, int count);
public Student getOne(String stuId);
public void save(Student student);
}
@Service
public class StudentServiceImpl implements StudentService {
@Override
public List<Student> getStudents(int page, int count) {
List<Student> list = new ArrayList<Student>();
for(int i = (page-1)*count+1; i <= count*page; i++) {
list.add(new Student(i + "", i + "", (int)(new Random().nextInt(25))));
}
return list;
}
@Override
public Student getOne(String stuId) {
//假设查询了
return new Student(stuId+"", "qqq", (int)(new Random().nextInt(20)));
}
@Override
public void save(Student student) {
System.out.println("保存数据");
}
}
3.控制层
参数接收的三种方法:
* 1.@RequestParam 方法来接收请求参数:必须有value值,为了不为空可设置defaultValue
* 2.通过路径参数接收,mapping 中使用{}来指定参数,@PathVariable,
* 3.表单参数,注意属性名要相同,自动封装在一个对象中,如processRegistration 方法
校验表单:
* 1.添加依赖:javax.validation.constrains 和 hibernate-validator。
* 2.通过@Valid 注解指定校验的参数,这里是Student 对象,前面在Student 类中的属性添加了@NotNull 和@Min 注解会校验,并且必须在此参数后面添加多一个参数Errors 或 BindingResult,可根据它的hasErrors 来判断是否有错误。
重定向:return "redirect:/....."。
@Controller
@RequestMapping("student")
public class StudentController {
@Autowired
private StudentService studentService;
/**
* 使用@RequestParam 方法来接收请求参数
* @param page
* @param count
* @return
*/
@RequestMapping(value = "/students", method = RequestMethod.GET)//默认是请求路径+jsp,即student/students
public List<Student> getStudents(
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "count", defaultValue = "5") int count) {
System.out.println(page + "," + count);
return studentService.getStudents(page, count);//默认返回的key名为 studentList,因为List<Student>
}
/**
* 使用占位符,通过路径参数接收,{stuId}与@PathVariable("stuId")绑定,把值传递给参数stuId
* @param stuId
* @param model
* @return
*/
@RequestMapping(value = "/{stuId}", method = RequestMethod.GET)
public String student(
@PathVariable("stuId") String stuId,//@PathVariable不指定value的话,默认与方法参数名相同
Model model) {
model.addAttribute(studentService.getOne(stuId));
return "student/profile";
}
@RequestMapping(value = "/registerjsp", method = RequestMethod.GET)
public String showRegister() {
return "student/register";
}
/**
* Spring对 java 校验API(Java Validation API,又称 jsr-303),需要导包,包括javax.validation.constrains 和 hibernate-validator。
* @param student
* @param bindingResult
* @return
*/
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String processRegistration(@Valid Student student, BindingResult bindingResult) {//传过来的参数保存到对象中,使用默认构造器,getter和setter方法。
System.out.println(student.getName());
System.out.println(student.getAge());
if(bindingResult.hasErrors()) {
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return "student/register";
}
studentService.save(student);
return "redirect:/student/" + student.getId();
}
}
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式