读书人

关于Struts2中标签的一些经验

发布时间: 2012-09-03 09:48:39 作者: rapoo

关于Struts2中标签的一些心得

最近在做Struts2+Hibernet的一个项目,在if标签的使用上出了些问题,纠结了好久,终于解决了。问题是这样的,在后台有一个brand变量,类型为Brand,该类有一个布尔型的属性Enabled,在后台Action中通过ActionContext.getContext().put("brand", brand);方法将brand传到前台,在JSP页面中要通过该Enabled的是否为真来显示一组单选框

?在test的测试条件这里纠结了很久,怎么写都不行,后来查了许多资料,终于弄清楚了一些,最终的解决方案是

<s:if test="#attr.brand.=Enabled ">

?以下是我转自他人的一些资料

?

关于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}。

1 楼 cl1154781231 2011-11-09 <s:peroperty value="#attr.name"/>
<s:property value="#parameters.name"/>
学习了,谢谢!

读书人网 >软件架构设计

热点推荐