如何从JSPX输出

问题描述:

一些html标签将“给”属性的“any”值解释为“true” - >选项标签。如何从JSPX输出<option selected =“true”>?

我经常最终会做这样的事情:

<c:choose> 
    <c:when test="${isSelected}"/> 
     <option selected="true">Opt1</option> 
    </c:when> 
    <c:otherwise/> 
     <option>Opt1</option> 
    </c:otherwise> 
</c:choose> 

我知道我可以声明习俗encapslate这种行为,但也得到很丑陋,除非我在Java代码中它。

有没有更聪明的方法来做到这一点?

是,一个更聪明的办法是写

<option selected="selected">Opt1</option> 

因为这是什么mandated by XHTML

我知道这不是你真的问:-)我觉得你的方式是罚款,或者您可以使用条件表达式来代替:

<option ${isSelected?"selected=\"selected\"":""}>Opt1</option> 

这虽然不一定漂亮短。

+0

尼斯回答,可惜它在这里不起作用。什么版本的jspx为你做这个?你确定这不是jsp吗? – krosenvold 2009-11-19 18:44:17

+0

不好意思,这的确是JSP;我已经让他们穿过了。我想你的方法是唯一适用的方法; c:如果在这种情况下也不起作用。 – ChssPly76 2009-11-19 18:53:41

解决这个问题的一种方法是使用自定义标签。

我喜欢的JSP2X转换器所采用的方法,在让你这样做你的WEB-INF /标签的文件夹定义自定义标签:

<jspx:element name="option"> 
    <c:if test="${selected}"> 
     <jspx:attribute name="selected">selected</jspx:attribute> 
    </c:if> 
    <jspx:body>Opt1</jspx:body> 
</jspx:element> 

一个更紧凑的方法可能是专门创建一个自定义标签对于做出正确选择的选项,对所选属性采用布尔值,如果为true,则发出selected =“selected”属性,否则不会。这将是更多的紧凑:

<jspx:option selected="${selected}">Opt1</option> 
+0

我不认为c:如果条件允许在元素标签内。这是以后规格的变化吗? – krosenvold 2009-12-12 13:58:00

+0

这些jspx:元素不在规范中,它是由JSP2X丢弃的自定义标记。 – 2009-12-13 15:46:18

+0

*叹*希望你可以编辑这些评论。 =) – 2009-12-13 15:47:09

对于<select><option selected="selected">问题,我决定,我不会介意有点冗长外,如果它只是一个时间冗长外...所以我创建了一个标签文件(.tagx)在/WEB-INF/tags/select.tagx像这样:

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 

    <jsp:directive.attribute name="id" required="true" /> 
    <jsp:directive.attribute name="name" required="true" /> 
    <jsp:directive.attribute name="options" required="true" /> 
    <jsp:directive.attribute name="selected" required="true" /> 

    <select id="${id}" name="${name}"> 
    <c:forEach var="opt" items="${options}"> 
     <c:choose> 
     <c:when test="${opt == selected}"><option selected="selected">${opt}</option></c:when> 
     <c:otherwise><option>${opt}</option></c:otherwise> 
     </c:choose> 
    </c:forEach> 
    </select> 
</jsp:root> 

,并使用它,像这样:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<html xmlns="http://www.w3.org/1999/xhtml" version="2.1" 
    ... 
    xmlns:form="urn:jsptagdir:/WEB-INF/tags/"> 

    ... 

    <head> 
     ... 
    </head> 
    <body> 
     <form method="POST" commandName="loginRequest" action="index_login.html"> 
      <fieldset id="loginFieldSet"> 
       ... 

       <div> 
        <label for="day" path="day">Favourite day: </label> 
        <form:select id="day" name="day" selected="Saturday" 
         options="Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday" /> 
       </div> 
      </fieldset> 
      <div> 
      <input type="submit" tabindex="3" /> 
      <input type="reset" tabindex="4" /> 
      </div> 
     </form> 
    </body> 
</html> 

krosenvold,我不同意,这是丑陋的...也许讨厌,但实际上,我很高兴我不必w为此编写任何代码。一旦你定义了标签,你的JSPX变得更加整洁。此外,我根本不认为有这个捷径。

+0

只需在EL中使用三元运算符。 '

+0

你真的尝试过吗?它不起作用 - 它完全无效的XML。 – 2010-03-01 10:31:14

还有另一种方法来解决这个问题。这有点破解,但使用taglib或选择复制我发现的标签的地方的选择相当不错。

您可以建立标签的JSTL组标签内的值,这样的事情:

<c:set var="mytag" value="&lt; option ${isSelected ? 'selected='\true\' : '' } &gt;"> 

然后,只要你想要的标签,你只是喜欢这样的输出:

${mytag}