传统方式,需要写很多代码
@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>