6

index.jspユーザーがコントローラーサーブレットを使用してデータベースに保存されるデータを入力するフォームがあるページがあります。

index.jspデータベースにデータを入力した後、そのフォームと同じページ ( ) を表示したい。また、ユーザーがデータベースに入力したすべてのエントリを表示したいと考えています。

forward()の方法でやってみましたRequestDispatcher。正常に動作します (つまり、同じフォームを再度表示し、JSTL を使用してフォームの下にそのユーザーが入力したすべてのデータを表示できます)。

しかし問題は、ユーザーがボタンを押すたびにRefresh or F5、以前のすべてのデータもデータベースに入力され、すべてのデータを表示しているため、重複したエントリも表示されることです。

POST-REDIRECT-GET パターンを使用することを考えましたが、問題は、リダイレクト時に JSTL を使用して表示されるデータを取得できないことです。

どうすればいいのですか?

4

4 に答える 4

9

POST-REDIRECT-GET パターンを使用することを考えましたが、問題はリダイレクト時に JSTL を使用してそれらのデータが表示されないことです。

新しい GET リクエストで表示したい情報を識別するリクエスト パラメータを送信するだけです。

// ...
Long id = dataService.save(data);
// ...
response.sendRedirect(request.getContextPath() + "/index?editId=" + id);

次に、次の URL パターンにマップされたサーブレットで/index

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Long editId = Long.valueOf(request.getParameter("editId")); // Handle nullcheck yourself.
    Data editData = dataService.find(editId);
    request.setAttribute("editData", editData); // For the edit form.
    List<Data> allData = dataService.list();
    request.setAttribute("allData", allData); // For the table/list of all data.
    request.getRequestDispatcher("/index.jsp").forward(request, response);
}
于 2012-10-10T22:06:39.743 に答える
5

ページに非表示の ID を追加します。データがデータベースにとって新しい場合 (ID = 不明)、ID を挿入して作成し、その ID でページを更新します。そうすれば、それが ID != 不明であるかどうかがわかるので、挿入を行う必要はありません。また、データが変更されていない場合は、更新を行う必要さえありません...

于 2012-10-04T09:57:08.917 に答える
0

これが最も簡単な解決策です

<%@page import="java.util.*"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%!
//This List is just for demonstration purposes
List<String> names = new ArrayList<String>();
%>
<%
if(request.getParameter("name")!=null ){
    names.add(request.getParameter("name"));
    session.setAttribute("nameList", names);
    //Here you put your database insert code

    //Whenever the code execution reaches this line , 
    //then it means that you have a new page submission
    //and not a refresh or f5 case

    response.sendRedirect("index.jsp");
}
%>

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <form action="index.jsp" method="post">
            <input type="text" id="name" name="name"/>
        </form>
        <p>
            <table>
                <c:forEach items="${nameList}" var="element">    
                    <tr>
                        <td>Name:  <c:out value="${element}"/> </td>
                    </tr>
                </c:forEach>
            </table>
        </p>
    </body>
</html>

秘訣はにありますresponse.sendRedirect("index.jsp");。これにより、nullすべてのリクエストパラメータが作成されます。f5またはrefreshがヒットした場合、ifは実行されません。通常の送信の場合は、ifが実行され、を呼び出します response.sendRedirect("index.jsp");

要約すると、あなたが本当にする必要があるのは:

1)チェックif(request.getParameter("name")!=null )

2)上記が当てはまる場合は、データベースを挿入します

3)上記が当てはまる場合response.sendRedirect("index.jsp");

アップデート

if(request.getParameter("name")!=null ){
    DbUtility.addNameToDb(request.getParameter("name"));
    ArrayList<String> currentList = DbUtility.getAllNamesFromDb();
    session.setAttribute("nameList", currentList);
    response.sendRedirect("index.jsp");
}

これらの2つのメソッドを実装する必要があります。はデータベースaddNameToDb(String)に作成insertされます。そして、はデータベースのエントリを表すオブジェクトをgetAllNamesFromDb()返します。(そして、私の最初の回答で以前に紹介したリストArrayList<String>はもう必要ありません)names

于 2012-10-08T08:05:32.047 に答える
0

これには PRGP (Post Redirect Get Pattern) が適していると思います。Spring Web Flow を使用している場合、Post-get-redirection の後に保持したいデータを配置できる FlashScope があります。このアプローチを使用すると、編集 ID 以外のものを保持できます。

于 2012-10-14T05:55:21.863 に答える