【Java】目瞪口呆,注解轻松搞定后台表单验证!

31 篇文章 0 订阅

传统方式,需要写很多代码

	@PostMapping("register")
    public String register(@Validated User user, RedirectAttributes redirectAttributes){
        Boolean flag=true;
        StringBuilder error=new StringBuilder();

        Iterator<User> iterator = userMap.values().iterator();
        while (iterator.hasNext()){
            User u=iterator.next();
            if(u.getName().equals(user.getName())){
                error.append("用户名重复!请重输;<br />");
                flag=false;
                break;
            }
        }
        String phoneReg="^1[34578]\\d{9}$";

        if(user.getPassword().length()<6){
            error.append("密码错误!长度应该在6-18之间;<br />");
            flag=false;
        }
        //手机号验证
        if(!user.getPhoneNumber().matches(phoneReg)){
            error.append("手机号格式不正确;<br />");
            flag=false;
        }
        //邮箱验证
        String emailReg="^([A-Za-z0-9_\\-\\.])+\\@([A-Za-z0-9_\\-\\.])+\\.([A-Za-z]{2,4})$";
        if(!user.getEmail().matches(emailReg)){
            error.append("邮箱格式不正确;<br />");
            flag=false;
        }

        if(flag==false){
            redirectAttributes.addFlashAttribute("user",user);
            redirectAttributes.addFlashAttribute("error",error.toString());
            redirectAttributes.addFlashAttribute("display","block");
            return "redirect:/user/register";
        }
        int id=userMap.size()+1;
        user.setId(id);
        userMap.put(id,user);
        System.out.println("[register]\t"+user.toString());
        return "redirect:/user/login";
    }

用注解怎么搞?

一、导包

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.0.Final</version>
</dependency>

二、写注解

A.在model的属性上

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    private Integer id;
    @NotEmpty(message = "用户名不能为空!")
    private String name;
    @Size(min = 6,max = 18,message = "密码长度应该在6-18之间!")
    private String password;
    private int sex;
    @Pattern(regexp = "^1[34578]\\d{9}$",message = "手机号码格式不正确!")
    private String phoneNumber;
    @Email(message = "邮箱格式不正确!")
    private String email;
    private String hobbit;
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date registerTime=new Date();

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
}

B.在方法的参数上@Validated

@PostMapping("register")
public String register(@Validated User user, RedirectAttributes redirectAttributes){
    int id=userMap.size()+1;
    user.setId(id);
    userMap.put(id,user);
    System.out.println("[register]\t"+user.toString());
    return "redirect:/user/login";
}

三、异常处理

register-error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>400 error</title>
</head>
<body>
<h1>参数格式错误,请保证您输入的信息符合规则!</h1>
<p>${messages}</p>
</body>
</html>

将参数传回页面有多种方式,不推荐使用session,session一般只用于保存登录的用户信息。
因为参数在请求头或请求头中,所以直接向request设置参数即可传参

request.setAttribute("messages",messages.toString());

在MVC角度,将页面view和数据model传回前端也能达到传参目的。

Map<String,Object> map=new HashMap<>();
map.put("messages",messages.toString());
ModelAndView mv=new ModelAndView("errors/register-error",map);

MyBindExceptionHandler类

@ControllerAdvice
public class MyBindExceptionHandler{

//    @ExceptionHandler(BindException.class)
    public String bindHandler(BindException ex, HttpServletRequest request
            , HttpServletResponse response){
        List<FieldError> fieldErrors = ex.getFieldErrors();
        StringBuilder messages=new StringBuilder();
        fieldErrors.forEach(e ->{
            messages.append(e.getField()+":"+e.getDefaultMessage()+"<br />");
        });
        request.setAttribute("messages",messages.toString());
        return "errors/register-error";
    }

    @ExceptionHandler(BindException.class)
    public ModelAndView bindHandler2(BindException ex, HttpServletRequest request
            , HttpServletResponse response){
        List<FieldError> fieldErrors = ex.getFieldErrors();
        StringBuilder messages=new StringBuilder();
        fieldErrors.forEach(e ->{
            messages.append(e.getField()+":"+e.getDefaultMessage()+"<br />");
        });
        Map<String,Object> map=new HashMap<>();
        map.put("messages",messages.toString());
        ModelAndView mv=new ModelAndView("errors/register-error",map);
        return mv;
    }
}

配置web.xml,配置这个后所有400错误都会跳转至指定的error page。默认是Tomcat自带的错误页面。

<error-page>
    <error-code>400</error-code>
    <location>/WEB-INF/pages/jsps/errors/register-error.jsp</location>
</error-page>

The End,Thanks!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值