在struts2标签中处理java 8的optional空值,最直接的办法是在action类中将optional转换为原始类型或包装类,例如调用orelse(null)或orelseget(),从而让ognl表达式能正常访问属性。如果不想修改action代码,也可以在jsp页面中使用ognl的三元运算符配合ispresent()方法来判断并输出默认值,避免直接调用get()引发异常。

如何在Action中转换Optional为普通对象
将Optional转换为普通对象是解决该问题最稳妥的方式。在Action中定义一个普通的字段(如String或User),并在获取数据后通过orElse(null)将其赋值给该字段。这样在JSP中使用null也不会报错,只会显示为空或默认文本。
import java.util.Optional;
public class UserAction {
private String userName;
public String execute() {
// 模拟从服务层获取Optional
Optional<string> optName = Optional.ofNullable(getNameFromService());
// 转换为普通字符串,若为空则设为null
this.userName = optName.orElse(null);
return "success";
}
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
}</string>
预期结果:当getNameFromService()返回null时,userName为null,JSP渲染时不会抛出异常。
如何在JSP中直接使用OGNL判断Optional
如果无法修改Action代码,或者希望保持领域模型的完整性,可以直接在JSP中使用OGNL表达式对Optional实例进行判断。OGNL支持调用Java对象的方法,因此可以调用isPresent()来检查值是否存在。如果存在,则调用get()获取值;否则提供一个默认值。这种方式避免了在Action层做多余的转换,但会使JSP逻辑稍显复杂。
<if test="userOpt.isPresent()"><property value="userOpt.get()"></property><else>
暂无用户信息
</else></if>
预期结果:userOpt不为空且包含值时显示具体值,否则显示“暂无用户信息”。注意不要直接在s:property中写userOpt.get()而不加判断,因为当Optional为空时调用get()会抛出NoSuchElementException。
当Optional包含的对象本身为null时会发生什么
在使用Optional.ofNullable()时,如果传入的值本身就是null,Optional实例依然有效,只是其内部值为空。此时调用isPresent()返回false,调用get()会抛出异常。如果在Action中使用了orElse(null),最终传递给JSP的属性值就是null。Struts2的标签在处理null值时通常表现为不输出内容或输出空字符串,这符合大多数场景的需求。但如果使用的是Optional.of()并传入了null,则在Action初始化阶段就会直接抛出NullPointerException,导致请求失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











