English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

javawebでリクエストとレスポンスを実現する方法

 まず、フローチャートを見てみましょう:

 サーバーがリクエストを処理するプロセス:

  (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,这取决与

的method属性值;

GET请求和POST请求的区别:

(1)GET请求:

请求参数会在浏览器的地址栏中显示,所以不安全;

请求参数长度限制长度在1K之内;

GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

(2)POST请求:

请求参数不会显示浏览器的地址栏,相对安全;

请求参数长度没有限制;

4、请求转发和请求包含(*****重点*****)

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

请求转发和请求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");  使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径

请求转发:rd.forward(request,response);
请求包含:rd.include(request,response);

有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
    > 一个请求跨多个Servlet,需要使用转发和包含。
 > 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)            即当前Servlet设置的相应头有效,相应体无效。
    > 请求包含:由两个Servlet共同未完成响应体!(都留)                                                                     都有效。     
    > 无论是リクエスト転送もしくはリクエスト含み、同じリクエスト範囲内です!同じrequestとresponseを使用!  

リクエスト転送とリクエスト包含の比較:

(1)AServletからBServletにリクエスト転送を行った場合、AServletでは応答ボディを出力することはできません。つまり、response.getWriter()やresponse.getOutputStream()を使用してクライアントに応答を送信することはできません。この作業はBServletが行うべきです。リクエスト包含を使用する場合は、この制限はありません;

(2)リクエスト転送は応答ボディを出力することができませんが、応答ヘッダを設定することができます。例えば:response.setContentType(”text/html;charset=utf-8”);

(3)リクエストは主にJSPページに適用され、複数のページを統合するために使用されます;

(4)リクエスト転送は主にServletに適用され、転送ターゲットは主にJSPページです;

図に示されています:


リクエスト転送とリダイレクトの比較

(1)リクエスト転送は一つのリクエストであり、リダイレクトは二つのリクエストです;

(2)リクエスト転送の後、ブラウザのアドレスバーには変更はありませんが、リダイレクトは変更があります。なぜならリダイレクトは二つのリクエストであるからです;

(3)リクエスト転送のターゲットはこのアプリケーション内のリソースのみであり、リダイレクトのターゲットは他のアプリケーションであることができます;

(4)リクエスト転送はAServletとBServletのリクエストメソッドが同じである必要があります。つまり、どちらもGETまたはPOSTである必要があります。なぜならリクエスト転送は一つのリクエストであるからです;

(5)リダイレクトの二番目のリクエストは常にGETです;

 これでこの記事のすべての内容が終わりました。皆様の学習に役立つことを願っています。また、呐喊教程を多くのサポートをお願いします。

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、このサイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害が疑われる内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。告発を行い、関連する証拠を提供してください。一旦確認がとりあえず、このサイトは即座に侵害される内容を削除します。)

おすすめ