spring boot (六)之表单验证


  
    

 

在表现层向控制层传递数据的时候,并不一定所有的数据都是有效的或是正确的,有些时候输入的数据是错误的,有些时候也有一些恶意攻击服务器的,比如通过工具不断的向服务器提交数据导致服务器崩溃等等,因此,需要在浏览器和服务器端都要设置验证,验证通过了才可以进行下一步操作,这样就可以有效的防止以上事情发生。

这里自己主要还是学习在服务器端进行验证设置。

一般的我们在设计的时候会遇到很多的验证,比如密码的验证,用户名的验证等等,其实这些验证的原理都是大同小异,因此这里就拿用户名的长度来进行验证,即要求输入的用户名的长度在某个范围内。

在处理表单绑定对象的操作的时候,可以建立一个专门的类(就叫操作类吧)来进行表示web请求传上来的用户信息,比如注册要求输入两次密码,这是可以在这个类里再设一个变量来表示第二个密码。因此我们可以重新设置一个类,然后在该类再将一些数据转换为具体的实体类。

在对实体类属性进行验证的时候,可以直接使用java Validation API,通过对属性进行注解操作来进行验证操作。但这还不够,还需要在controller方法中告知spring  框架进行数据校验。即在controller方法中用 @Valid注解修饰参数实体类。

在进行验证的时候,肯定是会出现验证通过和验证失败的情况,通过的情况好说,直接跳转至另外一个页面。而我们一般验证失败的时候直接在输入信息的页面的输入框的下侧或者右侧显示失败的原因,因此,我们还需要将错误信息反馈给用户。


这里暂时还是用实际的实体类,因为在实际处理当中遇到了一些问题。
下面依次写出相关的代码:实体类:

package com.application.dao;

import javax.validation.constraints.Size;

public class User {
    
    @Size(min=2,max=10)
    private String title;
    @Size(min=2,max=10)
    private String password;
    
    
    
    
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

}


控制类的方法:
    

@GetMapping("/indexVerify")
    ///这里要加上model对象,不然页面里的对象就没有对应的对象
    public String getIndex(Model model)
    {
        
        model.addAttribute("user",new User());
        return "indexVerify";
    }
    
    //这里的BindingResult 类是必须要加上的,这个是和@Valid注解一起的用来验证失败是反馈消息的
    @PostMapping("/user/create")
    public String verify(@Valid User user,BindingResult result)
    {

        
        if(result.hasErrors())
        {
            
            return "indexVerify";
        }
        else
        {
            
            return "result";
        
        }
    }

indexVerify页面的body部分:

<form th:action="@{/user/create}" th:object="${user}" method='post'>
  <input type="text" th:field="*{title}">
  <!--下面是判断是否有错误,有的话就输出该标签的内容-->
  <p th:if="${#fields.hasErrors('title')}" th:errors="*{title}">标题长度必须在2-30之间</p><br>
  <input type="text" th:field="*{password}"><br>
  <p th:if="${#fields.hasErrors('password')}"th:errors="*{password}" >内容不可为空</p><br>
  <input type="submit">
</form>

result页面:


  

 <p th:text="${user.title}"></p>
    <p th:text="${user.password}"></p>


    
这样就可以设置简单的验证。

这里遇到了一个问题,如果我将getIndex方法里的模型里的类型改为UserHandle(该类和User类内容一样,只是名字不一样而已),然后将verify方法的参数改为UserHandle类型,这样的话在该方法体里还必须添加model并调用方法添加对象,然后执行却不能够在indexVerify页面的输入框下显示错误信息。
但是如果将getIndex的model调用的方法的第一个参数改为userHandel,并在indexVerify页面的object的user改为userHandle,却能够正确运行。

如果将上面的代码的getIndex方法的model调用的方法的第一个参数改为userHandle并且将页面的object也改为userHandle,然后运行就会出错。所以这里的参数应该是类名的第一个单词小写,也就是说这个参数名是“固定”的。

因此这里也是可以使用UserHandle类的,只要修改addAttribute方法的参数名称即可,注意:修改后result页面的参数也需要改动,改为相应的名称,即改为userHandle。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值