关于Struts2中if标签的一些心得

来源:互联网 发布:ae软件的功能 编辑:程序博客网 时间:2024/06/02 03:32

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

[xhtml] view plaincopy
  1. <s:if test="brand.Enabled "><!-- Enabled为真 -->  
  2.   <input type="radio" name="brandEnable" value="true" checked/>启用  
  3.   <input type="radio" name="brandEnable" value="false" />不启用  
  4. </s:if>     
  5. <s:else><!-- 否则 -->  
  6.   <input type="radio" name="brandEnable" value="true" />启用  
  7.   <input type="radio" name="brandEnable" value="false" checked />不启用  
  8. </s:else>  

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

[xhtml] view plaincopy
  1. <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}。

 

更为详细的可以看看作者的原博客,写得相当不错http://www.blogjava.net/Unmi/archive/2008/04/13/192541.html

 

    本来也考虑过在JSP页面中插入Java代码来做,但问题是通过ActionContext.getContext().put()方法设置的参数不知道如何在Java代码中读出来,这涉及到这个方法的参数传递问题了,将在我的另一篇博客中详细讨论。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 北京办了居住卡怎么办延期 商铺被陌生人注册左公司怎么办 营业执照年检登录密码忘了怎么办 欠人家钱没钱还怎么办 欠钱实在没钱还怎么办 党关系丢了10年怎么办? 离婚后生孩子怎么办出生证明 注册公司没有注册地址怎么办 银行流水不够2倍怎么办 个体户小店怎么办五险 姓和名五行相克怎么办? 三星s7刷机后计算器没有了怎么办 线雕鼻子山根鼓怎么办 在日本没有日币怎么办 明知合同回扣特别高怎么办 医院药品断货了怎么办 空腹吃菠萝胃疼怎么办 小孩黑户口怎么办上户 别人说名字起大了怎么办? 念佛号时心老是不集中怎么办 扑lv期嗓子痛头痛怎么办 公众号忘记了账号怎么办 公众号账号密码忘记了怎么办 现实生活被小人缠上怎么办 五行缺木和水怎么办 八字火旺的人怎么办 综合旺衰得分负怎么办 妈妈误打死一只黄鼠狼怎么办 油笔画在白墙上怎么办 壁纸上的水彩笔怎么办 隐形拉链头脱了怎么办 拉链的一边掉了怎么办 帝豪gs加了乙醇汽油怎么办 命理五行缺木怎么办 微信改名含有特殊符号怎么办 户口名字打错了怎么办 寻仙会心几率差怎么办 注册商标下来了没收到怎么办 金融公司倒闭欠的钱怎么办 买车贷款被骗了怎么办 定投终止后钱怎么办