【问题标题】:c:forEach not workingc:forEach 不工作
【发布时间】:2012-08-31 07:50:01
【问题描述】:

我对 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 文件中是不行的;)

【问题讨论】:

  • 好吧,因为你没有真正说明问题是什么(错误消息,没有显示任何内容,显示与预期不同的东西等),我不能真正告诉你,但很可能您忘记在 jsp 顶部添加 taglib 导入声明。

标签: java jsp web


【解决方案1】:

${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}">

【讨论】:

  • 好的,这真的很有帮助,谢谢。所以现在它可以工作了,在我第一次提交之后。显然是因为那时执行了 doPost()。有没有一种servlet的方法叫做jsp页面的onload?
  • 没有。在设计良好的 MVC 架构中,servlet(控制器)准备视图(JSP)所需的所有数据并将它们存储在请求属性中。然后它转发到视图,视图只是从请求属性中获取它必须显示的内容。这是我在回答结束时建议做的事情。
  • 学到了很多,谢谢。它现在通过首先调用 servlet 然后转发到 jsp 来工作:)!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2013-08-01
    • 2012-08-15
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多