首先配置了视图映射
@Configuration
public class MallWebConfig implements WebMvcConfigurer {
/**·
* 视图映射:发送一个请求,直接跳转到一个页面
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/reg.html").setViewName("reg");
}
}
@PostMapping(value = "/regist")
public String register(@Valid UserRegisterVo vos, BindingResult result,Model model) {
//如果有错误回到注册页面
if (result.hasErrors()) {
Map<String, String> errors = result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
model.addAttribute("errors",errors);
//效验出错回到注册页面
return "forward:/reg.html";
}
}
前端发送请求,出现了错误
错误原因:请求转发,转发的请求方式是不变的,这个是POST请求,因为上面配置过,而转发的路径是GET请求
修改:直接转发
@PostMapping(value = "/regist")
public String register(@Valid UserRegisterVo vos, BindingResult result,Model,model) {
//如果有错误回到注册页面
if (result.hasErrors()) {
Map<String, String> errors = result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
model.addAttribute("errors",errors);
//效验出错回到注册页面
return "reg";
}
}
但是会出现前台重复提交问题,因为转发后,前台路径是请求路径
每次刷新都会转发,导致重复提交
所以可以选择重定向
@PostMapping(value = "/regist")
public String register(@Valid UserRegisterVo vos, BindingResult result, RedirectAttributes attributes) {
//如果有错误回到注册页面
if (result.hasErrors()) {
Map<String, String> errors = result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
attributes.addFlashAttribute("errors", errors);
//效验出错回到注册页面
return "redirect:/reg.html";
}
请求转发 model数据默认在请求域中,重定向获取不到,所以重定向想要带数据可以用RedirectAttributes
重定向携带数据:利用session原理,将数据放在session中。只要跳转到下一个页面取出这个数据以后,session里面的数据就会删掉