如何使用Struts2标签和OGNL比较两个字符串?

Dan*_*Dan 6 java jsp struts2 ognl struts-tags

我试图比较两个值:一个来自session,另一个来自iterator

<s:iterator value="themes" status="currentRecord"> 
    <s:if test="%{usertheme}) == %{themeName}">
        <td align="center" bgcolor="red">
    </s:if>
    <s:else>
        <td align="center" bgcolor="green">
    </s:else>
</s:iterator>
Run Code Online (Sandbox Code Playgroud)

但我无法比较我的价值观,请你告诉我我在哪里犯错误?

And*_*ios 8

%{} 应该(如有必要)围绕所有陈述,而不是在中间.

对于字符串,你应该使用.equals,.equalsIgnoreCase,.contains,.indexOf等...不是==.

改为:

<s:iterator value="themes" status="currentRecord"> 
   <s:if test="%{#session.usertheme.equalsIgnoreCase(themeName)}">
      <td align="center" bgcolor="red">
   </s:if>
   <s:else>
      <td align="center" bgcolor="yellow">
   </s:else>
....
Run Code Online (Sandbox Code Playgroud)

这也有效:

   <s:if test="#session.usertheme.equalsIgnoreCase(themeName)">
Run Code Online (Sandbox Code Playgroud)


Dav*_*ton 5

(不是答案,而是两个建议,我需要格式化; Andrea的回答是正确的.)

为了您自己和随后的理智,将JSP的大块变成一行:

  <s:iterator value="themes">
    <tr>
      <s:set var="currTheme" value="%{userTheme == themeName ? 'red' : 'green'}"/>
      <td bgcolor="${currTheme}">Cell content</td>
    </tr>
  </s:iterator>
Run Code Online (Sandbox Code Playgroud)

考虑使用主题命名的CSS而不是内联CSS,并完全避免它,大致:

td.theme1 {
  background-color: red;
}

td.theme2 {
  background-color: green;
}

td.theme3 {
  background-color: #daa520;
}
Run Code Online (Sandbox Code Playgroud)

(假设主题名为"theme1","theme2","theme3",但这不相关.)

<table class="themed-table">
  <s:iterator value="themes">
    <tr>
      <td class="${themeName}">Cell content</td>
    </tr>
  </s:iterator>
</table>
Run Code Online (Sandbox Code Playgroud)

将样式信息"提升"到一个级别会更好,例如table.theme1 td,但是你明白了.这样做可以在主题信息的来源等方面提供很大的灵活性.