c:forEach不工作

时间:2012-09-06 13:16:04

标签: java jsp web

我遇到了taglib方法c:forEach的问题。我想从servlet类中获取一个语言列表,并使用c:forEach在jsp页面上显示它。但它只显示^^一个空的选择标记。

jsp文件中的每个循环(我有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文件中没有用;)

2 个答案:

答案 0 :(得分:6)

${registrationServlet.inputLangs}表示:

  • 在页面范围
  • 中找到名为“registrationServlet”的属性
  • 如果找不到,请在请求范围
  • 中找到名为“registrationServlet”的属性
  • 如果未找到,请在会话范围
  • 中找到名为“registrationServlet”的属性
  • 如果找不到,请在应用程序范围
  • 中找到名为“registrationServlet”的属性
  • 如果找到,请在找到的对象上调用getInputLangs()

因此,如果您未在任何范围内存储RegistrationServlet的任何实例,则此表达式将始终评估为null。如果保留此设计,则servlet的doGet()(或doPost())方法应具有以下行:

request.setAttribute("registrationServlet", this);

但是拥有

会更加清洁
request.setAttribute("inputLangs", getInputLangs());

,在JSP中:

<c:forEach var="lang" items="${inputLangs}">

答案 1 :(得分:0)

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

中的JSTL 1.1 JAR文件

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