4

taglibメソッドc:forEachに問題があります。サーブレットクラスから言語のリストを取得し、c:forEachを使用してjspページに表示したいと思います。しかし、何も表示されていません^^空の選択タグ。

jspファイルのforeachループ(私は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>

私のサーブレットクラス(私もそれを使って何かを送信するフォームを実行する必要があるため、サーブレットです):

...
// 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ます。この設計を維持する場合、サーブレットのdoGet()(またはdoPost()) メソッドには次の行が必要です。

request.setAttribute("registrationServlet", this);

しかし、持っている方がはるかにきれいです

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

そして、JSP で:

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