記事ディレクトリ
詳細なサーブレットAPI
サーブレットには多くのAPIがあります。ここでは、HttpServletのコンテンツ、特に3つのコアクラスとそのメソッド、つまり、、の使用についてのみ紹介します。HttpServlet
これらHttpServletRequest
3つのクラスの継承関係は次のとおりですHttpServletResponse
。
HttpServletクラス
上の図からわかるように、HttpServletクラスはGenericServlet抽象クラスから継承されています。
HttpServletクラスを使用する場合、通常はとの2つのオブジェクトを使用する必要がHttpServletRequest
ありHttpServletResponse
ます。
これらの2つのオブジェクトは、1つは要求を表し、もう1つは応答を表します。
HttpServletに上記の2つのオブジェクトがある場合、サービスメソッドを呼び出します。サービスメソッドのロジックは次のとおりです。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{
method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
serviceメソッドは、最初に2つのオブジェクトのパラメーターを解析し、次にdoGet、doPost、doHead、doPut、doTrace、doOptons、およびdoDeleteの7つのメソッドの1つを呼び出して、要求を具体的に処理します。
ここでのdoXXXメソッドは、通常、開発者によってロジックが再実装されます。
したがって、リクエストを処理するクラスを作成するときは、すべてHttpServletクラスを継承する必要があります。継承の目的は、このクラスの一部のメソッドをオーバーライドし、コードをTomcatの「フレームワーク」に「挿入」してからTomcatに「挿入」できるようにすることです。呼び出しに便利に実行されます。
同様の操作は、インターフェイスの継承など、以前にも学習し
Comparable
ました。目的は、メソッドをオーバーライドComparator
し、独自のロジックに従って比較することです。
また、マルチスレッドでは、Thread
クラスを継承する目的は、run
メソッドを書き換えてから他のスレッドで呼び出すことです。start
スレッドが作成されると、書き換えられたrunメソッドが呼び出され、独自のロジックの一部が実行されます。
この種の継承と書き換えのように、特定のフレームワークシステムにコードを挿入していくつかのことを処理することは、比較的古典的なアプローチであり、他にも多くのアプローチがあります。Jsの場合と同様に、イベントを処理するには、関数を割り当てるだけで済みます。
コアメソッド:
メソッド名 | 移行 |
---|---|
初期化 | HttpServletのインスタンス化後に1回呼び出されます |
破壊 | HttpServletインスタンスが使用されなくなったときに一度呼び出されます |
サービス | HTTPリクエストを受信したときに呼び出されます |
doGet | GETリクエストを受信したときに呼び出されます(サービスメソッド内) |
doPost | Postリクエストを受信したときに呼び出されます(サービス方式で) |
doPut | Putリクエストを受信したときに呼び出されます(サービスメソッド内) |
doDelete | (サービスメソッドで)削除要求を受信したときに呼び出されます |
doOptions | オプションリクエストを受信したときに呼び出されます(サービスメソッド内) |
HttpServletRequestクラス
コアメソッド
方法 | 説明 |
---|---|
文字列getProtocol() | 要求されたプロトコルの名前とバージョンを返します |
文字列getMethod() | 要求されたHTTPメソッドの名前(GET、POST、PUTなど)を返します |
文字列getRequestURL() | プロトコル名からHTTPリクエストのクエリ文字列の最初の行までのリクエストのURLの部分を返します |
文字列getContextPath() | リクエストコンテキストパスの表示を返します。 |
文字列getQueryString() | リクエスト内のクエリ文字列を返します。 |
列挙getParameterNames() | 列挙型は、リクエスト本文のすべての「キー」の名前であるStringオブジェクトを返します。 |
文字列getParameter(文字列名) | リクエストパラメータの「値」を文字列として返します。値が存在しない場合はnullを返します。 |
String [] getParameterValues(Stringname) | リクエスト本文のすべての値を含む文字列オブジェクトの配列を返します。値が存在しない場合はnullを返します。 |
列挙getHeaderNames() | このリクエストに含まれるすべてのヘッダーを含む列挙型を返します。 |
文字列getHeader(文字列名) | 指定されたリクエストヘッダーの値を文字列として返します。 |
文字列getCharacterEncoding() | リクエスト本文で使用されている文字エンコードの名前を返します。 |
文字列getContentType() | リクエスト本文のMIMEタイプを返します。タイプが不明な場合は、nullを返します。 |
int getContentLength() | 要求本文の長さを、提供された入力ストリームを含むバイト単位で返します。長さが不明な場合は-1を返します。 |
InputStream getInputStream() | リクエストの本文の内容を読み取るために使用されます。InputStreamオブジェクトを返します。 |
コード例:GETリクエスト情報を出力する
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/showRequest")
public class ShowRequestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//把生成的body给放到respBody中
StringBuilder respBody=new StringBuilder();
//设置body数据类型
resp.setContentType("text/html;charset=UTF-8");
//获取当前对象的版本号
respBody.append(req.getProtocol());
respBody.append("<br>");
//获取请求方法
respBody.append(req.getMethod());
respBody.append("<br>");
//获取请求路径
respBody.append(req.getRequestURI());
respBody.append("<br>");
//获取指定的路径
respBody.append(req.getContextPath());
respBody.append("<br>");
//获取查询字符串
respBody.append(req.getQueryString());
respBody.append("<br>");
//获取header
respBody.append("<h3>headers:</h3>");
//枚举类型获得
Enumeration<String> headerNames=req.getHeaderNames();
//遍历枚举
while(headerNames.hasMoreElements()){
String headerName=headerNames.nextElement();
respBody.append(headerName+": ");
respBody.append(req.getHeader(headerName));
respBody.append("<br>");
}
resp.getWriter().write(respBody.toString());
}
}
ブラウザに特定のURLを入力して、直接アクセスします。
要約:
上記のケースを通じて、主にHttpServletRequestクラスの基本的な使用法を示します〜HTTP
プロトコルの形式と組み合わせて、HttpServletRequestクラスで提供されるメソッドを理解します。
このHttpServletRequestクラスの通常の使用では、最も一般的に使用されるのは、要求内の特定のパラメーターを取得することです。
1.クエリ文字列.getParameterメソッドを使用します。2 。本体
のデータ形式application/x-www-form-urlencodedのgetParameterメソッドを使用します。3。
本体のデータ形式application/jsonを使用して本体全体を取り出します。 、次にjsonライブラリを使用して解析します。
HttpServletResponseクラス
コード例:ステータスコードを設定
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/status")
public class StatusServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让用户传入一个请求
//请求在query string 中带一个参数,就表示状态码
//根据用户的输入,返回不同的状态码响应
String statusString=req.getParameter("status");
if(statusString==null || statusString.equals("")){
resp.getWriter().write("当前的请求参数 status 缺失");
}
resp.setStatus(Integer.parseInt(statusString));
resp.getWriter().write("status :"+statusString);
}
}
コード例:自動更新
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/autoRefresh")
public class AutoRefreshServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf8");
resp.setHeader("Refresh","1");
//获取到毫秒级时间戳并返回
long timestamp=System.currentTimeMillis();
resp.getWriter().write("timestamp: "+timestamp);
}
}
コード例:リダイレクト
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//用户访问这个路径的时候,直接重定向到搜狗主页
resp.setStatus(302);
resp.setHeader("Location","https://www.sogou.com");
}
}
直接リダイレクトも可能です。
resp.sendRedirect("https://www.sogou.com");
PostmanTools
上記の場合、HTTPリクエストの作成は、自分でページを作成し、formまたはajaxを使用してリクエストを作成することです。この方法でリクエストを作成するのは面倒であり、特別なサードパーティツールを使用して作成できます。リクエスト。
リクエストには、リクエストを作成するためHTTP
のツールがたくさんあります。
これがサードパーティのツールPostman
です。postmanを検索し、クリックしてダウンロードします。
ログイン後、対応するURLを入力し、リクエストメソッドを選択し、クエリ文字列を選択してリクエストを作成できます。
サーブレットのライフサイクル
HttpServletinit
クラスには、、、、の3つservice
のメソッドがありますdestory
。これらの3つのメソッドは、サーブレットのライフサイクルメソッドでもあり、サーブレットの「誕生」から「作業」、「死」までのプロセスを表しています。
サーブレットコンテナは、次のルールに従ってこれら3つのメソッドを呼び出します。
- init()メソッドは、サーブレットが初めて要求されたときに、サーブレットコンテナがこのメソッドの呼び出しを開始して、サーブレットオブジェクトを初期化および生成しますが、このメソッドは、人々が「生まれた」同時に。
init()
メソッドを使用して、初期化作業を実行できます。このメソッドを呼び出すと、サーブレットコンテナはServletConfig
、サーブレットオブジェクトの初期化に役立つオブジェクトを渡します。 - service()メソッドは、文字通り「service / work」メソッドです。Serletが初めて要求されると、initメソッドを呼び出してサーブレットオブジェクトを初期化および生成し、そのサービスメソッドを呼び出して機能します。そのため、サービスメソッドはリクエストを処理し、後続のリクエストでは、サーブレットコンテナはサービスメソッドのみを呼び出します。サービスメソッドでは、リクエストメソッドによっては、開発者が書き直したメソッド(など)
doGet
をdoPost
呼び出してコア処理ロジックを実行します。 - destroy()メソッドは、サーブレットを破棄する必要がある場合、サーブレットコンテナはこのメソッドを呼び出します。これは、人と同じように、期限切れになると終了する必要があります。この方法では、通常、クリーンアップコードを記述します。これは通常、アプリケーションをアンインストールするとき、またはサーブレットコンテナをシャットダウンするときに使用されます。
単純な検証ライフサイクル
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
public class TestServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet此时正在初始化..");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//在这个方法中,是处理请求的核心逻辑
System.out.println("Servlet正在处理请求...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("Servlet正在销毁中..");
}
}