使用SSM+Thymeleaf的项目中,将实体类对象共享session域中,在输入框中获取实体类对象的属性值,当实体类对象为空时,输入框以下的所有页面将无法加载

问题描述

今天在做注册页面时,当username已经存在时,将用户之前写的数据(除了已经错误的用户名之外)回显的注册页面时

  • 当时的代码是这样写的
 <form method="post" th:action="@{/api/register}" id="register_form">
                <table>
                    <tr>
                        <td>用户名称</td>
                        <td><input type="text" id="username" name="username" placeholder=" 输入用户名"></td>
                        <td><div class="tip" hidden="hidden">格式有误</div></td>
                    </tr>
                    <tr>
                        <td>用户密码</td>
                        <td><input type="password" name="password" id="password" placeholder=" 输入密码" th:value="${session.registerUser.password}"></td>
                        <td><div class="tip" hidden="hidden">格式有误</div></td>
                    </tr>
                    <tr>
                        <td>确认密码</td>
                        <td><input type="password" name="againPassword" id="againPsw" placeholder=" 确认密码" th:value="${session.registerUser.password}"></td>
                        <td><div class="tip" hidden="hidden">密码不符</div></td>
                    </tr>
                    <tr>
                        <td>姓名</td>
                        <td><input type="text" name="name" id="name" placeholder="您的姓名" th:value="${session.registerUser.name}"></td>
                    </tr>
                    <tr>
                        <td>性别</td>
                        <td>
                            <input type="radio" name="gender" class="sex" value="" checked><input type="radio" name="gender" class="sex" value=""></td>
                    </tr>
                    <tr>
                        <td>年龄</td>
                        <td><input type="text" name="age" id="age" placeholder="您的年龄" th:value="${session.registerUser.age}"></td>
                    </tr>
                    <tr>
                        <td>电子邮件</td>
                        <td><input type="text" name="email" id="email" placeholder=" 输入邮箱地址" th:value="${session.registerUser.email}"></td>
                        <td><div class="tip" hidden="hidden">格式有误</div></td>
                    </tr>
                </table>

这时在第一次跳转到注册页面时遇到了问题,在包含第一个输入框的位置以后得页面代码均无法显示在这里插入图片描述

问题分析

其实就是很小的问题啦,只是没有学Thymeleaf语法罢了
具体原因:引用了实体类对象的属性导致空指针异常,在Thymeleaf渲染模板时抛出空指针异常。这将中断模板的渲染,导致输入框以下的所有内容都无法加载。

解决方案

也很好解决,就不让为null就好了
有好几种解决方案,这里提供最简洁的解决方案

使用安全导航运算符:

在访问实体类对象的属性时,使用安全导航运算符 ?. 来避免空指针异常。这样,即使实体类对象为空,Thymeleaf仍然会继续进行模板的渲染而不会中断。

<input type="text" th:value="${session.entity?.name}" />

修改后的代码

 <table>
                    <tr>
                        <td>用户名称</td>
                        <td><input type="text" id="username" name="username" placeholder=" 输入用户名"></td>
                        <td><div class="tip" hidden="hidden">格式有误</div></td>
                    </tr>
                    <tr>
                        <td>用户密码</td>
                        <td><input type="password" name="password" id="password" placeholder=" 输入密码" th:value="${session.registerUser?.password}"></td>
                        <td><div class="tip" hidden="hidden">格式有误</div></td>
                    </tr>
                    <tr>
                        <td>确认密码</td>
                        <td><input type="password" name="againPassword" id="againPsw" placeholder=" 确认密码" th:value="${session.registerUser?.password}"></td>
                        <td><div class="tip" hidden="hidden">密码不符</div></td>
                    </tr>
                    <tr>
                        <td>姓名</td>
                        <td><input type="text" name="name" id="name" placeholder="您的姓名" th:value="${session.registerUser?.name}"></td>
                    </tr>
                    <tr>
                        <td>性别</td>
                        <td>
                            <input type="radio" name="gender" class="sex" value="" checked><input type="radio" name="gender" class="sex" value=""></td>
                    </tr>
                    <tr>
                        <td>年龄</td>
                        <td><input type="text" name="age" id="age" placeholder="您的年龄" th:value="${session.registerUser?.age}"></td>
                    </tr>
                    <tr>
                        <td>电子邮件</td>
                        <td><input type="text" name="email" id="email" placeholder=" 输入邮箱地址" th:value="${session.registerUser?.email}"></td>
                        <td><div class="tip" hidden="hidden">格式有误</div></td>
                    </tr>
                </table>

嘎嘎好使

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值