环境:
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。 不知道是否有什么关系?

解决方案 »

  1.   

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

  2.   

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

  3.   

    感觉value应该这么取.
    <s:set name="portOper" value="#parameters.portOper[0]"/> #parameters.id[0]作用相当于request.getParameter("id")
      

  4.   


    正解,测试成功! 谢谢!但是很奇怪,我写成“<s:set name="portOper" value="#parameters.portOper"/> ”,property仍然能取到值,为何if test就不能呢?  可能是“#parameters.portOper”取到的是一个数组,property则显示这个数组的第一个元素。  还是好好看书先,唉!
      

  5.   


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

  6.   

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

  7.   

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

  8.   

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

  9.   

    前提:数据库中的类型是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
      

  10.   

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

  11.   

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

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

    嘿嘿,楼主可以结贴了吧
      

  12.   

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

  13.   

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

  14.   

    最正确的判断方法是:<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>
    注意,一定要使用\"待对比字符串\"这样的格式转义"符号。
      

  15.   

    代码改为如下: 
    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> 都是可行的。
      

  16.   

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

  17.   

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

  18.   

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

  19.   

    <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>(测试通过,这样用是最正确的) 這些都是測試通過的﹗
      

  20.   

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

  21.   

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

  22.   

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

  23.   

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