【问题标题】:Checking request parameter value in Struts2 tag检查 Struts2 标签中的请求参数值
【发布时间】:2010-12-30 05:11:14
【问题描述】:

我的jsp中有以下代码:

<s:property value="#parameters['test']"/>
<br/><s:property value="'1'.equals(#parameters['test'])"/>

现在,如果我像这样访问此操作: test.action?test=1

我得到以下信息:

1
false

想知道,为什么 1 不等于 1?

【问题讨论】:

    标签: jsp struts2 ognl


    【解决方案1】:

    编辑: OGNL 中的""(双引号)和''(单引号)是有区别的。

    双引号将单个字符计算为字符串,而单引号将单个字符计算为字符类型。您可以将多个字符放在单引号中,它将被评估为字符串。

    进一步的请求范围不是

    Map<String, String> 
    

    但是

    Map<String, String[]> 
    

    在jsp的最后5行中可以看到。

    JSP

    <%@taglib prefix="s" uri="/struts-tags"%>
    <!-- values from action where letters = "abcd" -->
    <s:property value="letters"/><br/> <!-- Displays: abcd -->
    <s:property value="letters.equals('abcd')"/><br/> <!-- Displays: true -->
    <s:property value="'abcd'.compareTo('abcd')"/><br/> <!-- Displays: 0 -->
    <s:property value="'abcd'.compareTo('abcd') == 0"/><br/> <!-- Displays: true -->
    <s:property value="'abcd'.equals('abcd')"/><br/> <!-- Displays: true -->
    <s:property value="'abcd'.equals(letters)"/><br/> <!-- Displays: true -->
    <br/>
    <!-- RUN with ?test=a&test2=abc appended to the url -->
    <!-- Time for the numbers from action where number = 1-->
    <s:property value="number"/><br/><!-- Displays: 1 -->
    <s:property value="number.toString()"/><br/><!-- Displays: 1 -->
    <!-- OGNL strings in certain cases must be double quoted -->
    <s:property value='"1".equals(number.toString())'/><br/><!-- Displays: true -->
    <!-- As we can see single quotes does automatic type conversion to Character which is then evaluates false-->
    <s:property value="'1'.equals(number.toString())"/><br/><!-- Displays: false -->
    <!-- here a string is compared to an integer which is false-->
    <s:property value='"1".equals(number)'/><br/><!-- Displays: false -->
    <br/><!-- Request Variables -->
    <s:property value="#parameters['test']"/><br/><!-- Displays: a -->
    <!-- a is single quoted so automatic type conversion probably converted it to a Character, which is not equal to string "a" -->
    <s:property value="'a'.equals(#parameters['test'])"/><br/><!-- Displays: false -->
    <!-- both are strings so equality works as expected -->
    <s:property value='#parameters["test"]'/><br/><!-- Displays: a -->
    <s:property value='"a".equals(#parameters["test"])'/><br/><!-- Displays: false because #parameters["test"] is a string[] and calling toString on string[] does not work -->
    <!-- #parameters['test2'] now is 'abc' automatic type conversion of OGNL swill convert 'abc' to a string and so both are equal -->
    <s:property value='#parameters["test2"]'/><br/>
    <!-- Double quotes must be a string -->
    <s:property value='"abc".compareTo(#parameters["test2"]) == 0'/><br/><!-- Displays: true -->
    <!-- Single quote so automatic type conversion... string of chars is converted to String -->
    <s:property value="'abc'.compareTo(#parameters['test2']) == 0"/><br/><!-- Displays: true -->
    <!-- Out of curiosity I'd like to know if '1' is an Integer or a Byte -->
    <s:property value="'1'.toString()"/><br/><!-- Answer: Neither it prints "class java.lang.Character" -->
    <!-- 'a' is a Character however equals calls toString() -->
    <!-- But the request object (and session too) is not <string, string> but <string, string[]> -->
    1: <s:property value='"1".class'/><br/> <!-- class java.lang.String -->
    2: <s:property value='#parameters["test"].class'/><br/> <!-- Array of string: class [Ljava.lang.String; -->
    3: <s:property value='#parameters["test"][0].class'/><br/> <!-- This is what we need: class java.lang.String -->
    <s:property value='#parameters["test"][0].equals("a")'/><br/> <!-- Now this works -->
    <s:property value="#parameters['test'][0].equals('a'.toString())"/><br/> <!-- this is another way, leaving off the .toString results in false -->
    

    Test.jsp(动作)

    包struts2; 导入 com.opensymphony.xwork2.ActionSupport;

    public class test extends ActionSupport{
        public String letters = "abcd";
        public int number = 1;
    }
    

    【讨论】:

    • 1 只是一个例子。任何字符串的行为都相同: 不起作用
    • 不,因为 == 用于内置类型。字符串不能这样比较。如果 #parameters['test'] 评估为 'hello' 将起作用。如果 #parameters['test'] 计算结果为整数,则 将起作用。
    • 刚刚测试过: 在 test.action?test=hello 上产生 false
    【解决方案2】:

    我刚刚发现#parameters['test'] 返回一个字符串数组。所以当你说

    <s:property value="'1'.equals(#parameters['test'])"/>
    

    您实际上是在将字符串 '1' 与数组 {'1'} 进行比较,因此它返回 false。也许这是因为有两个同名的参数

    正确的做法是

    <s:property value="'1'.equals(#parameters['test'][0])"/>
    

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2023-03-19
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多