SpringBoot项目(25)---服务器数据校验之解决页面跳转异常

SpringBoot项目(25)—服务器数据校验之解决页面跳转异常

1.编写页面跳转的controller

@Controller
public class PageController {
    @RequestMapping("/{page}")
    public String showPage(@PathVariable String page){
        return page;
    }
}

2.拿出之前的addUsser.html文件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
<head>
    <title>addusers</title>
</head>
<body>
    <form th:action="@{/user/addUser}" method="post"><!--这里的errors可以从controller里传来的BindingResult里取错误信息,${}里是对象类型名,并把首字符换成小写,比如这里对象是Users,所以写成users-->
        姓名:<input type="text" name="username"><font color="red"><span th:errors="${users.username}"></span></font><br/>
        性别:<input type="text" name="usersex"><font color="red"><span th:errors="${users.usersex}"></span></font><br/>
        <input type="submit" value="ok"/>
    </form>
</body>
</html>

3.运行发现报错 ,原因是在addUser.html文件中有未声明的对象

<input type="text" name="username"><font color="red"><span th:errors="${users.username}"></span></font><br/>

这里的errors里的users是找不到的,因为直接由PageController跳转过来,但是users没有在PageController中声明

4.解决办法 :

修改PageController,添加一个参数Users users

@Controller
public class PageController {
    @RequestMapping("/{page}")
    public String showPage(@PathVariable String page, Users users){
        return page;
    }
}

跳转页面解决异常的方法:

在跳转页面的方法中注入一个Users对象,这是由于SpringMVC会将该对象放入到Model中传递,key的名称会使用该对象的驼峰命名规则来命名(驼峰命名规则即使用对象类名并把开头字母小写),和参数名没关系

如果想使用自定义的名称来对Model中的key进行命名,可以使用@ModelAttribute注解,这个注解是把命名的名称在页面里使用

@Controller
public class PageController {
    @RequestMapping("/{page}")
    public String showPage(@PathVariable String page, @ModelAttribute("aa") Users user){
        return page;
    }
}

这样在addUser.html中的errors的key就可以使用“aa”了

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/>
<head>
    <title>addusers</title>
</head>
<body>
    <form th:action="@{/user/addUser}" method="post"><!--这里的errors可以从controller里传来的BindingResult里取错误信息,${}里是对象类型名,并把首字符换成小写,比如这里对象是Users,所以写成users-->
        姓名:<input type="text" name="username"><font color="red"><span th:errors="${aa.username}"></span></font><br/>
        性别:<input type="text" name="usersex"><font color="red"><span th:errors="${aa.usersex}"></span></font><br/>
        <input type="submit" value="ok"/>
    </form>
</body>
</html>

但是我们会发现,当我地址栏输入localhost:8080/addUser后,页面实现了跳转,但是没有错误提示信息(因为这里没有BindingResult参数,而异常报错信息是放在BindingResult里的),如果什么也不填就点击“ok”按钮,页面就会报错,这是因为当我们点击“ok”按钮后,页面会响应/user/addUser

<form th:action="@{/user/addUser}" method="post">

会执行addUser这个controller

@RequestMapping("/addUser")
    public String addUser(@Validated Users users, BindingResult result){
        if(result.hasErrors()){//通过result下的hasErrors()方法来判断是否有校验不合法的情况
//            List<ObjectError> list = result.getAllErrors();//拿到BindingResult里的所有错误信息,这里定义的是ObjectError类型,但是实际上用的是ObjectError的一个子类的类型FieldError
//            for(ObjectError err : list){//FieldError里存放着校验不合法的属性、属性名和提示信息
//                FieldError fieldError = (FieldError) err;//进行强转
//                String fieldName = fieldError.getField();//校验不合法的属性的名字
//                String msg = fieldError.getDefaultMessage();//校验不合法的默认的提示信息
//                System.out.println(fieldName + "\t" + msg);
//            }
            return "addUser";
        }
        System.out.println(users);
        return "redirect:/ok";
    }

这里参数的名称还是Users,而且跳转的页面还是addUser.html,而addUser.html中的errors的key已经是“aa”了

所以,我们还需要在addUser这个controller里添加@ModelAttribute注解

@RequestMapping("/addUser")
    public String addUser(@ModelAttribute("aa") @Validated Users users, BindingResult result){
        if(result.hasErrors()){//通过result下的hasErrors()方法来判断是否有校验不合法的情况
//            List<ObjectError> list = result.getAllErrors();//拿到BindingResult里的所有错误信息,这里定义的是ObjectError类型,但是实际上用的是ObjectError的一个子类的类型FieldError
//            for(ObjectError err : list){//FieldError里存放着校验不合法的属性、属性名和提示信息
//                FieldError fieldError = (FieldError) err;//进行强转
//                String fieldName = fieldError.getField();//校验不合法的属性的名字
//                String msg = fieldError.getDefaultMessage();//校验不合法的默认的提示信息
//                System.out.println(fieldName + "\t" + msg);
//            }
            return "addUser";
        }
        System.out.println(users);
        return "redirect:/ok";
    }

这样,点击“ok”以后,就会提示“XXX不能为空”了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值