我有一个使用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年前我接触过它。 感谢
答案 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
来访问迭代索引。