English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
まず、フローチャートを見てみましょう:
サーバーがリクエストを処理するプロセス:
(1)サーバーはリクエストを毎回受け取るとき、そのリクエストに新しいスレッドを開きます。
(2)サーバーはクライアントのリクエストデータをrequestオブジェクトにエンキャップし、requestはリクエストデータのキャリアです!
(3)サーバーはまた、レスポンスオブジェクトを作成し、このオブジェクトはクライアントと接続され、クライアントにレスポンスを送信するために使用されます。
フローチャートから分かるように、JavaWebのリクエストとレスポンスでは、最も重要な二つのパラメータはrequestおよびresponseであり、これらのパラメータはServletのservice()メソッドにあります。
1、responseの概念:
responseはServlet.serviceメソッドの引数であり、javax.servlet.http.HttpServletResponseのタイプです。クライアントがリクエストを送信するたびに、サーバーはresponseオブジェクトを作成し、Servlet.service()メソッドに渡します。responseオブジェクトはクライアントに対するレスポンスを行うために使用されます。これは、service()メソッドでresponseオブジェクトを使用することで、クライアントに対するレスポンスを行うことができることを意味します。
responseオブジェクトの機能は以下の4つに分類されます:
(1)レスポンスヘッダー情報を設定します。
(2)ステータスコードを送信します。
(3)レスポンス本文を設定します。
(4)リダイレクト
2、レスポンス本文
responseはレスポンスオブジェクトであり、クライアントにレスポンスの本文(ボディ)を出力するために使用されます。responseは、以下の4つの機能を提供しています:
(1)PrintWriter out = response.getWriter():文字列ストリームを取得します;
(2)ServletOutputStream out = response.getOutputStream():バイトストリームを取得します;
もちろん、レスポンスの本文が文字である場合にはresponse.getWriter()を使用し、レスポンスがバイトである場合(例えばダウンロード時)、response.getOutputStream()を使用することができます。
注意、あるリクエストでは、この2つのストリームを同時に使用することはできません!つまり、repsonse.getWriter()を使用するか、response.getOutputStream()を使用するかのどちらかを選択する必要があります。これらのストリームを同時に使用すると、illegalStateException例外が発生します。
3、レスポンスヘッダー情報を設定します。
responseオブジェクトのsetHeader()メソッドを使用してレスポンスヘッダーを設定できます!この方法で設定されたレスポンスヘッダーは最終的にクライアントのブラウザに送信されます。
(1)response.setHeader(“content-type", "text",/html;charset=utf-8”):contentを設定します。-typeレスポンスヘッダーが、ブラウザにレスポンスの内容がHTML形式でutfエンコーディングであることを伝えます。-8。同時にresponseの文字列ストリームのエンコーディングもutfに設定されます。-8、response.setCharaceterEncoding(“utf-8");
(2)response.setHeader("Refresh","5; URL=http://www.baidu.com):5秒後に自動的に百度のホームページにジャンプします。
4ステータスコードおよび他のメソッドを設定します。
(1)response.setContentType("text"}/html;charset=utf-8)response.setContentType("text"-type", "text",/html;charset=utf-8");
(2)response.setCharacterEncoding("utf-8)response.setCharacterEncoding("utf-8;
(3)response.setStatus(200):ステータスコードを設定します;
(4)response.sendError(404、「あなたが探しているリソースは存在しません」):エラーステータスコードを送信すると、Tomcatは固定のエラーページにジャンプしますが、エラーメッセージを表示できます。
5、重定向(*****重点*****)
5.1 重定向(二つのリクエスト)とは何ですか?
http:にアクセスすると、//www.sun.comにアクセスすると、ブラウザのアドレスバーのURLがhttp:に変わります。//www.oracle.com/us/sun/index.htm、これがリダイレクトです。リダイレクトは、サーバーがブラウザに別のアドレスにアクセスするように指示することです。ブラウザが再びリクエストを送信します。
5.2 リダイレクトをどうやって実行しますか?
答:リダイレクトの状態コードは302、まずresponseオブジェクトを使用してブラウザに送信します302の状態コードを受け取り、さらにLocationを設定して、利用可能なURLを提供し、ブラウザが新しいURLにアクセスし、リダイレクトを実現します。
例:
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302); response.setHeader("Location", "http://www.baidu.com"); } }
上記のコードの作用は、AServletにアクセスした場合、ブラウザに百度のホームページにリダイレクトするように通知することです。クライアントのブラウザが応答コード302その後、サーバーがリダイレクトを指示していることを知り、すぐにリクエストヘッダLocationを取得して、二つ目のリクエストを送信します。
また、迅速なリダイレクトメソッドがあります。response.sendRedirect()メソッドを使用します。例えば、上記の例では、二つの行が使用できます。//www.baidu.com")を使用して代替します。
クライアントのすべてのリクエストデータをエンキャップしたもの
1、requestの概要
requestはServlet.service()メソッドの引数であり、タイプはjavax.servlet.http.HttpServletRequestです。クライアントが各リクエストを送信するたびに、サーバーはrequestオブジェクトを作成し、リクエストデータをrequestにエンキャップし、Servlet.service()メソッドを呼び出す際にservice()メソッドに渡します。これは、service()メソッド内でrequestオブジェクトを通じてリクエストデータを取得できることを意味します。
図に示されています:
requestの機能は以下の通りに分類できます:
(1)リクエストのヘッダデータをエンキャップします;
(2)リクエストの正文データをエンキャップします。GETリクエストの場合、正文はありません;
(3)requestはドメインオブジェクトであり、Mapとしてデータを追加・取得することができます;
(4)requestはリクエスト転送とリクエスト含蓄機能を提供します。
2、requestドメインメソッド
requestはドメインオブジェクトです!JavaWebでは、ドメインオブジェクトは4つあります。そのうちServletContextはドメインオブジェクトで、アプリケーションの全体で1つのServletContextオブジェクトのみが作成されます。requestはその1つで、requestは一つのリクエストでデータを共有することができます。
一つのリクエストは一つのrequestオブジェクトを作成します。一つのリクエストで複数のServletが経過する場合、複数のServletはrequestを使用してデータを共有することができます。現在、一つのリクエストでどれだけのServletが経過するかはまだ分かりません。
以下はrequestのドメインメソッドです:
(1)void setAttribute(String name, Object value):オブジェクトを保存するために使用されます、またはドメイン属性として保存することもできます、例えば:servletContext.setAttribute(“xxx”, “XXX”)、requestにドメイン属性が保存されました、ドメイン属性の名前はxxx、ドメイン属性の値はXXXです。注意していただきたいのは、このメソッドを複数回呼び出し、同じnameを使用する場合、前回の値をオーバーライドするという特性があり、Mapと同じです;
(2)Object getAttribute(String name):requestのデータを取得するために使用されます。データを取得する前にまず保存する必要があります、例えば:String value = (String)request.getAttribute(“xxx”);、xxxという名前のドメイン属性を取得;
(3)void removeAttribute(String name):requestのドメイン属性を削除するために使用されます。nameパラメータで指定されたドメイン属性が存在しない場合、このメソッドは何もしない;
(4)Enumeration getAttributeNames():获取所有域属性的名称;
3、request传递参数
最为常见的客户端传递参数方式有两种:
(1)浏览器地址栏直接输入:一定是GET请求;
(2)超链接:一定是GET请求;
(3)表单:可以是GET,也可以是POST,这取决与