使用jsp使用optgroup创建select

时间:2016-12-15 17:17:10

标签: jsp jstl

我有一个使用jsp生成的选择,它工作得很好。这是我使用的代码:

<select class="heading4Black" name="DailyTasks" onchange="showreport(this)">
<%
for (int i = 0; i < links.size(); i++) {
    elem = (Element) links.get(i);
%>

    <option title='<%=elem.attributeValue("tooltip") %>' value='<%= elem.attributeValue("url")%>' <%= (i == 0) ? "selected" : "" %> ><%=elem.attributeValue("name")%></option>
<%
}
%>
    </select>

这给了我想要的输出。现在,我需要在其中一个选项中添加一个optgroup,所以不要选择带有这样的选项:

option1
option2
option3

我需要让option2成为一个html optgroup,这样我的select应该是这样的:

option1
option2
    subopt1
    subopt2
option3

我一直在尝试使用jstl和c:选择,但我遇到了很多麻烦。这是我尝试使用的代码(及其变体):

<select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)">
<%
for (int i = 0; i < links.size(); i++) {
    elem = (Element) links.get(i);
 %>

<c:choose>
<c:when test="'${elem[i].attributeValue("name")}'=='Facility Ticket'">
 <optgroup label="Some String">
        <option>One</option>
        <option>Two</option>
    </optgroup>      
</c:when>    
<c:otherwise>
    <option title='<%=elem.attributeValue("tooltip") %>' value='<%= elem.attributeValue("url")%>' <%= (i == 0) ? "selected" : "" %> ><%=elem.attributeValue("name")%></option>
</c:otherwise>
</c:choose>         
 <%
   }
  %>
 </select>

我得到的是一个选项,其选项如下所示:

Some String
   subopt1
   subopt2
Option1
Some String
   subopt1
   subopt2
Option2
Some String
   subopt1
   subopt2

有人可以就如何使这项工作提供一些指导吗?请记住,我真的是一个javascript人。我扔了这个jsp项目,因为大约10年前我接触过它。 感谢

1 个答案:

答案 0 :(得分:1)

问题1:

您的输出表明JSTL(选择,何时,否则)被忽略 每次迭代,您都会在when otherwise内获取代码。 这是因为你可能忘了在JSP前添加这一行:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

通过添加上面的行,您可以激活JSP标准标记库的Core评估。因此,将处理<c:tags>之类的标记。否则,它们会按原样发送到浏览器 (按CTRL+U可以在浏览器中看到html代码(Chrome&amp; Firefox))

问题2:

修复后,您可能会遇到编译错误。 c:when行是错误的:

<c:when test="'${elem[i].attributeValue("name")}'=='Facility Ticket'">

我可以看到多个问题:

  • 不需要索引[i],您确实已经通过links.get(i)访问了该元素:
  • 您尝试通过表达式语言elem访问${elem...},但仅当此scriptlet变量已分配给属性时,此方法才有效。

使用scriptlet的解决方案:

如果您在c:when test中使用scriptlet,它可能看起来像:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)">
<%
for (int i = 0; i < links.size(); i++) {
    // added Element type in front
    Element elem = (Element) links.get(i);
 %>

<c:choose>
<c:when test="<%=elem.attributeValue("name").equals("Facility Ticket")%>">
 <optgroup label="Some String">
        <option>One</option>
        <option>Two</option>
    </optgroup>      
</c:when>    
<c:otherwise>
    <option title='<%=elem.attributeValue("tooltip") %>' 
            value='<%= elem.attributeValue("url")%>' 
          <%= (i == 0) ? "selected" : "" %> 
    >
       <%=elem.attributeValue("name")%>
    </option>
</c:otherwise>
</c:choose>         
 <%
   }
  %>
 </select>

没有scriptlet的解决方案。仅限JSTL和JSP-EL:

您正在混合scriptlet,EL和JSTL。它可以统一。

来自scriptlet的for,可由<c:forEach>替换 所有JSP表达式(<%= ... %>)都可以被EL(表达式语言)取代 但首先,在准备links的地方,将它们设置为请求属性,如下所示:

request.setAttribute("links", links);

之后,JSP可能看起来像:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<select class="heading4Black" name="DailyTasks" onchange=" somefunction(this)">
    <c:forEach var="elem" items="${links}" varStatus="varStatus">
        <c:choose>
            <c:when test="${elem.attributeValue('name')=='Facility Ticket'}">
                <optgroup label="Some String">
                    <option>One</option>
                    <option>Two</option>
                </optgroup>
            </c:when>
            <c:otherwise>
                <option title="${elem.attributeValue('tooltip')}" 
                        value="${elem.attributeValue('url')}" 
                     <c:if test="${varStatus.index == 0}"> selected</c:if>
                >
                    ${elem.attributeValue('name')}
                </option>
            </c:otherwise>
        </c:choose>
    </c:forEach>
</select>

注意使用varStatus.index来访问迭代索引。