使用JSP文档(JSPX)有条件地在元素上设置属性

时间:2020-03-06 14:58:13  来源:igfitidea点击:

在HTML表单中,可以通过在按钮上定义" disabled"属性(具有任何值)来禁用按钮:

<button name="btn1" disabled="disabled">Hello</button>

如果要启用按钮,则该属性不应存在,因为没有定义的值可以设置为Disabled属性,否则将使按钮处于启用状态。

当我想在使用JSP文档(jspx)时启用/禁用按钮时,这给我带来了问题。由于JSP文档必须是格式正确的XML文档,因此我看不到有条件地包含此属性的任何方式,因为类似以下内容的内容不合法:

<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>

虽然我可以使用JSTL if标签复制标签两次,以获得预期的效果,但在我的特定情况下,我在按钮上声明了15个以上的属性(很多AJAX的javascript事件处理程序属性),因此复制标签将使JSP很乱。

在不牺牲JSP的可读性的情况下,如何解决这个问题?是否有任何可通过处理输出DOM来向父级添加属性的自定义标签?

解决方案

我实际上并没有使用JSP(我回答了一次,然后在理解了"必须使用有效的XML"之后将其删除)。我能想到的最干净的是:

<% if (isDisabled) { %>
  <button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
  <button name="btn1">Hello</button>
<% } %>

<%= blah%>语法不是JSP文档所需的合法XML。我们有2个选择:

  • 替换<%=(isDisabled)? " disabled":""%>与<jsp.expression>(isDisabled)吗? " disabled":"" </jsp.expression>
  • 使用Core taglib和EL(确保将isDisabled置于页面范围内),如下所示:
<c:choose>
  <c:when test="${isDisabled}">"disabled"</c:when>
  <c:otherwise>""</c:otherwise>
</c:choose>

希望能对我们有所帮助:)

在读到一个从jsp到jspx的自动转换器时,我遇到了&lt;jsp:element>&lt;jsp:attribute>标签。如果我理解正确,那么我们应该可以做类似的事情

<jsp:element name="button">
  <jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>

并有jsp引擎输出

<button someAttribute="value"/>

或者类似的东西。上一页中指出的唯一问题是,这似乎不适用于条件构造。转换器的作者解决了创建一些辅助标记的问题,我们可以看一下下载我猜得到的源代码。希望能有所帮助。

我使用具有动态属性的自定义JSP标记。我们可以这样使用它:

<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/>

基本上,此标签的作用是生成一个带有elementName的XML元素,并将所有属性都放入标签中,但跳过空的属性。

标签本身很容易实现,我的实现只有44行。

我们可以使用<jsp:text>标签使用有效的XML解决此问题:

<jsp:text><![CDATA[<button name="btn1"]]></jsp:text>
    <c:if test="${isDisabled}"> disabled="disabled"</c:if>
    >
    Hello!
<jsp:text><![CDATA[</button>]]></jsp:text>

这显然比其他解决方案更冗长。但这是完全独立的:不需要自定义标签。而且,它可以轻松扩展到所需的任意数量的属性。

我想自上一篇文章以来已经过去了一段时间,但我遇到了与&lt;select> &lt;option selected =" selected">标签完全相同的问题,即动态声明选择了哪个选项。为了解决这个问题,我制作了一个自定义标签。我在这里的另一个答案中张贴了详细信息

我得出的结论是,没有捷径可走。 EL和JSP表达式只能存在于XML元素属性(以及正文内容)中。因此,我们必须执行以下操作;

<c:choose>
    <c:when test="${isDisabled}"><button name="btn1" disabled="disabled">Hello</button></c:when>
    <c:otherwise><button name="btn1">Hello</button></c:otherwise>
</c:choose>

使用scriptlet表示法不适用于JSP文档(.jspx)