从Struts1迁移到Struts2:JSP域对象获取及脚本替代方案咨询
嘿,这两个问题都是Struts2从Struts1迁移或者日常开发中经常碰到的,我来给你详细说说:
问题1:Struts2中跨作用域获取对象属性的实现方法
Struts2依赖OGNL表达式来处理数据访问,默认会按page → request → session → application的顺序自动查找作用域中的对象,比Struts1的标签更灵活:
- 基础用法:用
<s:property>标签替代Struts1的<bean:write>,直接通过OGNL表达式访问属性,写法非常简洁:
这个标签会自动在各个作用域中寻找名为<s:property value="user.someProperty"/>user的对象,然后读取它的someProperty属性(遵循JavaBean规范,对应getSomeProperty()方法)。 - 指定作用域访问:如果需要精准指定从某个作用域获取对象,可以在OGNL表达式前加上作用域前缀:
- Page作用域:
<s:property value="#user.someProperty"/> - Request作用域:
<s:property value="#request.user.someProperty"/> - Session作用域:
<s:property value="#session.user.someProperty"/> - Application作用域:
<s:property value="#application.user.someProperty"/>
- Page作用域:
问题2:用Struts2标签替代JSP脚本代码
先看你给出的原始脚本代码:
<% User user = (User)session.getAttribute("user"); if(null != user){%> // some html code <%}%> <% if(null != user.getSomeProperty() && "".equals(user.getSomeProperty())){%> //some html code <%}%> <% if(null != user.getSomeProperty() && "prop1".equals(user.getSomeProperty())){%> //some html code <%}%>
用Struts2的<s:if>、<s:elseif>、<s:else>标签可以完全替代这些脚本,代码更干净易维护:
判断user对象是否存在
直接用OGNL表达式判断对象是否非空,不需要手动从session获取和强转:<s:if test="user != null"> // some html code </s:if>如果要明确限定只从session中查找user:
<s:if test="#session.user != null"> // some html code </s:if>判断someProperty为空字符串
利用OGNL直接访问属性,结合空字符串判断:<s:if test="user != null && user.someProperty == ''"> // some html code </s:if>也可以调用字符串的
isEmpty()方法:<s:if test="user != null && user.someProperty.isEmpty()"> // some html code </s:if>判断someProperty等于"prop1"
直接用OGNL做字符串相等判断:<s:if test="user != null && user.someProperty == 'prop1'"> // some html code </s:if>组合优化逻辑
可以用<s:elseif>和<s:else>把多个判断整合起来,让逻辑更清晰:<s:if test="#session.user == null"> // user不存在时的处理代码 </s:if> <s:else> <s:if test="user.someProperty == ''"> // some html code </s:if> <s:elseif test="user.someProperty == 'prop1'"> // some html code </s:elseif> <s:else> // 其他情况的处理代码 </s:else> </s:else>
内容的提问来源于stack exchange,提问作者learning knowledge
相关产品推荐
相关产品推荐

