环境:
Tomcat6
JDK6
Struts2.0.11.1代码:
L1: <s:set name="portOper" value="#parameters.portOper"/>
L2: <s:property value="#portOper" />a
L3: <s:if test="#portOper == '1'">
L4: Enter name of port to activate (* = all):
L5: <s:property value="#portOper" />b
L6: </s:if>问题:
第一行用set压入一个值,第二行获取此值显示,可以显示为“1a”,表示“portOper”的值为“1”。
但是第三行的test,试过多种写法,test却总为false,不进入第四行如果将第三行改为“<s:if test="#portOper != null">”,则可以进入第四行,且第五行显示为“1b”,表示也拿到了portOper的值,为“1”请帮忙看下,Struts2.0.11的tag不再允许嵌套使用EL表达式,全面使用OGNL。 不知道是否有什么关系?
Tomcat6
JDK6
Struts2.0.11.1代码:
L1: <s:set name="portOper" value="#parameters.portOper"/>
L2: <s:property value="#portOper" />a
L3: <s:if test="#portOper == '1'">
L4: Enter name of port to activate (* = all):
L5: <s:property value="#portOper" />b
L6: </s:if>问题:
第一行用set压入一个值,第二行获取此值显示,可以显示为“1a”,表示“portOper”的值为“1”。
但是第三行的test,试过多种写法,test却总为false,不进入第四行如果将第三行改为“<s:if test="#portOper != null">”,则可以进入第四行,且第五行显示为“1b”,表示也拿到了portOper的值,为“1”请帮忙看下,Struts2.0.11的tag不再允许嵌套使用EL表达式,全面使用OGNL。 不知道是否有什么关系?
解决方案 »
- jsp标签<c:if>占位问题
- 使用myeclipse把项目部署到weblogic下如何访问?
- 如何用mvn archetype:generate建立一个可以运行jetty:run的web项目?
- 网站消息推送
- java定时器使用的中的问题
- zk中我嵌入flash,zk组件事件响应会很慢
- 怎么才能不让页面加载iframe出现闪动
- 100分求救 Tomcat+Hibernate 开机10小时左右就连接不上
- 求教CXF的WebService启动的原理或流程以解决启动报错问题
- 急!请问那有JSP的原代码下载?
- PreparedStatement pstmt=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);oracle出现java.sql.SQLException: 不支持的特性的错误,什么原因
- 包含servlet-api.jar的问题
<s:set name="portOper" value="#parameters.portOper[0]"/> #parameters.id[0]作用相当于request.getParameter("id")
正解,测试成功! 谢谢!但是很奇怪,我写成“<s:set name="portOper" value="#parameters.portOper"/> ”,property仍然能取到值,为何if test就不能呢? 可能是“#parameters.portOper”取到的是一个数组,property则显示这个数组的第一个元素。 还是好好看书先,唉!
同时也要像daiyefei说的,改成整型才行,如下:
<s:if test="#pooper==1"> 奇怪!我尝试用<s:if test="#pooper.equals('1’)">也无法通过,看来已经被强制转成int型了。 但是请注意,我是从request parameters中获取portOper,(实际上进到这个页面是从url redirect来的,如xxx.jsp?portOper=1)。 此变量在action中并不存在,也就是说portOper我从来没有定义过它,更不用说它是String还是int了。 而从一般逻辑来说,requet.getPara...方法取到的都是String才对啊!!!
struts2也是开源的,你可以下一个源source研究一下.
如果数据库中的数据是整数字符串,例如1、2、3等,那么使用==
<s:if test="deptType==1" >下属</s:if><s:else>直属</s:else>
如果数据库中的数据是字符串,aa、bb、cc等等
那么就要使用<s:if test="deptType=='aa'>下属aa</s:if><s:else>直属</s:else> 如果数据库中既有数字字符串也普通的字符串,那么<s:if test="deptType=='aa' || deptType=='1'" >下属aa</s:if><s:else>直属</s:else> 无法正常的解析,
经过详细的测试,我确认这是struts2的一个bug
<s:if test="deptType==1" >下属</s:if>如果你的数据库对应的字段类型为整形,可以这样使用;<s:if test="deptType=='1'" >下属</s:if>如果你的数据库对应的字段类型为char,可以这样使用;<s:if test="deptType=='aa'" >下属</s:if>如果你的数据库对应的字段类型为varchar,并且数据库中的字符串都是多余一个字符的字符串,可以这样使用;<s:if test="deptType==\"1\"" >下属</s:if><s:else>直属</s:else>(测试通过,这样用是最正确的)
开始IDE出现警告没去试,后来再Struts2网站的FAQs一栏中找着了解决方法
Why won't the 'if' tag evaluate a one char string
嘿嘿,楼主可以结贴了吧
我也来测试了一下,
第一:如果说这里的parameters.portOper是一个数组之类的,后面的s:property得到的值就会让你明白的,
其次,这里所得到的,(仍然可以从s:property这一句可以看到.)也许不同的机器运行出来效果不一样,指定之后得到的值,后卖弄的比较就看看比较的表达了,这里有几种情况,当然,自己也可以摸索出来的
<s:if test="#page2 == 1">
<s:if test="#page2 == '1'">或者<s:if test='#page2 == "1"'>或者是<s:if test="#page2 == \"1\"">
看看怎么用,就自己摸索吧,
最后:关于写法问题,这里有好多种,有的有#,$,{},之类的,可能效果都差不多,还有set的几个属性,name,id,value,scope之类的,当然,只有这个scope有些人可能不太懂,他就是指定你的name变名之后的作用域,也就是哪个范围有效,具体可以网上看看,谢谢.
看了这个帖子,自己花了比较长的时间,来看了一下struts的标签,呵呵,感觉很多都还是比较的不懂,还得努力啊,虽然项目中用到了不少,可是都算是能工作了事,,谢谢了
<s:if test="deptType==1" >下属 </s:if>如果你的数据库对应的字段类型为整形,可以这样使用; <s:if test="deptType=='1'" >下属 </s:if>如果你的数据库对应的字段类型为char,可以这样使用; <s:if test="deptType=='aa'" >下属 </s:if>如果你的数据库对应的字段类型为varchar,并且数据库中的字符串都是多余一个字符的字符串,可以这样使用; <s:if test="deptType==\"1\"" >下属 </s:if> <s:else>直属 </s:else>(测试通过,这样用是最正确的)
【需要修改】
</s:if>
<s:else>
[审核中]
</s:else>其中extendedField2 是遍历list时得到的属性,如果比较的是定义的一个变量,则这样:
<s:property value="extendedField2" />
<s:set name="nowValue" value="%{ extendedField2 }" />
输出: 【${nowValue}】
<s:if test="%{#nowValue == \"Y\"}">
【需要修改】
</s:if>
<s:else>
[审核中]
</s:else>
注意,一定要使用\"待对比字符串\"这样的格式转义"符号。
L1: <s:if test="="#parameters.portOper[0] == 1">
L2: Enter name of port to activate (* = all):
L3: <s:property value="#portOper" />b
L4: </s:if>
或
L1: <s:if test="="#parameters.portOper[0] == \"1\"">
L2: Enter name of port to activate (* = all):
L3: <s:property value="#portOper" />b
L4: </s:if> 都是可行的。
L1: <s:set name="portOper" value="#parameters.portOper"/>
L2: <s:property value="#portOper" />a
看看:
http://struts.apache.org/2.x/docs/why-doesnt-the-if-tag-evaluate-test
2.<s:if test='deptType=="1"' >下属 </s:if> <s:else>直属 </s:else>(测试通过,这样用是最正确的) 這些都是測試通過的﹗
为啥不执行啊,我数据库中的字段也是整型的