spring MVC框架校验的方式

作用

后端校验作为项目的第二道防线,拦截非法的数据访问至关重要。在这里就不多说为什么了。实战项目中常用。

准备工作

编辑器: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";
	}

代码改造完成,我们来看登录还会不会出现刚才那种现象。
在这里插入图片描述完成!

小白一枚,请多多指教。

发布了26 篇原创文章 · 获赞 3 · 访问量 1442

猜你喜欢

转载自blog.csdn.net/CQWNB/article/details/103128805