3

sql:queryを、いくつかのパラメーターを使用して複雑なクエリを作成するJavaコードと交換したいと思います。現在のSQLは単純な選択です。

<sql:query
   var = "result"
   dataSource = "$ {dSource}"
   sql = "select * from TABLE">
</ sql:query>

Java ResultSet(つまり、rs = stmt.executeQuery(sql);)を取得し、その結果をJSPで使用できるようにして、この教科書のJSPを実行するにはどうすればよいですか。

より明確にするために、上記のクエリを削除してJavaに置き換えたいと思います。

<%
  ResultSet rs = stmt.executeQuery(sql); //乱雑なコードは一部のコントローラーに含まれます
%>
<c:forEach var = "row" items = "$ {result.rows}">
  <c:out value = "$ {row.name}" />
</ c:forEach>

Javaセクションでセッション/ページ変数を設定しますか、それとも変数にアクセスするために使用できるELトリックがありますか?

4

4 に答える 4

7

モデル(行):

public class Row { 
    private String name;
    // Add/generate constructor(s), getters and setters.
}

DAO:

public List<Row> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Row> rows = new ArrayList<Row>();

    try {
        connection = database.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(SQL_LIST);
        while (resultSet.next()) {
            Row row = new Row();
            row.setName(resultSet.getString("name"));
            // ...
            rows.add(row);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return rows;
}

コントローラ(サーブレット):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<Row> rows = someDAO.list();
        request.setAttribute("rows", rows);
    } catch (SQLException e) {
        request.setAttribute("error", "Retrieving rows failed.");
        e.printStackTrace();
    }
    request.getRequestDispatcher("page.jsp").forward(request, response);
}

ビュー(page.jsp):

<c:forEach items="${rows}" var="row">
    <c:out value="${row.name}" />
    ...
</c:forEach>
<c:if test="${not empty error}">Error: ${error}</c:if>
于 2010-03-11T20:32:51.217 に答える
1

Java コードからセッション/リクエスト属性を設定します。

ただし、ライフサイクルの問題があるため(つまり、閉じる必要があるため)、ResultSet を使用しないことをお勧めします。Java コードで ResultSet オブジェクトをフェッチし、それを反復して構築し、たとえば List を作成し、ResultSet を閉じて、List を JSP に渡すことをお勧めします。

Spring を使用している場合、JdbcTemplates は、SQL 文字列とパラメーターを受け取り、クエリの結果で List> を返すメソッドを提供します。これは、これに非常に便利です。

于 2009-01-03T18:49:50.287 に答える
0

あなたはそうしない。

第 1 に、たとえタグを介してでも SQL を JSP に配置することは、ひどい設計上の選択であることを示しています。JSP ページは、Model View Controller パターンの「ビュー」です。その仕事は、モデルを表示することであり、実際にモデルを表示すること以外には何もしません。

コントローラ クラスで SQL を実行し、JSP を介して表示できる実際の Java オブジェクトを取得します。次に、JSP でそれらを表示します。SQL はコントローラーに任せ、JSP は単にデータを表示することに専念させてください。関心事が明確に分離されるだけでなく、その結果として JSP がはるかに単純になり、後で行う必要がある場合、JSP コードよりも Java コードをリファクタリングする方がはるかに簡単です (Java をテストする方がはるかに簡単です)。コードも)。

于 2009-01-01T02:52:05.630 に答える
0

spring mvn や struts などの Web フレームワークを使用している場合、実際の jsp の前に実行されるコントローラー クラスがあります。これはメソッドを持つことができます

ResultSet getResult()

このメソッドは、jsp 内で ${result} として使用できます。

これらのフレームワークを使用していない場合でも、jsp usebean を使用して、javaclass を変数にバインドできます (usebean のドキュメントを確認してください)。myBean の変数に bean を使用する場合は、${myBean.result} でアクセスします

最後に、結果を「別の場所」のリクエスト パラメータにバインドすることもできます。この場合、${param.result} としてアドレス指定します

于 2008-12-21T17:49:34.077 に答える