4

我对 taglib 方法 c:forEach 有疑问。我想从 servlet 类中获取语言列表,并使用 c:forEach 在 jsp 页面上显示它。但它什么也没显示^^一个空的选择标签。

jsp文件中的for each循环(我有taglib导入并且已经尝试过没有c:out):

...
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
...
<c:forEach var="lang" items="${registrationServlet.inputLangs}">
  <option><c:out value="${lang}"></c:out></option>
</c:forEach>

我的 Servlet 类(它是一个 servlet,因为我也必须用它做一些表单提交的东西):

...
// List of languages to choose from
List<String> inputLangs;
...
// Query the languages from the database
public List<String> getInputLangs() {
    try {
        String query = "SELECT DISTINCT Lang FROM country";
        ResultSet result = DbConnection.read(query);
        while (result.next()) {
            inputLangs.add(result.getString("lang"));
        }
    } catch (SQLException e) {
        System.err.println("Couldn't get languages from DB.");
    }
    return inputLangs;
}

我做错了什么?^^

顺便提一句。它适用于纯java:

<%
RegistrationServlet reg = new RegistrationServlet();
for (String lang : reg.getInputLangs()) {
%>
  <option><%=lang%></option>
<%
}
%>

但据我所知,这在 jsp 文件中是不行的;)

4

2 回答 2

9

${registrationServlet.inputLangs}方法:

  • 在页面范围内找到一个名为“registrationServlet”的属性
  • 如果没有找到,在请求范围内找到一个名为“registrationServlet”的属性
  • 如果未找到,则在会话范围内查找名为“registrationServlet”的属性
  • 如果没有找到,在应用范围内找到一个名为“registrationServlet”的属性
  • 如果找到,则调用getInputLangs()找到的对象

因此,如果您没有RegistrationServlet在任何范围内存储任何实例,则此表达式将始终计算为null. 如果你保持这个设计,你的 servlet 的doGet()(or doPost()) 方法应该有以下行:

request.setAttribute("registrationServlet", this);

但它会干净得多

request.setAttribute("inputLangs", getInputLangs());

并且,在 JSP 中:

<c:forEach var="lang" items="${inputLangs}">
于 2012-09-06T13:25:33.360 回答
0

您的类路径上有正确的 JSTL jar 文件吗?在您的情况下,/WEB-INF/lib 中的 JSTL 1.1 JAR 文件

https://stackoverflow.com/tags/jstl/info

于 2012-09-06T13:34:05.997 回答