使用JSP文档(JSPX)有条件地在元素上设置属性
在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的自动转换器时,我遇到了<jsp:element>
和<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>
这显然比其他解决方案更冗长。但这是完全独立的:不需要自定义标签。而且,它可以轻松扩展到所需的任意数量的属性。
我想自上一篇文章以来已经过去了一段时间,但我遇到了与<select> <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)