サーブレットでのdoGetおよびdoPost


105

サーブレットに情報を送信するHTMLページを開発しました。サーブレットでは、私はメソッドdoGet()とを使用していますdoPost()

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException  {

     String id = req.getParameter("realname");
     String password = req.getParameter("mypassword");
}

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

    String id = req.getParameter("realname");
    String password = req.getParameter("mypassword");
}

サーブレットを呼び出すhtmlページのコードは次のとおりです。

<form action="identification" method="post" enctype="multipart/form-data">
    User Name: <input type="text" name="realname">
    Password: <input type="password" name="mypassword">
    <input type="submit" value="Identification">
</form> 

method = "get"サーブレットで使用すると、idとpasswordの値が取得method = "post"されますが、を使用すると、idとpasswordがに設定されnullます。この場合、なぜ値を取得しないのですか?

もう1つ知っておきたいのは、サーブレットによって生成または検証されたデータの使用方法です。たとえば、上記のサーブレットがユーザーを認証する場合、HTMLページにユーザーIDを出力します。文字列 'id'を応答として送信し、この情報をHTMLページで使用できます。出来ますか?


あなたはhtmlでpostメソッドをどのように使用していますか?
イゴールアルタモノフ2010

また、パラメーター名に対する奇妙なループが必要な場合はどうでしょうか。
イゴールアルタモノフ2010

1
`enctype = multipart / form-data`を削除してみましたか?それがあなたの問題だと思います。
Jack Leow、2010

それだけでした。これが存在する場合、投稿が機能しないのはなぜですか?ご協力いただきありがとうございます!
dedalo 2010

回答:


197

前書き

HTTP GETリクエストdoGet()をインターセプトする場合に使用してください。HTTP POSTリクエストをインターセプトする場合に使用してください。それで全部です。一方を他方に移植したり、その逆を行ったりしないでください(Netbeansの不幸な自動生成メソッドなど)。これはまったく意味がありません。doPost()processRequest()

取得する

通常、HTTP GETリクエストはべき等です。つまり、リクエストを実行するたびにまったく同じ結果が得られます(承認/認証、およびページの時間に敏感な性質(検索結果、最新ニュースなど)は考慮されません)。ブックマーク可能なリクエストについて話すことができます。リンクをクリックしたり、ブックマークをクリックしたり、ブラウザのアドレスバーに未加工のURLを入力したりすると、すべてHTTP GETリクエストが発行されます。サーブレットが問題のURLをリッスンしている場合、そのdoGet()メソッドが呼び出されます。通常はリクエストの前処理に使用されます。つまり、表に表示するデータを収集するなど、JSPからのHTML出力を表示する前に、いくつかのビジネス処理を行います。

@WebServlet("/products")
public class ProductsServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Product> products = productService.list();
        request.setAttribute("products", products); // Will be available as ${products} in JSP
        request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
    }

}
<table>
    <c:forEach items="${products}" var="product">
        <tr>
            <td>${product.name}</td>
            <td><a href="product?id=${product.id}">detail</a></td>
        </tr>
    </c:forEach>
</table>

また、上記の最後の列に示されている詳細リンクの表示/編集は、通常べき等です。

@WebServlet("/product")
public class ProductServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Product product = productService.find(request.getParameter("id"));
        request.setAttribute("product", product); // Will be available as ${product} in JSP
        request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response);
    }

}
<dl>
    <dt>ID</dt>
    <dd>${product.id}</dd>
    <dt>Name</dt>
    <dd>${product.name}</dd>
    <dt>Description</dt>
    <dd>${product.description}</dd>
    <dt>Price</dt>
    <dd>${product.price}</dd>
    <dt>Image</dt>
    <dd><img src="productImage?id=${product.id}" /></dd>
</dl>

役職

HTTP POSTリクエストはべき等ではありません。エンドユーザーがリダイレクトを実行していないURLでPOSTフォームを事前に送信した場合、そのURLは必ずしもブックマーク可能ではありません。送信されたフォームデータはURLに反映されません。URLを新しいブラウザウィンドウ/タブにコピーして貼り付けても、フォームの送信後とまったく同じ結果になるとは限りません。このようなURLはブックマークできません。サーブレットが問題のURLをリッスンしている場合、それdoPost()が呼び出されます。通常はリクエストの後処理に使用されます。つまり、送信されたHTMLフォームからデータを収集し、それを使用していくつかのビジネス処理(変換、検証、DBへの保存など)を行います。最後に通常、結果は転送されたJSPページからのHTMLとして表示されます。

<form action="login" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="login">
    <span class="error">${error}</span>
</form>

...このサーブレットの一部と組み合わせて使用​​できます。

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @EJB
    private UserService userService;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);

        if (user != null) {
            request.getSession().setAttribute("user", user);
            response.sendRedirect("home");
        }
        else {
            request.setAttribute("error", "Unknown user, please try again");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }

}

UserDBで見つかった場合(つまり、ユーザー名とパスワードが有効である場合)は、Userセッションスコープ(つまり、「ログイン」)に配置され、サーブレットはメインページにリダイレクトされます(この例はに移動しますhttp://example.com/contextname/home)。エラーメッセージが設定され、リクエストが同じJSPページに転送されて、メッセージがによって表示され${error}ます。

また、必要に応じてを「非表示」にlogin.jsp/WEB-INF/login.jspて、ユーザーがサーブレットでのみアクセスできるようにすることもできます。これにより、URLがクリーンに保たれますhttp://example.com/contextname/login。次のdoGet()ように、サーブレットにを追加するだけです。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}

(それにdoPost()応じて同じ行を更新します)

それはそれだけで遊んでと暗闇の中で撮影していますが、投稿のコードは、このような使用として(良い見ていないされている場合、私はわからない、と述べたcompareTo()のではなく、equals()かつparameternamesに掘るだけではなく使用するgetParameter()idしてはpasswordいるようですサーブレットのインスタンス変数として宣言されていること(スレッドセーフではありません)。したがって、Oracleのチュートリアルを使用して基本的なJava SE API (「基本をカバーするトレイル」の章を確認してください)と、それらのチュートリアルを使用してJSP /サーブレットを正しく使用する方法について少し学ぶことを強くお勧めします

以下も参照してください。


更新:質問の更新に従って(これはかなりメジャーです。元の質問の一部を削除しないでください。これにより、回答が役に立たなくなります.. 新しいブロックに情報を追加してください)、フォームのエンコーディングタイプを不必要に設定しmultipart/form-dataます。これはapplication/x-www-form-urlencoded、リクエストパラメータをクエリ文字列として送信する(デフォルト)とは異なる構成でリクエストパラメータを送信します(例:)name1=value1&name2=value2&name3=value3。あなたmultipart/form-dataが持っているときにのみ必要です<input type="file">文字以外のデータ(バイナリデータ)である可能性のあるファイルをアップロードするためのフォームの要素。これはあなたのケースには当てはまらないので、それを削除するだけで期待どおりに動作します。ファイルをアップロードする必要がある場合は、エンコーディングタイプを設定し、リクエストボディを自分で解析する必要があります。通常はそこでApache Commons FileUploadを使用しますが、すでに新しいサーブレット3.0 APIを使用している場合は、で始まる組み込み機能を使用できますHttpServletRequest#getPart()。具体的な例については、この回答も参照してください:JSP /サーブレットを使用してサーバーにファイルをアップロードする方法?


2

ブラウザは、GETとPOSTの両方を使用して、サーバーから単一のリソースを要求します。各リソースには、個別のGETまたはPOST要求が必要です。

  1. GETメソッドは、サーバーから情報を取得するためにブラウザーが最も一般的に使用している(そしてデフォルトのメソッドです)。GETメソッドを使用する場合、リクエストボディであるリクエストパケットの3番目のセクションは空のままです。

GETメソッドは、次の2つの方法のいずれかで使用されます。メソッドが指定されていない場合、つまりユーザーまたはブラウザがHTMLページや画像などの単純なリソースを要求している場合。フォームが送信され、メソッドを選択した場合HTMLタグで= GET。GETメソッドがHTMLフォームで使用される場合、フォームを通じて収集されたデータは、「?」を追加することによってサーバーに送信されます。URLの最後に「&」で区切られたすべてのname = valueペア(htmlフォームフィールドの名前とそのフィールドに入力された値)を追加します。例:GET /sultans/shop//form1.jsp?name= Sam%20Sultan&iceCream = vanilla HTTP / 1.0オプションのヘッダーオプションのヘッダー<<空行>>>

name = value形式のデータは、QUERY_STRINGと呼ばれる環境変数に格納されます。この変数は、処理プログラム(JSP、Javaサーブレット、PHPなど)に送信されます。

  1. POSTメソッドは、HTMLフォームを作成し、タグの一部としてmethod = POSTを要求するときに使用されます。POSTメソッドを使用すると、クライアントはリクエストのリクエストボディセクションでサーバーにフォームデータを送信できます(前述のとおり)。データはエンコードされ、GETメソッドと同様にフォーマットされますが、データは標準入力を介してプログラムに送信されます。

例:POST /sultans/shop//form1.jsp HTTP / 1.0 optional headeroptional header << empty line >>> name = Sam%20Sultan&iceCream = vanilla

postメソッドを使用する場合、QUERY_STRING環境変数は空になります。GETとPOSTの長所/短所

GETメソッドの利点:フォームを介して、またはURLページをパラメーターでブックマークできるようになった後にパラメーターを追加することで、パラメーターが少し速くなります。

GETメソッドの欠点:4K相当のデータしか送信できません。(textareaフィールドを使用する場合は使用しないでください)パラメータはURLの最後に表示されます

POSTメソッドの利点:パラメータはURLの最後に表示されません。(機密データに使用)4Kを超えるデータをサーバーに送信できます

POSTメソッドの欠点:データでブックマークできない


0

サーブレットコンテナのHttpServlet.service()メソッドの実装は、必要に応じて自動的にdoGet()またはdoPost()に転送されるため、サービスメソッドをオーバーライドする必要はありません。


0

投稿ではなく、取得を通じてデータを渡している可能性がありますか?

<form method="get" ..>
..
</form>

0

<form action="identification" >HTMLフォームに対して行う場合、データはデフォルトで「Get」を使用して渡されるため、JavaサーブレットコードのdoGet関数を使用してこれをキャッチできます。この方法では、データはHTMLヘッダーの下で渡されるため、送信時にURLに表示されます。一方、HTML本文でデータを渡したい場合は、Post:<form action="identification" method="post">を使用し、このデータをdoPost関数でキャッチします。これは、データがhtmlヘッダーではなくhtml本文の下で渡されるため、フォームを送信した後、URLにデータが表示されないためです。

私のhtmlの例:

<body>  
<form action="StartProcessUrl" method="post">
.....
.....

私のJavaサーブレットコードの例:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter out = response.getWriter();
         String surname = request.getParameter("txtSurname");
         String firstname = request.getParameter("txtForename");
         String rqNo = request.getParameter("txtRQ6");
         String nhsNo = request.getParameter("txtNHSNo");

         String attachment1 = request.getParameter("base64textarea1");
         String attachment2 = request.getParameter("base64textarea2");

.........
.........
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.