在spring mvc中实现JSR303验证并将验证结果传回给视图层

一 先上效果图:这是注册前


没有填写登录名,点击注册


显示用户名不能为空,实现方式是JSR303。

二 代码如下

这里不给出所有的代码,因为篇幅有限,给出和实现验证功能有关的代码

1 在user-servlet.xml中添加

<context:component-scan base-package="course.controller"/>

2 在register.php添加

<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>

<sf:form method="post" modelAttribute="student">
      学号&nbsp;&nbsp;:<input type="text" name="student_code"/><br/>
      登录名&nbsp;:<sf:input  path="student_name" /><sf:errors path="student_name"/><br/>
      学生姓名:<input name="student_true" type="text"/>中文姓名<br/>    
      密码&nbsp;&nbsp;:<input  name="student_password" type="password"/><br/>
      确认密码:<input  name="ensure_password" type="password"/><br/>
      邮箱&nbsp;&nbsp;:<input  name="student_email" type="text"/>找回密码时用<br/>
     身份证号:<input  name="student_idcard" type="text"/>修改密码时用<br/>   
      <input type="submit" value="学生注册" style="width:200px;height:30px;font-size:25px" />
</sf:form>

3 在model添加

private String student_name;
@Column(name="student_name")
@NotEmpty(message="用户名不能为空")
public String getStudent_name() {
return student_name;
}
public void setStudent_name(String student_name) {
this.student_name = student_name;
}

4.在controller添加

@RequestMapping(value="/register",method=RequestMethod.GET)
public String register(Model model)
{
model.addAttribute(new Student());
return "register";
}

@RequestMapping(value="register",method=RequestMethod.POST)
public String register(@Validated Student student,BindingResult br,String student_name,String student_password,String student_code,String student_true,String student_email,String student_idcard,String ensure_password)
{
  if(student_password.equals(ensure_password)&&!(br.hasErrors()))
   {
Student s=new Student(student_name,student_password,student_code,student_email,student_idcard,student_true);
studentService.save(s);
return "register_success";
    }
  else
  {
return "register";
  }
}
标为红色的是实现验证功能的关键代码,不可少。

三 关于验证功能的实现过程

1 在配置文件中加上如上代码

2 在lib下加上相关的包,主要有bean-validator.jar和jstl-1.2.jar。

3 在模型层的get方法前加上@NotEmpty或者其他的constraints。

4 在控制层get方法里面向视图层传递一个参数,即model.addAttribute(new Student());

  在视图向控制层POST的时候,在控制层加上@Validated Student student,BindingResult br,注意br一定要跟在student后面。

5 如果注册时填入的参数有问题的时候,返回时一定要返回注册的页面,这就是为什么上面的效果图能看到具体的注册错误的原因。

6 在jsp页面一定要写上 :登录名&nbsp;:<sf:input  path="student_name" /><sf:errors path="student_name"/><br/>

其中的errors path就是为了显示注册的错误

四 过程中遇到的问题

我在开始做这个项目的是时候,如果注册的信息有误,重新返回注册页面是不会有错误信息提示的,想过用model进行错误提示,不过那样就发挥不了JSR的优点了。后来试图用JSR实现这个功能,但是一直显示不了错误提示。调试了差不多一个晚上,发现是redirect搞的鬼,因为redirect返回jsp页面时不会带上控制层的参数,这样就显示不了具体的validated错误了,这个错误是由控制层传递给视图层的。去掉redirect就可以了,如下


去掉else里面的redirect


调试的过程中怀疑过很多地方有问题,但是最终都证明是瞎猜,所以说,理清JSR的工作过程并冷静分析是最重要的,我想,很多bug的解决都应该是这样的。

文章的不足之处还望指正,转载请注明出处。160612





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值