最近在做Struts2+Hibernet的一个项目,在if标签的使用上出了些问题,纠结了好久,终于解决了。问题是这样的,在后台有一个brand变量,类型为Brand,该类有一个布尔型的属性Enabled,在后台Action中通过ActionContext.getContext().put("brand", brand);方法将brand传到前台,在JSP页面中要通过该Enabled的是否为真来显示一组单选框
在test的测试条件这里纠结了很久,怎么写都不行,后来查了许多资料,终于弄清楚了一些,最终的解决方案是
关于test的条件
test到底要写些什么,在test中关“# ” “%{ }”,“%{# }”的用法是怎样,查了很多资料,网上说,标签中用#可以取出堆栈上下文中的存放的对象.用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息. 而对于“%{#}”,一些人说,用于域对象中,比如%{#session.user.userName},将获得user对象的 userName属性值。
虽然这个我还是不太明白,但是我必须要实现从session中取出对象来判断是否为空,而我在用户成功登录后,通过ActionContext.getContext().getSession().put("user",this.getUsername()),将用户名放入session的user对象中,现在的问题就是要判断user是否为空。
我用了很多写法如test="#session.user!=null",但一直返回的是false,后来在网上看到说把session改成attr,于是我写成了<s:if test="#attr.user!=null">,居然成功了,原理暂时还没搞清楚,不过已经实现了自己想要的效果。
不过好像用struts2的拦截器也可以实现,自己先写一个拦截器,判断session是否为空,然后利用struts.xml映射,返回的不同的字符串对应不同的页面。
这是从一位仁兄的博客上摘取的,我依样画葫芦,居然测试成功了!但是我还是想搞清楚为什么,后来在另一篇博客上看到好像是Servlet版本的问题,现摘抄一段如下:
看到这一差别才轰然醒悟过来,原来是在 Servlet 2.4 与 Servlet 2.3 的差别。Tomcat 5.0.28 是能支持 Servlet2.4/JSP 2.0 的,JSP 2.0 是可以用 EL 表达式,而之前版本是不行的,正式这一声明指示着容器应如何解析和编译 JSP 的,而产生未曾意料到的结果。
对于取pageContext、parameters、request、session、application 等处的属性值(假如有 name 属性)时我们用的 EL 表达式分别是:
${pageScope.name}、${param.name}、{$requestScope.name}、{$sessionScope.name}、{$applicationScope.name}
那么对应的 OGNL 的解决方案分别是:
<s:peroperty value="#attr.name"/>
<s:property value="#parameters.name"/>
<s:property value="#request.name"/>
<s:property value="#session.name"/>
<s:property value="#application.name"/>
<s:textfield name="name" value="%{#parameters.name}"/>
说明,attr 如果可以访问到,则访问 pageContext,否则将 依次搜索 pageContext、request、session、application 相应值,所以可用来访问 pageContext 中的值,可替代 EL 的 ${pageScope.name}。
更为详细的可以看看作者的原博客,写得相当不错http://www.blogjava.net/Unmi/archive/2008/04/13/192541.html
本来也考虑过在JSP页面中插入Java代码来做,但问题是通过ActionContext.getContext().put()方法设置的参数不知道如何在Java代码中读出来,这涉及到这个方法的参数传递问题了,将在我的另一篇博客中详细讨论。