1つのWebアプリケーションプロジェクトを作成しました。サーブレットクラスとHTMLフォームが含まれています。 HTMLフォームからサーブレットクラスを呼び出すにはどうすればよいですか?
HttpServlet
を拡張するクラスを作成し、特定のURLパターンで @WebServlet
で注釈を付けるだけです。
@WebServlet("/login")
public class LoginServlet extends HttpServlet {}
または、まだサーブレット2.5以前の場合(アノテーションはサーブレット3.0以降で新しい)、サーブレットを<servlet>
にweb.xml
として登録し、<servlet-mapping>
を介して特定のURLパターンにマッピングします。
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.example.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
次に、HTMLリンクまたはフォームアクションがサーブレットのurl-pattern
に一致するURLを指すようにします。
<a href="${pageContext.request.contextPath}/login">Login</a>
<form action="${pageContext.request.contextPath}/login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
</form>
送信ボタンを使用するときは、type="submit"
ではなくtype="button"
を使用してください。 ${pageContext.request.contextPath}
部分の説明は、この関連する質問と回答にあります: HTTP 404エラーを発生させずにHTMLフォームアクションでサーブレットURLパターンを使用する方法 。
method="get"
を使用したリンクとフォームは、サーブレットのdoGet()
メソッドを呼び出します。通常、このメソッドを使用して、「ページの読み込み時に」リクエストを前処理します。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
}
method="post"
を含むフォームは、サーブレットのdoPost()
メソッドを呼び出します。通常、このメソッドを使用して、ユーザーが送信したフォームデータで要求を後処理します(要求パラメーターを収集し、それらを変換して検証し、モデルを更新し、ビジネスアクションを呼び出し、最後に応答をレンダリングします)。
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
}
サーブレットの詳細と具体的な例を見つけるには、 サーブレットのwikiページ にアクセスしてください。プレーンHTMLファイルの代わりにJSPファイルを使用することもできます。 JSPを使用すると、HTML出力を生成しながらEL式を介してバックエンドとやり取りしたり、JSTLのようなtaglibsを使用してフローを制御したりできます。 JSP wikiページ も参照してください。
たとえば、私はそのようなlogin.htmlを作成します
<div class="container">
<form method = "post" class="form-signin" role="form" action="LoginServlet">
<h2 class="form-signin-heading">Please sign in</h2>
<input type="text" class="form-control" name = "username" placeholder="User Name" required autofocus>
<input type="password" class="form-control" name = "password" placeholder="Password" required>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<input type="submit" class="btn btn-lg btn-primary btn-block" value="Sign in">
</form>
</div>
タグの間で、メソッドを「post」として定義することによってLoginServletを呼び出します。