Struts2.0.11.1 s:if test 标签问题

时间:2021-04-03 08:18:15
环境:
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。 不知道是否有什么关系?

47 个解决方案

#1


会不会是类型不对 不要用int型 用字符型试下

#2


<s:if test="portOper == 1"> 

#3


应该可以的,一般都是这样写的.关注...........

#4


感觉value应该这么取.
<s:set name="portOper" value="#parameters.portOper[0]"/> 

#parameters.id[0]作用相当于request.getParameter("id")

#5


引用 4 楼 daiyefei 的回复:
感觉value应该这么取. 
<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则显示这个数组的第一个元素。  还是好好看书先,唉!

#6


引用 2 楼 daiyefei 的回复:
<s:if test="portOper == 1">  


同时也要像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才对啊!!!

#7


此==,非JAVA中的==
struts2也是开源的,你可以下一个源source研究一下.

#8


struts2我觉得就是webwork,换了件马甲而已.

#9


官方文档对这些传值操作写的太少了,用起来不免出现很多麻烦。。

我已经头痛过了

#10


引用 7 楼 daiyefei 的回复:
此==,非JAVA中的== 
struts2也是开源的,你可以下一个源source研究一下. 


可否说详细点,我现在没时间去研究源码了,呵呵!

#11


L3:   <s:if test="#portOper == '1'">  这个 改成  <s:if test='{#portOper == "1"}'>

#12


前提:数据库中的类型是varchar,pojo中对应的字段的类型也是string。
如果数据库中的数据是整数字符串,例如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

#13


抱歉,经过再次分析,这不是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>(测试通过,这样用是最正确的)

#14


接分,我还从来没有的过分。哈哈,不知道这次回答是否能够得到?

#15


13楼方法行不通,LZ解决好了没,分享下方法.

#16


这里纠正一点--13楼wmj2003的方法是正确的.
开始IDE出现警告没去试,后来再Struts2网站的FAQs一栏中找着了解决方法

Why won't the 'if' tag evaluate a one char string

嘿嘿,楼主可以结贴了吧

#17


引用楼主 phoenix_zd 的帖子:
环境: 
 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”…



呵呵,这里有好多种说法,
我也来测试了一下,
第一:如果说这里的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的标签,呵呵,感觉很多都还是比较的不懂,还得努力啊,虽然项目中用到了不少,可是都算是能工作了事,,谢谢了

#18


最后那个有问题,我当时晕头了,哈哈,对不起了,

#19


最后那个有问题,我当时晕头了,哈哈,对不起了,

#20


wmj2003 是正确的。给分100
<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>(测试通过,这样用是最正确的)

#21


引用 20 楼 dengjx7245891 的回复:
<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\"" >下属 </…


我刚好碰到这些问题,按上面这个测试了一把,是对的,非常感谢!

#22


学习

#23


最正确的判断方法是:

<s:if test="%{extendedField2 == \"Y\"}">
                                【需要修改】
                            </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>


注意,一定要使用\"待对比字符串\"这样的格式转义"符号。

#24


13的对的

#25


我怎么没有测试成功,用13楼的,rp问题?

#26


代码改为如下: 
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> 

都是可行的。

#27


不必使用如下代码:
L1:  <s:set name="portOper" value="#parameters.portOper"/> 
L2:  <s:property value="#portOper" />a 

#28


26楼的方法是正确的, 27楼的s:property是没问题的,但用于if test 就不行了。
看看:
http://struts.apache.org/2.x/docs/why-doesnt-the-if-tag-evaluate-test

#29


正确方法是 <s:if test='dataType=="D"'> 

#30


<s:if test="deptType==1" >下属 </s:if>如果你的数据库对应的字段类型为整形,可以这样使用; 

<s:if test="deptType=='1'" >下属 </s:if>如果你的数据库对应的字段类型为char,可以这样使用; 

<s:if test="deptType=='aa'" >下属 </s:if>如果你的数据库对应的字段类型为varchar,并且数据库中的字符串都是多余一个字符的字符串,可以这样使用; 

1.<s:if test="deptType==\"1\"" >下属 </s:if> <s:else>直属 </s:else>(测试通过,这样用是最正确的) 
2.<s:if test='deptType=="1"' >下属 </s:if> <s:else>直属 </s:else>(测试通过,这样用是最正确的) 

這些都是測試通過的﹗

#31


要是在ec:table 里面呢 ,呵呵 那就更好玩了  <s:if test="${abc}==0">是正常的在ec:table里面

#32


正需要这方面资料,感谢楼主和各位高手啦

#33


<s:if test="#rquest.right.rt_addOrder==1">checked</s:if>
为啥不执行啊,我数据库中的字段也是整型的

#34


23楼的测试完全通过.

#35


11楼的是正确的,通过了

#36


恩,确实不错的,好贴

#37


学习下

#38


ddd

#39


这个正好用到了,学习了

#40


23楼的写法对。

#41


反复测试,如果从url获得的querystring参数,只有<s:if test="="#parameters.portOper[0] == 1">  可以通过,其他的只要没带[0]都不行

不明白为什么....

#42


我也是遇到想通的问题,action里面是Integer 但是<s:if test="searchType==1" />总为false

#43


1111111111

#44


学习了······

#45


多我很有帮助,学习了

#46


很有帮助。

#47


对我很有帮助

#1


会不会是类型不对 不要用int型 用字符型试下

#2


<s:if test="portOper == 1"> 

#3


应该可以的,一般都是这样写的.关注...........

#4


感觉value应该这么取.
<s:set name="portOper" value="#parameters.portOper[0]"/> 

#parameters.id[0]作用相当于request.getParameter("id")

#5


引用 4 楼 daiyefei 的回复:
感觉value应该这么取. 
<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则显示这个数组的第一个元素。  还是好好看书先,唉!

#6


引用 2 楼 daiyefei 的回复:
<s:if test="portOper == 1">  


同时也要像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才对啊!!!

#7


此==,非JAVA中的==
struts2也是开源的,你可以下一个源source研究一下.

#8


struts2我觉得就是webwork,换了件马甲而已.

#9


官方文档对这些传值操作写的太少了,用起来不免出现很多麻烦。。

我已经头痛过了

#10


引用 7 楼 daiyefei 的回复:
此==,非JAVA中的== 
struts2也是开源的,你可以下一个源source研究一下. 


可否说详细点,我现在没时间去研究源码了,呵呵!

#11


L3:   <s:if test="#portOper == '1'">  这个 改成  <s:if test='{#portOper == "1"}'>

#12


前提:数据库中的类型是varchar,pojo中对应的字段的类型也是string。
如果数据库中的数据是整数字符串,例如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

#13


抱歉,经过再次分析,这不是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>(测试通过,这样用是最正确的)

#14


接分,我还从来没有的过分。哈哈,不知道这次回答是否能够得到?

#15


13楼方法行不通,LZ解决好了没,分享下方法.

#16


这里纠正一点--13楼wmj2003的方法是正确的.
开始IDE出现警告没去试,后来再Struts2网站的FAQs一栏中找着了解决方法

Why won't the 'if' tag evaluate a one char string

嘿嘿,楼主可以结贴了吧

#17


引用楼主 phoenix_zd 的帖子:
环境: 
 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”…



呵呵,这里有好多种说法,
我也来测试了一下,
第一:如果说这里的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的标签,呵呵,感觉很多都还是比较的不懂,还得努力啊,虽然项目中用到了不少,可是都算是能工作了事,,谢谢了

#18


最后那个有问题,我当时晕头了,哈哈,对不起了,

#19


最后那个有问题,我当时晕头了,哈哈,对不起了,

#20


wmj2003 是正确的。给分100
<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>(测试通过,这样用是最正确的)

#21


引用 20 楼 dengjx7245891 的回复:
<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\"" >下属 </…


我刚好碰到这些问题,按上面这个测试了一把,是对的,非常感谢!

#22


学习

#23


最正确的判断方法是:

<s:if test="%{extendedField2 == \"Y\"}">
                                【需要修改】
                            </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>


注意,一定要使用\"待对比字符串\"这样的格式转义"符号。

#24


13的对的

#25


我怎么没有测试成功,用13楼的,rp问题?

#26


代码改为如下: 
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> 

都是可行的。

#27


不必使用如下代码:
L1:  <s:set name="portOper" value="#parameters.portOper"/> 
L2:  <s:property value="#portOper" />a 

#28


26楼的方法是正确的, 27楼的s:property是没问题的,但用于if test 就不行了。
看看:
http://struts.apache.org/2.x/docs/why-doesnt-the-if-tag-evaluate-test

#29


正确方法是 <s:if test='dataType=="D"'> 

#30


<s:if test="deptType==1" >下属 </s:if>如果你的数据库对应的字段类型为整形,可以这样使用; 

<s:if test="deptType=='1'" >下属 </s:if>如果你的数据库对应的字段类型为char,可以这样使用; 

<s:if test="deptType=='aa'" >下属 </s:if>如果你的数据库对应的字段类型为varchar,并且数据库中的字符串都是多余一个字符的字符串,可以这样使用; 

1.<s:if test="deptType==\"1\"" >下属 </s:if> <s:else>直属 </s:else>(测试通过,这样用是最正确的) 
2.<s:if test='deptType=="1"' >下属 </s:if> <s:else>直属 </s:else>(测试通过,这样用是最正确的) 

這些都是測試通過的﹗

#31


要是在ec:table 里面呢 ,呵呵 那就更好玩了  <s:if test="${abc}==0">是正常的在ec:table里面

#32


正需要这方面资料,感谢楼主和各位高手啦

#33


<s:if test="#rquest.right.rt_addOrder==1">checked</s:if>
为啥不执行啊,我数据库中的字段也是整型的

#34


23楼的测试完全通过.

#35


11楼的是正确的,通过了

#36


恩,确实不错的,好贴

#37


学习下

#38


ddd

#39


这个正好用到了,学习了

#40


23楼的写法对。

#41


反复测试,如果从url获得的querystring参数,只有<s:if test="="#parameters.portOper[0] == 1">  可以通过,其他的只要没带[0]都不行

不明白为什么....

#42


我也是遇到想通的问题,action里面是Integer 但是<s:if test="searchType==1" />总为false

#43


1111111111

#44


学习了······

#45


多我很有帮助,学习了

#46


很有帮助。

#47


对我很有帮助