サーブレット(3)

一般サーブレット1サーブレットのインターフェイス、クラスおよびメソッドを使用する
インタフェース
2のServletConfigインターフェイス
3のServletContextインターフェイス
4
のHttpServletRequestインタフェース
のServletRequestとのHttpServletRequest関係
ServletRequestインタフェースからのHttpServletRequestインタフェースを継承。
主な機能はHTTPリクエストメッセージをカプセル化することなので、リクエストオブジェクトのHttpServletRequestも呼び出します。
HTTP要求メッセージは、要求行、要求メッセージヘッダー、および要求メッセージ本文の3つの部分に分割されているためです。
したがって、要求行、要求ヘッダー、および要求メッセージ本文を取得するためのメソッドは、HttpServletRequestインターフェースで定義されます。
1.リクエストライン情報を取得するための関連メソッド。
サーブレットにアクセスすると、すべてのリクエストメッセージがHttpServletRequestオブジェクトにカプセル化されます。リクエストメッセージのリクエストラインには、リクエストメソッド、リクエストリソース名、リクエストパスなどの情報が含まれます。この情報を取得するために、HttpServletRequestインターフェイスは一連のメソッドを定義します。
ここに画像の説明を挿入

例えば:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
	//通过HttpServletRequest对象得到请求行信息
	System.out.println("getMethod : " + request.getMethod());
	System.out.println("getRequestURI:" + request.getRequestURL());
	System.out.println("getQueryString:" + request.getQueryString());
	System.out.println("getContextPath:" + request.getContextPath());
	System.out.println("getServletPath:" + request.getServletPath());
	System.out.println("getRemoteAddr : " + request.getRemoteAddr());
	System.out.println("getRemoteHost : " + request.getRemoteHost());
	System.out.println("getRemotePort : " + request.getRemotePort());
	System.out.println("getLocalAddr : " + request.getLocalAddr());
	System.out.println("getLocalName : " + request.getLocalName());
	System.out.println("getLocalPort : " + request.getLocalPort());
	System.out.println("getServerName : " + request.getServerName());
	System.out.println("getServerPort : " + request.getServerPort());
	System.out.println("getRequestURL : " + request.getRequestURL());
}

http:// localhost:8080 / TestServlet7 / test7?myname = zhangsan
ここに画像の説明を挿入

2.リクエストメッセージヘッダーを取得するための関連メソッド
ここに画像の説明を挿入

ブラウザがサーブレットリクエストを送信するとき、リクエストメッセージヘッダーを介してサーバーに追加情報を渡す必要があります。たとえば、クライアントが受信できるデータのタイプ、圧縮方法、言語などです。この目的のために、HTTP要求ヘッダーフィールドを取得するための一連のメソッドがHttpServletRequestインターフェースで定義されています。
ここに画像の説明を挿入

@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//获取请求消息中的所有头字段
		Enumeration headerNames = request.getHeaderNames();
	    //用循环遍历所有请求头,并通过 getHeader() 方法获取一个指定名称的头字段
	    while (headerNames.hasMoreElements()) {
	    	    //得到请求头的名称
	            String headerName = (String) headerNames.nextElement();
	            System.out.println(headerName + ":" + request.getHeader(headerName));
	        }
	    
	}
}

ここに画像の説明を挿入

3.リクエストパラメータの取得
実際の開発では、ユーザー名やパスワードなど、ユーザーから送信されたフォームデータを取得する必要があります。フォームでのリクエストパラメータの取得を容易にするために、一連のリクエストパラメータの取得が定義されています。 HttpServletRequestインターフェースメソッドの親クラスServletRequest内
ここに画像の説明を挿入

例えば:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
  <form action="/TestServlet7/test7" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <br/>
        爱好:
        <input type="checkbox" name="hobby" value="sing"/>唱歌
        <input type="checkbox" name="hobby" value="dance"/>跳舞
        <input type="checkbox" name="hobby" value="game"/>玩游戏
        <br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		//得到请求参数
		String name=request.getParameter("username");
		System.out.println("用户名:"+name);
		String password=request.getParameter("password");
		System.out.println("密码:"+password);
		String hobby[]=request.getParameterValues("hobby");
		System.out.print("爱好:");
		for(String value:hobby){
			System.out.print(value+",");
		}
	}

ここに画像の説明を挿入

4.Requestオブジェクトを介してデータを渡します
ここに画像の説明を挿入

サーブレットジャンプを完了したら、上記のメソッドをテストする必要があります。
5.
HttpServletResponse HttpServletResponseインターフェースは、ServletResponseインターフェースから継承します。
主にHTTP応答メッセージをカプセル化するために使用されます。
HTTP応答メッセージは、ステータス行、応答メッセージヘッダー、メッセージ本文の3つの部分に分かれているためです。したがって、応答ステータスコード、応答メッセージヘッダー、および応答メッセージ本文をクライアントに送信するためのメソッドは、HttpServletResponseインターフェイスで定義されます。
1.ステータスコードの送信に関連するメソッド
サーブレットが応答メッセージをクライアントに送り返す場合、ステータスコードを応答メッセージに設定する必要があります。
1)setStatus(int status)メソッド
このメソッドは、HTTP応答メッセージのステータスコードを設定し、応答ステータス行を生成するために使用されます。応答ステータス行のステータス説明情報はステータスコードに直接関連しており、HTTPバージョンはサーバーによって決定されるため、ステータスコードがsetStatus(int status)メソッドで設定されている限り、ステータス行は次のようになります。送信されました。通常の状況では、Webサーバーはデフォルトでステータスコード200のステータス行を生成することに注意してください。
2)sendError(int sc)メソッド
このメソッドは、エラー情報を示すステータスコードを送信するために使用されます。たとえば、404ステータスコードは、クライアントによって要求されたリソースが見つからないことを示します。応答オブジェクトは、次のように2つのオーバーロードされたsendError(int sc)メソッドを提供し
ます。publicvoidsendError(int code)throws java.io.IOException
public void sendError(int code、String message)throws java.io.IOException
上記の2つのオーバーロードされた方法では、最初の方法はエラーメッセージのステータスコードのみを送信し、2番目の方法はステータスコードの送信に加えて、迅速な説明のためにテキストメッセージを追加することもできます。テキストメッセージはに表示されます。クライアントに送信される本文コンテンツ。
2.応答メッセージヘッダーの送信に関連するメソッド
ここに画像の説明を挿入

ここに画像の説明を挿入

上記の表にリストされている一連のメソッドでは、addHeader()、setHeader()、addIntHeader()、setIntHeader()メソッドを使用してさまざまなヘッダーフィールドを設定し、setContetType()、setLoacale()、およびsetCharacterEncodingを使用することに注意してください。 ()メソッドは文字エンコードを設定するために使用されます。文字エンコードを設定するこれらのメソッドは、文字化けの問題を効果的に解決できます。
3.応答メッセージ本文の送信に関する方法
HTTP応答メッセージと同様に、応答メッセージ本文を介して大量のデータが送信されるため、ServletResponseはI / Oフローを介して大量のデータを送信するという設計コンセプトに従います。応答メッセージ本文を送信するとき、出力ストリームに関連する2つのメソッドが定義されます。
1)getOutputStream()メソッド
このメソッドによって取得されるバイト出力ストリームオブジェクトは、タイプServletOutputStreamです。ServletOutputStreamはOutputStreamのサブクラスであるため、バイト配列のバイナリデータを直接出力できます。したがって、応答本文をバイナリ形式で出力する場合は、getOutputStream()メソッドを使用する必要があります。
2)getWriter()メソッド
このメソッドによって取得される文字出力ストリームオブジェクトは、PrintWriter型です。PrintWriterタイプのオブジェクトは文字テキストのコンテンツを直接出力できるため、コンテンツがすべて文字テキストであるWebページドキュメントを出力する場合は、getWriter()メソッドを使用する必要があります。

例:HttpServletResponseインターフェースを介してhtmlファイルを出力します

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
  <form action="/TestServlet7/test7" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <br/>
        爱好:
        <input type="checkbox" name="hobby" value="sing"/>唱歌
        <input type="checkbox" name="hobby" value="dance"/>跳舞
        <input type="checkbox" name="hobby" value="game"/>玩游戏
        <br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");

		//得到请求参数
		String name=request.getParameter("username");
		
		//通过HttpServletResponse 接口输出一个html文件
		PrintWriter out=resp.getWriter();
		out.write("<html>");
		out.write("<head><meta charset=\"utf-8\"><title>Servlet</title></head>");
		out.write("<body><center><center><h1>恭喜"+name+",登陆成功</h1></center></body>");
		out.write("</html>");
		out.close(); 
	}

ここに画像の説明を挿入

転送とリダイレクトの違いは?
1.forward
RequestDispatcherインターフェイスの転送(ServletRequest要求、ServletResponse応答)—このメソッドは、あるサーブレットから別のWebリソースに要求を転送するために使用されます。[リクエスト転送]
HttpServletRequestインターフェースはrequestDispatcherメソッドを継承してServletRequestインターフェースからRequestDispatcherオブジェクトを取得します。RequestDispatchergetRequestDispatcher
(文字列パス)-特定のパスで指定されたリソースカプセル化するRequestDispatcherオブジェクトを返します。
パラメータ文字列パス-ターゲットパス[現在のWebアプリケーションのルートディレクトリを示すには、「/」で始まる必要があります]
WEB-INFディレクトリのコンテンツはRequestDispatcherオブジェクトにも表示されることに注意しください。したがって、getRequestDispatcher(String path)メソッドに渡されるリソースは、WEB-INFディレクトリー内のファイルである可能性があります。
次に例を示します。

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //通过HttpServletRequest对象得到RequestDispatcher对象
		   RequestDispatcher reDispatcher=req.getRequestDispatcher("/other");
		   //通过RequestDispatcher对象的forward(ServletRequest request,ServletResponse response)
		   //方法将请求转发到目录路径
		   reDispatcher.forward(req, resp);
	}
}
package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OtherServlet--------");
	}
}

http:// localhost:8080 / TestServlet8 / test8
ここに画像の説明を挿入

Requestオブジェクトを介してデータを渡します
ここに画像の説明を挿入

例えば:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
	<form action="test8" method="post">
		用户名:<input type="text" name="username"><br/>
      	密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //得到请求提交的用户名
		   String name=req.getParameter("username");
		   //将得到的用户名保存到HttpServletRequest对象中
		   req.setAttribute("myname", name);
		   //从 HttpServletRequest对象中删除指定名称的属性
		   //req.removeAttribute("myname");
		   //通过HttpServletRequest对象得到RequestDispatcher对象
		   RequestDispatcher reDispatcher=req.getRequestDispatcher("/other");
		   //通过RequestDispatcher对象的forward(ServletRequest request,ServletResponse response)
		   //方法将请求转发到目录路径
		   reDispatcher.forward(req, resp);
	}
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到来自TestServlet8中保存在HttpServletRequest中的myname数值
		String  myname=(String)req.getAttribute("myname");
		System.out.println("OtherServlet--------myname==="+myname);
	}
}

ここに画像の説明を挿入

RequestDispatcherのforward(req、resp)-リクエスト転送の動作原理図
ここに画像の説明を挿入

2.Redirect ---- HttpServletRespone.sendRedirect()[Redirect]
リクエストのリダイレクトを実現するために、HttpServletResponseインターフェースはsendRedirect()メソッドを定義します。sendRedirect()メソッド
の完全な構文は次のとおりです
。publicvoidsendRedirect(java .lang .String location)はjava.io.IOException
パラメーターをスローします。Stringlocation-リダイレクト後のターゲットアクセスパス。
ここに画像の説明を挿入

package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		   System.out.println("TestServlet8--------");
		   //通过HttpServletResponse对象的sendRedirect方法完成重定向
		   resp.sendRedirect("other"); //http://localhost:8080/TestServlet8/other
		   
	}
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OtherServlet--------");
	}
}

ここに画像の説明を挿入

package com.wangxing.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet8 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		    //得到请求提交的用户名
		   String name=req.getParameter("username");
		   //将得到的用户名保存到HttpServletRequest对象中
		   req.setAttribute("myname", name);
		   resp.sendRedirect("other");
	}
}
package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OtherServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String  myname=(String)req.getAttribute("myname");
		System.out.println("OtherServlet--------myname=="+myname);	
	}
}

ここに画像の説明を挿入

総括する:
ここに画像の説明を挿入

1.htmlページ----- "サーブレットハンドラ

1.<form action="test8" method="post">
2.<a href=”test8”></a>`

3.JsのAjax非同期リクエスト送信
2.サーブレットハンドラー---- "htmlページ
1.RequestDispatcher.forward(req、resp)
2。HttpServletRespone.sendRedirect()

おすすめ

転載: blog.csdn.net/guoguo0717/article/details/109102209