前書き
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);
}
}
}
がUser
DBで見つかった場合(つまり、ユーザー名とパスワードが有効である場合)は、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 /サーブレットを使用してサーバーにファイルをアップロードする方法?