在 scriptlet 中使用 equalsIgnoreCase 时 JSP Core 标记失败

Posted

技术标签:

【中文标题】在 scriptlet 中使用 equalsIgnoreCase 时 JSP Core 标记失败【英文标题】:JSP Core tag failing when using equalsIgnoreCase inside scriptlet 【发布时间】:2012-12-19 12:54:47 【问题描述】:

这可能是显而易见的,但我无法弄清楚。

为什么

<c:if test="<%= (aString!= null) && (!aString.equalsIgnoreCase(""))%>">

一直失败

<c:if test="<%=(aString!= null) && (aString.trim().length() > 0)%>">

工作正常吗? 这些小脚本在 c:if 之外工作得很好,所以我想知道当我把它放在核心标签中时出了什么问题。 例外就像

JSPG0055E: 无法从名称 [] 值 [))%] 创建 xml 属性 错误代码:500

【问题讨论】:

我什至不明白你在做什么; JSTL 测试中的字符串脚本?你不能随意混合和匹配任何你想要的东西(即使你可以,你也不应该)。您认为test 属性中的内容是什么? 知道了,戴夫。赞成。事实是我看到了太多这样的代码,以至于我开始编写类似的代码。我已将实现更改为 . 【参考方案1】:

特定错误是由这些双引号引起的。他们过早地结束了test 属性的值。

但是,所有这些都不是正确的方法。事实上,将“oldschool” scriptlets 与“modern” taglibs 混合使用是错误的。根本不支持这种语法。您不能在 taglib 属性中使用 scriptlets。你应该在 taglib 属性中使用 EL——那些$ 的东西。

假设 aString 被预先放置为页面、请求、会话或应用程序范围的属性,例如 as

request.setAttribute("aString", aString);

那么这应该是为了检查aString是否不为空也不为空:

<c:if test="$not empty aString">

另见:

Our EL wiki page Our JSTL wiki page How to avoid Java code in JSP files? Evaluate empty or null JSTL c tags

【讨论】:

知道了。谢谢。我已将实现更改为 您不需要显式测试空字符串。 empty 关键字已经涵盖了这一点。所以只要$not empty aString,正如我的回答所示,真的是你所需要的。【参考方案2】:

您不能在 null 上使用 equalsIgnoreCase 而不是设置对象。为什么要使用 equalsIgnoreCase 检查字符串是否为空,这不是好方法。您的第一次检查 (=!null) 就足够了。

【讨论】:

检查保证如果对象为空,则永远不会调用equalsIgnoreCase()。但这也不能解释或回答问题的症结。 @VahidFarahmand 因为您的答案与实际问题(JSP 语法)和下一个问题(期待 EL 表达式的东西中的小脚本)完全无关。

以上是关于在 scriptlet 中使用 equalsIgnoreCase 时 JSP Core 标记失败的主要内容,如果未能解决你的问题,请参考以下文章

使用struts mvc在jsp中显示动态值而不使用scriptlet

jsp学习之scriptlet的使用方法

JSP中的标签库与scriptlet [重复]

访问 JSP 中的常量(没有 scriptlet)[重复]

如何在 JSP 中将 JavaScript 值传递给 Scriptlet?

利用script和scriptlet moniker绕过脚本白名单限制