作用
后端校验作为项目的第二道防线,拦截非法的数据访问至关重要。在这里就不多说为什么了。实战项目中常用。
准备工作
编辑器:eclipse,
基于编程语言:Java,
基于springMVC项目演示
实战第一种方式
我们今天的项目是登录、注册、显示联系人、添加联系人。首先我们来到添加联系人。
我们输入字段基本然后提交,在提交的瞬间要执行一个验证输入的输入是否符合要求,应该怎么做呢?
首先创建一个实体类
public class Link {
private int id;
private String name;
private String phone;
// get、set省略
}
然后我们就从这个实体类入手去验证。
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
public class Link {
private int id;
@NotBlank(message="姓名不允许为空")
@Length(min=2,message="姓名字符长度大于2")
private String name;
@NotBlank(message="电话号码不允许为空")
@Length(min=11,max=11,message="电话号码长度为11位")
@Pattern(regexp="^1(3|5|7|8|9)\\d{9}$", message="电话格式不符")
private String phone;
// get、set省略
}
可以看到我们给需要验证的字段加上注解,根据需要来加。文章后面也会附上部分常用的注解用法。message的内容后续将会被触发显示在页面,稍后演示。
然后创建一个
源码:
@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(@Valid Link link,BindingResult br){
// 如果这个参数有错误就让它转发回去
if (br.hasErrors()){
return "/link/add";
}
service.add(link);
return "redirect:/link/list";
}
直接实践,下面第一个是没校验的,第二个图是在什么也没输入的时候校验结果全部显示出来。
好,上面简单做了验证。但是验证远远没这么简单,除了添加、还有编辑、用户的登录和注册这些,他们之间验证又不一样。有些需要验证用户名和密码就可以了,有些除了用户名、密码还有爱好以及出生日期等等。那么下面我们来看第二种方式。
实战第二种方式
针对种种复杂情况springMVC团队让这个做法升了级。就是分组。先创建一个用户实体类并把验证写上。
源码:
public class User {
private Integer id;
@NotBlank(message="登录名不允许为空")
@Size(min=3,message="登录名长度大于3个以上")
private String loginName;
@NotBlank(message="密码不允许为空")
@Size(min=3,message="登录名长度大于3个以上")
private String loginPwd;
@NotBlank(message="爱好不允许为空")
private String hobbys;
@Past(message="出生日期要早于当前日期")
private Date birthday;
}
@RequestMapping(value="login", params={"loginName","loginPwd"}, method=RequestMethod.POST)
public String login(@Valid @ModelAttribute("uu") User user
,BindingResult br, Model model, HttpSession session){
// 框架自动做个这个事情,{“user”,是框架定的-按类名定的}
// request.setAttribute("user",new User());
// 所以页面<sf:errors path="user.loginName"></sf:errors>
// 我们其实也是可以指定他的名字的@ModelAttribute("uu")
if (br.hasErrors()){
return "login_page";
}
User u = service.login(user.getLoginName(), user.getLoginPwd());
if (u != null){
session.setAttribute("user", u);
return "redirect:/link/list";
}
// 要带数据到页面,基本离不开Model
// 登录不成功将数据返回页面,但是这种做法很low,使用${param.username}即可
model.addAttribute("err","用户名或密码不存在!");
return "login_page";
}
到这里就纳闷了,为什么用户名和登录密码都正确的情况下,会蹦出一个爱好的校验信息。其实这里是由于没有指定做某些操作就校验谁造成的。
然后代码改造,先创建两个分组。这两个分组其实就是普通的接口。
实体类改造如下
public class User {
private Integer id;
// groups表示分组谁用就在方法中引用这个分组,同时字段也要声明
@NotBlank(message="登录名不允许为空",groups={LoginGroup.class,RegGroup.class})
@Size(min=3,message="登录名长度大于3个以上",groups={LoginGroup.class,RegGroup.class})
private String loginName;
@NotBlank(message="密码不允许为空",groups={LoginGroup.class,RegGroup.class})
@Size(min=3,message="登录名长度大于3个以上",groups={LoginGroup.class,RegGroup.class})
private String loginPwd;
@NotBlank(message="爱好不允许为空",groups={RegGroup.class})
private String hobbys;
@Past(message="出生日期要早于当前日期",groups={RegGroup.class})
private Date birthday;
}
方法中
@RequestMapping(value="login", params={"loginName","loginPwd"}, method=RequestMethod.POST)
public String login(@Validated(value={LoginGroup.class}) @ModelAttribute("uu") User user
,BindingResult br, Model model, HttpSession session){
// 框架自动做个这个事情,{“user”,是框架定的-按类名定的}
// request.setAttribute("user",new User());
// 所以页面<sf:errors path="user.loginName"></sf:errors>
// 我们其实也是可以指定他的名字的@ModelAttribute("uu")
if (br.hasErrors()){
return "login_page";
}
User u = service.login(user.getLoginName(), user.getLoginPwd());
if (u != null){
session.setAttribute("user", u);
return "redirect:/link/list";
}
// 要带数据到页面,基本离不开Model
// 登录不成功将数据返回页面,但是这种做法很low,使用${param.username}即可
model.addAttribute("err","用户名或密码不存在!");
return "login_page";
}
代码改造完成,我们来看登录还会不会出现刚才那种现象。
完成!
小白一枚,请多多指教。