フローチャートを見てみましょう。
サーバー処理リクエストのプロセス:
(1)サーバーがリクエストを受信するたびに、リクエスト用の新しいスレッドが開きます。
(2)サーバーは、クライアントのリクエストデータをリクエストオブジェクトにカプセル化し、リクエストはリクエストデータのキャリアです!
(3)サーバーは、クライアントに接続され、クライアントに応答を送信するために使用できる応答オブジェクトも作成します。
フローチャートからわかるように、Javawebの要求と応答では、2つの最も重要なパラメーターは、サーブレットのサービス()メソッドにある要求と応答です。
1。応答の概念:
応答はServlet.Serviceメソッドのパラメーターであり、javax.servlet.http.httpservletResponseのタイプです。クライアントが各リクエストを行うと、サーバーは応答オブジェクトを作成し、servlet.service()メソッドに渡します。応答オブジェクトは、クライアントに応答するために使用されます。つまり、service()メソッドで応答オブジェクトを使用すると、クライアントに応答作業を完了できます。
応答オブジェクトの関数は、次の4つのタイプに分割されます。
(1)応答ヘッダー情報を設定します
(2)ステータスコードを送信します
(3)応答テキストを設定します
(4)リダイレクト
2。応答応答テキスト
応答は応答オブジェクトです。応答本体(応答本体)の応答フローを使用して、応答本体をクライアントに出力できます。 Repsonseは、合計2つの応答フローオブジェクトを提供します。
(1)printwriter out = response.getWriter():文字ストリームを取得します。
(2)ServleTOUTPUTSTREAM OUT = Response.GetOutPutStream():バイトストリームを取得します。
もちろん、応答ボディのコンテンツが文字である場合は、response.getWriter()を使用し、たとえばダウンロード時に応答コンテンツがバイトの場合は、response.getOutputStream()を使用できます。
1つのリクエストでは、両方のストリームを同時に使用できないことに注意してください!つまり、Reply.getWriter()またはrespons.getOutputStream()を使用しますが、両方のストリームを同時に使用することはできません。それ以外の場合、IllegalStateExceptionがスローされます。
3.応答ヘッダー情報を設定します
応答オブジェクトのsetheader()メソッドを使用して、応答ヘッダーを設定できます!このメソッドを使用した応答ヘッダーセットは、最終的にクライアントブラウザに送信されます!
(1)response.setheader( "content-type"、 "text/html; charset = utf-8"):コンテンツタイプの応答ヘッダーを設定します。このヘッダーの機能は、応答コンテンツがHTMLタイプであり、UTF-8としてエンコードされていることをブラウザに伝えることです。同時に、応答の文字ストリームエンコードは、UTF-8、つまりResponse.setcharaceterEncoding( "utf-8")に設定されます。
(2)response.setheader( "refresh"、 "5; url = http://www.baidu.com"):5秒後に自動的にBaiduホームページにジャンプします。
4.ステータスコードとその他のメソッドを設定します
(1)Response.SetContentType( "Text/HTML; charset = utf-8"):response.setheader( "content-type"、 "text/html; charset = utf-8")に相当します。
(2)Response.setcharacterencoding( "utf-8"):UTF-8への文字応答ストリームの文字エンコードを設定します。
(3)Response.SetStatus(200):ステータスコードを設定します。
(4)Response.senderror(404、「探しているリソースは存在しません」):エラーステータスコードを送信すると、Tomcatは固定エラーページにジャンプしますが、エラーメッセージを表示できます。
5。リダイレクト(****** key *******)
5.1リダイレクトとは(2つのリクエスト)
http://www.sun.comにアクセスすると、ブラウザーアドレスバーのURLがhttp://www.oracle.com/us/sun/index.htmになることがわかります。リダイレクトとは、サーバーがブラウザに別のアドレスにアクセスするように通知する場合、つまり別のリクエストを発行する場合です。
5.2リダイレクトを完了する方法は?
回答:リダイレクトのステータスコードは302です。最初に応答オブジェクトを使用して302のステータスコードをブラウザに送信し、次に場所を設定します。つまり、利用可能なURLを提供し、ブラウザは新しいURLにアクセスしてリダイレクトを実現します。
例えば:
パブリッククラスAservletは、httpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {respons.setstatus(302); Response.setheader( "location"、 "http://www.baidu.com"); }}上記のコードの目的は次のとおりです。Aservletにアクセスした後、ブラウザにBaiduのホームページにリダイレクトするように通知されます。クライアントブラウザが302の応答コードを解析した後、サーバーがリダイレクトを行うことがわかっているため、すぐに応答ヘッダーの位置を取得し、2番目の要求を発行します。
クイックリダイレクトメソッドもあります。つまり、respons.sendredirect()メソッドを使用します。たとえば、上記の例の2つの文は、respons.sendredirect( "http://www.baidu.com")に置き換えることができます。
リクエスト - クライアントからのすべての要求データをカプセル化します
1。概要をリクエストします
リクエストは、servlet.service()メソッドのパラメーターであり、タイプjavax.servlet.http.httpservletrequestです。クライアントが各リクエストを行うと、サーバーはリクエストオブジェクトを作成し、リクエストデータをリクエストにカプセル化し、servet.service()メソッドが呼び出されたときにservice()メソッドに渡します。
図に示されているように:
リクエストの関数は、次のタイプに分けることができます。
(1)リクエストヘッダーデータをカプセル化します。
(2)リクエストテキストデータをカプセル化します。 Get Requestの場合、テキストはありません。
(3)リクエストはドメインオブジェクトであり、マップとして追加および取得できます。
(4)リクエストは、リクエストの転送と要求の包含関数を提供します。
2。ドメインメソッドを要求します
リクエストはドメインオブジェクトです! Javawebには4つのドメインオブジェクトがあり、その中にServletContextはドメインオブジェクトであり、アプリケーション全体にServletContextオブジェクトが1つだけ作成されます。リクエストのいずれかをリクエストします。リクエストは、リクエストでデータを共有できます。
リクエストはリクエストオブジェクトを作成します。リクエストで複数のサーブレットが経験されている場合、複数のサーブレットがリクエストを使用してデータを共有できます。今、私たちはリクエストでいくつかのサーブレットを通過する方法を知りません。
これが要求のドメイン方法です。
(1) void setAttribute(String名、オブジェクト値):オブジェクトの保存に使用すると、ドメイン属性を保存することもできます。たとえば、servletcontext.setattribute( "xxx"、 "xxx")、ドメイン属性はリクエストに保存されます。ドメイン属性名はxxxであり、ドメイン属性の値はxxxです。メソッドが複数回呼び出され、同じ名前が使用される場合、最後の値が上書きされ、これはマップと同じであることに注意してください。
(2) Object getAttribute(String name):リクエスト内のデータを取得するために使用されます。取得する前に保管する必要があります。例:string value =(string)request.getAttribute( "xxx"); xxxという名前のドメイン属性を取得するには。
(3) void removeattribute(string name):リクエスト内のドメイン属性を削除するために使用されます。パラメーター名で指定されたドメイン属性が存在しない場合、この方法は何もしません。
(4) Enumeration getattributenames():すべてのドメイン属性の名前を取得します。
3。要求に応じてパラメーターを渡します
クライアントにパラメーターを渡す最も一般的な2つの方法があります。
(1)ブラウザアドレスバーからの直接入力:それはGETリクエストである必要があります。
(2)HyperLink:Get Requestでなければなりません。
(3)フォーム:<form>のメソッド属性値に依存することを取得または投稿できます。
GETリクエストとPOSTリクエストの違い:
(1)リクエストを取得:
要求パラメーターはブラウザのアドレスバーに表示されるため、安全ではありません。
要求パラメーターの長さ制限は1k以内です。
Get Requestにはリクエスト本文がないため、パラメーターのエンコードをrequest.setcharacterencoding()を介して設定することはできません。
(2)リクエストの投稿:
リクエストパラメーターは、比較的安全なブラウザのアドレスバーを表示しません。
要求されたパラメーターの長さに制限はありません。
4。転送とリクエストの包含(****** key *******)をリクエストする
リクエスト転送であろうとリクエストの包含であろうと、複数のサーブレットが共同でリクエストを処理することを意味します。たとえば、servlet1はリクエストを処理し、servlet1をservlet2に転送してリクエストの処理を継続します。
転送とリクエストを含むリクエスト
RequestDispatcher rd = request.getRequestDispatcher( "/myServlet");リクエストを使用して、requestdispatcherオブジェクトを取得します。メソッドのパラメーターは、転送または含まれているサーブレットのサーブレットパスです。
リクエスト転送:Rd.Forward(リクエスト、応答);
リクエストには以下が含まれます。Rd.Include(リクエスト、応答);
リクエストには複数のサーブレットがコラボレーションする必要がある場合があるため、あるサーブレットにジャンプして別のサーブレットにジャンプする必要があります。
>リクエストは複数のサーブレットに及び、転送と包含が必要です。
>リクエスト転送:応答本体は次のサーブレットによって完了します!現在のサーブレットは応答ヘッダーを設定できます! (体ではなく頭を離れますが)、つまり、現在のサーブレットによって設定された対応するヘッドが有効であり、対応するボディは無効です。
>リクエストには:応答本体は2つのサーブレットによって完了しません! (すべてを維持)すべて有効です。
>それがリクエストの転送であろうと、要求を含むリクエストであろうと、それはリクエストの範囲内です!同じリクエストと応答を使用してください!
転送とリクエストのリクエストには比較が含まれます。
(1)リクエストがAservletのbservletに転送された場合、応答本体はAservletで出力することを許可されていません。つまり、Response.getWriter()およびResponse.GetOutputStream()はクライアントに出力できなくなります。この作業は、bservletが行う必要があります。リクエストを含めるために使用される場合、そのような制限はありません。
(2)リクエスト転送は応答本体を出力できませんが、応答ヘッダーを設定できます。
(3)ほとんどのリクエストはJSPページに適用され、複数のページのマージを完了します。
(4)リクエスト転送は主にサーブレットに適用され、転送ターゲットはほとんどJSPページです。
図に示されているように:
リクエストの転送とリダイレクトの比較
(1)リクエストの転送は1つの要求であり、リダイレクトは2つのリクエストです。
(2)リクエストの転送後、ブラウザアドレスバーは変更されませんが、リダイレクトが2つのリクエストであるため、リダイレクトは変更されます。
(3)転送を要求する目標は、このアプリケーションのリソースのみであり、リダイレクトのターゲットは他のアプリケーションになります。
(4)AservletとBServletの要求転送方法は同じです。つまり、リクエストの転送がリクエストであるため、両方とも取得または両方が投稿されます。
(5)リダイレクトの2番目の要求を取得する必要があります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。