JSTL if标签是否包含相等的字符串


90

我的JSP页面上的一个对象有一个变量:

<%= ansokanInfo.getPSystem() %>

变量的值是NAT,它是正确的,我想对此值应用某些页面元素。如何使用标签来了解情况?我尝试了类似的东西

<c:if test = "${ansokanInfo.getPSystem() == 'NAT'}">      
   process  
</c:if> 

但是上面没有显示任何内容。我该怎么办?或者我也可以使用scriptlet

<% if (ansokanInfo.getPSystem().equals("NAT"){ %>
process
<% } %>

感谢您的任何回答或评论。


1
能否请您详细说明getPSystem()ansokanInfo?您是在请求中设置它们还是通过访问它们import
Santhosh 2014年

1
IIRC我是在请求中设置它们的,解决方案(解决方法)是按照BalusC的说明升级Websphere,然后有一个新版本可以通过标签调用bean方法。我在问题和某些版本中使用标准Websphere,然后再运行jsp和jstl。请在BalusC告诉我们我正在使用的Websphere版本中找到另一个问题,该版本需要较新的版本才能调用这些方法。
Niklas R.

1
那么,您现在将应用服务器升​​级到8了吗?那解决方案会失败吗?
Santhosh 2014年

@SanKrish我现在不使用JSP。我希望它对您有用,并且已为应用服务器的较新版本进行了更新。
Niklas R.

Answers:


145

尝试:

<c:if test = "${ansokanInfo.PSystem == 'NAT'}">

JSP / Servlet 2.4(我认为是版本号)不支持EL中的方法调用,而仅支持属性。最新的servlet容器确实支持方法调用(即Tomcat 7)。


1
我根据乔恩的答案更新了答案。顶帽子给他。
亚当·根特

3
我已经放弃了JSP(X)。我要么使用Mustache(github.com/samskivert/jmustache),要么使用我自己的模板语言JATL(code.google.com/p/jatl)。
亚当·根特

1
您将如何处理多个字符串?最好的方法莫过于<c:if test = "${ansokanInfo.PSystem == 'NAT' || ansokanInfo.PSystem == 'CAT'}">
Dillon


16

我认为其他答案都缺少关于EL表达式中使用的属性名称的一个重要细节。从方法名称转换为属性名称的规则在Java Bean标准的一部分“ Introspector.decpitalize”中指定:

这通常意味着将第一个字符从大写转换为小写,但是在(不寻常的)特殊情况下,如果有多个字符并且第一个和第二个字符均为大写,则我们将其保留。

因此,“ FooBah”变为“ fooBah”,“ X”变为“ x”,但是“ URL”保留为“ URL”。

因此,在您的情况下,JSTL代码应如下所示,注意大写字母“ P”:

<c:if test = "${ansokanInfo.PSystem == 'NAT'}">

2
具有命名约定的getter和setter几乎是Java bean的定义。我想我们需要更多有关将变量传递到jsp的信息。为了对EL可用,它必须在一定范围内,例如作为请求或pageContext属性。由脚本块创建的局部变量将对EL不可用。
约恩·霍斯特曼

5

您可以使用scriptlet,但是这不是可行的方法。如今,您的JSP文件中的内联scriplet或JAVA代码被认为是一种坏习惯。

您应该多读一些JSTL。如果ansokanInfo对象在您的请求或会话范围内,则按如下所示打印对象(toString()方法):$ {ansokanInfo}可以为您提供一些基本信息。$ {ansokanInfo.pSystem}应该调用对象的getter方法。如果这一切都可行,则可以使用以下命令:

<c:if test="${ ansokanInfo.pSystem  == 'NAT'}"> tataa </c:if>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.