記事ディレクトリ
1. サーブレット開発の開始
(1) 最初のサーブレットプログラムの実現
目標: IDEA ツールを使用してサーブレット プログラムを開発する方法をマスターする
1. IDEA を使用してサーブレットの開発を完了する
実際の開発では、IDEA (または Eclipse など) ツールを使用してサーブレットの開発を完了することが一般的ですが、IDEA はサーブレットを自動的にコンパイルするだけでなく、サーブレットの仮想パスのマッピングを完了するための web.xml ファイル情報を自動的に作成するため、IDEA を使用してサーブレットの開発を完了します。
(1) 新しいWebプロジェクトを作成する
IDEA ホームページで [新しいプロジェクトの作成] オプションを選択して、新しいプロジェクトを作成するためのインターフェイスに入ります。
新しいプロジェクト インターフェイスで、左側の列の [Java] オプションを選択し、[Web アプリケーション] オプションをオンにします。選択が完了したら、「次へ」ボタンをクリックして、プロジェクト情報を入力するインターフェイスに入ります。
新しいプロジェクト インターフェイスでは、「プロジェクト名」オプションはプロジェクトの名前を参照するために使用され、「プロジェクト ロケーション」オプションは Web プロジェクトのルート ディレクトリを指定するために使用されます。プロジェクトのルート ディレクトリは D:\web_work\chapter04 に設定され、Web プロジェクトの名前として WebDemo が使用されます。設定が完了したら、「完了」ボタンをクリックして開発画面に入ります。
アーティファクト名の変更 - WebDemo
Tomcat サーバー構成の編集
[サーバー] タブに切り替えます
サーバーを起動して効果を確認します
(2) サーブレットクラスの作成
新しい net.huawei.servlet パッケージを作成します。
net.huawei.servlet パッケージに ServletDemo01 クラスを作成します。
この時点で、IDEA はサーブレット コードを自動的に生成します
。 サーブレットの実行効果をより適切に示すために、ServletDemo01 の doGet() メソッドと doPost() メソッドにコードを追加します。@WebServlet アノテーションに urlPatterns 属性値を設定します: urlPatterns = "/demo01"
package net.huawei.servlet;
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.io.PrintWriter;
/**
* 功能:Servlet演示类
* 作者:华卫
* 日期:2023年03月12日
*/
@WebServlet(name = "ServletDemo01", urlPatterns = "/demo01")
public class ServletDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取字符输出流
PrintWriter out = response.getWriter();
// 输出信息
out.print("<h1>Hello Servlet World~</h1>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
実際、サーブレットは本質的には Java プログラムに埋め込まれた HTML ページです。
(3) サーブレットの起動
サーバーを起動し、ホームページを表示します。
ページ上の ServletDemo01 クラスの URL アドレス「localhost:8080/WebDemo/demo01」にアクセスします。
対応関係図
赤いメッセージを表示して中央に表示したい場合は、スタイルを使用する必要があります
2. 教室での演習 - Web プロジェクトを作成し、サーブレットを使用して個人情報を表示します
Java Enterprise プロジェクトを作成する
プロジェクト名と保存場所を設定する
[完了] ボタンをクリックして
アーティファクトの名前を確認する 名前を
ShowInfo に変更する
Tomcat サーバーを設定する
デプロイメント内の ShowInfo を削除し、再度追加する
[サーバー] タブに切り替え、URL を
表示する Tomcat サーバーを起動
し、効果を確認する 個人情報を表に表示するようにホームページ ファイルを変更する
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>个人信息</title>
</head>
<body>
<table style="text-align: center" border="1" align="center" cellpadding="5">
<tr>
<td>学号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>专业</td>
<td>班级</td>
<td>手机</td>
</tr>
<tr>
<td>20210201</td>
<td>陈燕文</td>
<td>女</td>
<td>18</td>
<td>软件技术专业</td>
<td>2021软件2班</td>
<td>15890456780</td>
</tr>
</table>
</body>
</html>
サーバーを起動し、結果を確認します。
net.huawei.servlet パッケージを作成し、パッケージ内に InfoServlet クラスを作成します。
package net.huawei.servlet;
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.io.PrintWriter;
/**
* 功能:显示个人信息
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "InfoServlet", urlPatterns = "/info")
public class InfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取字符输出流
PrintWriter out = response.getWriter();
// 往客户端输出信息
out.print("<!DOCTYPE html>");
out.print("<html>");
out.print("<head>");
out.print("<meta charset='UTF-8'");
out.print("<title>个人信息</title>");
out.print("</head>");
out.print("<body style='text-align: center'>");
out.print("<table border='1' align='center' cellpadding='5'>");
out.print("<tr>");
out.print("<td>学号</td>");
out.print("<td>姓名</td>");
out.print("<td>性别</td>");
out.print("<td>年龄</td>");
out.print("<td>专业</td>");
out.print("<td>班级</td>");
out.print("<td>手机</td>");
out.print("</tr>");
out.print("<tr>");
out.print("<td>20210201</td>");
out.print("<td>陈燕文</td>");
out.print("<td>女</td>");
out.print("<td>18</td>");
out.print("<td>软件技术专业</td>");
out.print("<td>2021软件2班</td>");
out.print("<td>15890456780</td>");
out.print("</tr>");
out.print("</table>");
out.print("</body>");
out.print("</html>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动tomcat服务器,访问http://localhost:8080/ShowInfo/info
页面出现中文乱码,需要设置字符编码(要查看Chrome浏览器默认的字符编码)
设置响应对象字符编码为UTF-8,与浏览器当前采用的字符编码保持一致
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info
无论浏览器当前采用什么字符编码,通过设置响应对象内容类型来要求浏览器采用指定的字符编码
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info
查看浏览器当前使用的字符编码,已经被改成GBK了
(2) サーブレットの構成
目標: サーブレット構成を完了する 2 つの方法をマスターします。Web アプリケーションの構成ファイル web.xml を使用する方法と、@WebServlet アノテーションを使用してサーブレット構成を完了します。サーブレットをサーバー内で正しく実行してリクエスト情報を処理するには、適切な構成を実行する必要があります。サーブレットを構成するには、主に 2 つの方法があります。Web アプリケーション構成ファイル web.xml を使用して構成を完了する方法と、@WebServlet アノテーションを使用する方法です
。
1. web.xml を使用してサーブレットを構成する
web.xml ファイルでは、タグを通じて登録が実行され、タグの下にいくつかのサブ要素が含まれます。
サーブレットを URL アドレスにマッピングし、マッピングするラベルを使用し、マッピングするサーブレットの名前をサブラベルを使用して指定します。名前は以前にラベルの下に登録されたものと同じである必要があります。サブラベルを使用して URL アドレスをマッピングし、アドレスの前に「/」を追加する必要があります。そうしないとアクセスできません。
デプロイメント記述ファイル web.xml にサーブレットを登録すると、InfoServlet クラスの注釈をコメント アウトできます。Tomcat
サーバーを再起動し、http://localhost:8080/ShowInfo/info にアクセスします。
2. @WebServlet アノテーション属性
@WebServlet アノテーションは、web.xml ファイル内の etc. タグを置き換えるために使用されます。このアノテーションは、プロジェクトのデプロイメント中にコンテナーによって処理され、コンテナーは、特定の属性構成に従って、対応するクラスをサーブレットとしてデプロイします。このために、@WebServlet アノテーションはいくつかの属性を提供します。
@WebServlet アノテーションは、クラスレベルのアノテーションに属する HttpServlet クラスを継承する任意のクラスでマークできます。InfoServlet クラスには、以下の @WebServlet アノテーションが付けられます。
web.xml ファイル内の InfoServlet の登録タグをコメント アウトし、
Tomcat サーバーを再起動し、http://localhost:8080/ShowInfo/info にアクセスし
、@WebServlet アノテーションを使用して InfoServlet クラスをサーブレットとしてマークします。@WebServlet アノテーションの name 属性値は、サーブレットの name 属性を指定するために使用されます。これは、@WebServlet の name 属性が設定されていない場合、そのデフォルト値はサーブレットの完全なクラス名と同等です。urlPatterns 属性値は、サーブレット URL のセットの一致パターンを指定するために使用されます。これはラベルに相当します。@WebServlet アノテーションで複数のプロパティを設定する必要がある場合は、それらをカンマで区切ります。@WebServlet アノテーションにより、サーブレットの構成手順が大幅に簡素化され、開発者の開発の困難さが軽減されます。
3. サーブレットの複数の URL を構成する
人が複数の外部連絡手段を持っているようなものです
サーバーを起動し、http://localhost:8080/ShowInfo/info にアクセスします。
http://localhost:8080/ShowInfo/message にアクセスします。
(3) サーブレットのライフサイクル
目標: サーブレットの 3 つのライフ サイクル、初期化フェーズ、実行フェーズ、破棄フェーズをマスターする
1. サーバーのライフサイクル - 初期化フェーズ
クライアントがサーブレットにアクセスするために HTTP リクエストをサーブレット コンテナに送信すると、サーブレット コンテナはまずリクエストを解析してサーブレット オブジェクトがメモリ内にすでに存在するかどうかを確認し、存在する場合はサーブレット オブジェクトを直接使用します。サーブレットのライフサイクル全体で、その init() メソッドが呼び出されるのは 1 回だけであることに注意してください。
2. サーブレットのライフサイクル - 実行フェーズ
これは、サーブレットのライフ サイクルで最も重要な段階です。この段階では、サーブレット コンテナは、HTTP リクエストを表す ServletRequest オブジェクトと、クライアント リクエストに対する HTTP レスポンスを表す ServletResponse オブジェクトを作成し、それらをパラメータとしてサーブレットの service() メソッドに渡します。service() メソッドは、ServletRequest オブジェクトからクライアント要求情報を取得して処理し、ServletResponse オブジェクトを通じて応答結果を生成します。サーブレットのライフ サイクル全体で、サーブレットのアクセス要求ごとに、サーブレット コンテナはサーブレットの service () メソッドを 1 回呼び出し、新しい ServletRequest オブジェクトと ServletResponse オブジェクトを作成します。つまり、service () メソッドは、サーブレットのライフ サイクル全体で複数回呼び出されます。
3. サーブレットのライフサイクル - 破棄フェーズ
サーバーがシャットダウンされるか、Web アプリケーションがコンテナーから削除されると、サーブレットは Web アプリケーションとともに破棄されます。サーブレットを破棄する前に、サーブレット コンテナはサーブレットの destroy() メソッドを呼び出して、サーブレット オブジェクトが占有しているリソースを解放できるようにします。destroy() メソッドも、サーブレットのライフサイクル全体で 1 回だけ呼び出されます。サーブレット オブジェクトが作成されると、メモリ内に常駐してクライアントのアクセスを待ちます。サーブレット オブジェクトは、サーバーが閉じられるか、Web アプリケーションがコンテナから削除されるまで破棄されません。
4. 事例デモ サーブレットのライフサイクル
WebDemo プロジェクトに ServletDemo02 クラスを作成し、ServletDemo02 クラスに init() メソッドと destroy() メソッドを記述して、service() メソッドを書き換えて、サーブレット ライフ サイクル メソッドの実行効果を示します。
package net.huawei.servlet;
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.io.PrintWriter;
/**
* 功能:演示Servlet生命周期
* 作者:华卫
* 日期:2023年03月12日
*/
@WebServlet(name = "ServletDemo02", value = "/demo02")
public class ServletDemo02 extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init()方法被调用……");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("service()方法被调用……");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<h1>演示Servlet生命周期~</h1>");
}
@Override
public void destroy() {
System.out.println("destroy()方法被调用……");
}
}
Tomcat サーバーを起動し、http://localhost:8080/WebDemo/demo02 に
アクセスしてブラウザを 2 回更新し、ServletDemo02 に 2 回アクセスし、Tomcat コンソールの印刷結果を表示します。init
() メソッドは最初のアクセス時にのみ実行され、service() メソッドは各アクセス時に実行されます。
ServletDemo02 を削除する場合は、IDEA で WebDemo プロジェクトを停止できます。このとき、サーブレット コンテナは ServletDemo02 の destroy() メソッドを呼び出し、「destroy() メソッドが呼び出されました...」というメッセージが IDEA コンソールに表示されます。
たとえば、人間は一度しか生まれず(init() メソッド)、一度だけ死ぬことができ(destroy() メソッド)、社会にさまざまなサービスを提供するために途中で何度も転職することができます(service() メソッド)。
3、ServletConfig と ServletContext
(1) ServletConfigインターフェース
目標: ServletConfig を使用して構成情報を取得する方法をマスターする
1. ServletConfig インターフェース
サーブレットの実行中に、ファイルで使用されるエンコーディングなどのいくつかの構成情報が必要になることがよくあります。これらの情報は @WebServlet アノテーションの属性で構成できます。Tomcat はサーブレットを初期化するときに、サーブレットの構成情報を ServletConfig オブジェクトにカプセル化し、init(ServletConfig config) メソッドを呼び出して ServletConfig オブジェクトをサーブレットに渡します。ServletConfig は、構成情報を取得するための一連のメソッドを定義します。
2. 事例デモ ServletConfig メソッド呼び出し
getInitParameter() メソッドを例として、ServletConfig メソッドの呼び出しを説明します。
WebDemo プロジェクトの net.huawei.servlet パッケージに ServletDemo03 クラスを作成します。
package net.huawei.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
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.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:演示ServletConfig方法的调用
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo03", urlPatterns = "/demo03",
initParams = {@WebInitParam(name="encoding", value = "utf-8"),
@WebInitParam(name="text-color", value = "red"),
@WebInitParam(name="font-size", value= "25")})
public class ServletDemo03 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 获取Servlet配置对象
ServletConfig config = getServletConfig();
// 获取初始化参数名枚举对象
Enumeration<String> initParams = config.getInitParameterNames();
// 遍历初始化参数名枚举对象,输出参数名及其值
while (initParams.hasMoreElements()) {
String initParam = initParams.nextElement();
out.print(initParam + " : " + config.getInitParameter(initParam) + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを起動し、http://localhost:8080/WebDemo/demo03 にアクセスします。
(2) ServletContextインターフェース
目標: ServletContext インターフェースの使用法をマスターする
1. Webアプリケーションの初期化パラメータを取得する
サーブレット コンテナが起動すると、現在の Web アプリケーションを表す一意の ServletContext オブジェクトが Web アプリケーションごとに作成されます。ServletContext オブジェクトは、現在の Web アプリケーションのすべての情報をカプセル化するだけでなく、複数のサーブレット間でのデータの共有も実現します。
web.xml ファイルには、サーブレットの初期化情報を設定できるほか、Web アプリケーション全体の初期化情報も設定できます。Webアプリケーションの初期化パラメータの設定方法は以下のとおりです。
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
この要素はルート要素にあり、その子要素はパラメータの名前とパラメータ値を指定するために使用されます。パラメータ名とパラメータ値は、ServletContext インタフェースに定義されている getInitParameterNames() メソッドと getInitParameter(String name) メソッドを呼び出すことでそれぞれ取得できます。
2. ケースデモンストレーション Web アプリケーションのコンテナ初期化パラメータの取得
WebDemoプロジェクトのweb.xmlファイルに、コンテナの初期化パラメータ情報とサーブレット情報を設定します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>college</param-name>
<param-value>泸州职业技术学院</param-value>
</context-param>
<context-param>
<param-name>address</param-name>
<param-value>泸州市龙马潭区长桥路2号</param-value>
</context-param>
<context-param>
<param-name>secretary</param-name>
<param-value>何杰</param-value>
</context-param>
<context-param>
<param-name>president</param-name>
<param-value>谢鸿全</param-value>
</context-param>
</web-app>
net.huawei.servlet パッケージに ServletDemo04 クラスを作成します。
package net.huawei.servlet;
import javax.servlet.ServletContext;
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.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:获取Web应用的容器初始化参数
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo04", urlPatterns = "/demo04")
public class ServletDemo04 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取容器的初始化参数名枚举对象
Enumeration<String> paramNames = context.getInitParameterNames();
// 通过循环遍历显示全部参数名与参数值
while (paramNames.hasMoreElements()) {
// 获取参数名
String name = paramNames.nextElement();
// 按参数名获取参数值
String value = context.getInitParameter(name);
// 输出参数名和参数值
out.print(name + " : " + value + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを起動し、http://localhost:8080/WebDemo/demo04 にアクセスします。
3. データを共有するために複数のサーブレット オブジェクトを実装する
Web アプリケーション内のすべてのサーブレットは同じ ServletContext オブジェクトを共有するため、Web アプリケーション内のすべてのサーブレットは ServletContext オブジェクトのドメイン属性にアクセスできます。ServletContext インターフェースは、ServletContext ドメイン属性を追加、削除、設定するための 4 つのメソッドを定義します。
4. このケースは、複数のサーブレット オブジェクトがデータを共有することを示しています
net.huawei.servlet パッケージに ServletDemo05 クラスを作成します。
package net.huawei.servlet;
import javax.servlet.ServletContext;
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.io.PrintWriter;
/**
* 功能:写入域属性
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo05", urlPatterns = "/demo05")
public class ServletDemo05 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 写入域属性
context.setAttribute("id", "20210201");
context.setAttribute("name", "陈雅雯");
context.setAttribute("gender", "女");
context.setAttribute("age", "18");
context.setAttribute("major", "软件技术专业");
context.setAttribute("class", "2021软件2班");
context.setAttribute("telephone", "15890903456");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 输出提示信息
out.print("<h3>成功地写入了域属性~</h3>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
net.huawei.servlet パッケージに ServletDemo06 クラスを作成します。
package net.huawei.servlet;
import javax.servlet.ServletContext;
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.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:读取域属性
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo06", urlPatterns = "/demo06")
public class ServletDemo06 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取全部域属性名枚举对象
Enumeration<String> attributeNames = context.getAttributeNames();
// 通过循环显示域属性名与域属性值
while (attributeNames.hasMoreElements()) {
// 获取域属性名
String name = attributeNames.nextElement();
// 获取域属性值
Object value = context.getAttribute(name);
// 输出域属性名与域属性值
out.print(name + " : " + value + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを起動し、最初に http://localhost:8080/WebDemo/demo05 にアクセスし
、次に http://localhost:8080/WebDemo/demo06 にアクセスします
。記述していないドメイン属性が多数あります。記述したドメイン属性だけを表示したい場合は、ServletDemo06 のコードを変更する必要があります。サーバーを再起動し、http://localhost:8080/WebDemo/demo05 にアクセスしてから、http://localhost:80 にアクセスします。 80/ウェブデモ/デモ
0
6
5. Web アプリケーションの下のリソース ファイルを読み取ります。
ServletContext インターフェースは、Servlet コンテナーによって実装される Web リソースを読み取るためのいくつかのメソッドを定義します。サーブレット コンテナは、Web アプリケーションに対するリソース ファイルの相対パスに従って、関連付けられたリソース ファイルの IO ストリーム、ファイル システム内のリソース ファイルの絶対パスなどを返します。
6. Webアプリケーション配下のリソースファイルを読み込む事例デモ
プロパティファイルを作成します - net.huawei.servlet パッケージ内の college.properties
name = 泸州职业技术学院
address = 泸州市龙马潭区长桥路2号
secretary = 何杰
president = 谢鸿全
net.huawei.servlet パッケージに ServletDemo07 クラスを作成します。
package net.huawei.servlet;
import javax.servlet.ServletContext;
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.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
/**
* 功能:读取资源文件
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ServletDemo07", urlPatterns = "/demo07")
public class ServletDemo07 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置内容类型
response.setContentType("text/html; charset=utf-8");
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取打印输出流
PrintWriter out = response.getWriter();
// 读取资源文件,得到字节输入流
InputStream in = context.getResourceAsStream(
"/WEB-INF/classes/net/huawei/servlet/college.properties");
// 创建属性对象(Map接口的实现类)
Properties pros = new Properties();
// 属性对象加载资源文件的资源文件输入流
pros.load(in);
// 往客户端输出属性值
out.println("name = " + pros.getProperty("name") + "<br />");
out.println("address = " + pros.getProperty("address") + "<br />");
out.println("secretary = " + pros.getProperty("secretary") + "<br />");
out.println("president = " + pros.getProperty("president") + "<br />");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを起動し、http://localhost:8080/WebDemo/demo07 にアクセスします
。プロパティ ファイルのパスの問題です。
プロパティ ファイルを読み取って取得したバイト ストリームのエンコードは ISO-8859-1 であり、トランスコーディング プロセスが必要です。Tomcat サーバーを
再起動し、http://localhost:8080/WebDemo/demo07 にアクセスします。Web プロジェクトの
開発では、開発者はリソースの絶対パスを取得する必要がある場合があります。getRealPath(String path) メソッドを呼び出して、リソース ファイルの絶対パスを取得します。
net.huawei.servlet パッケージに ServletDemo08 クラスを作成します。
package net.huawei.servlet;
import javax.servlet.ServletContext;
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.io.PrintWriter;
/**
* 功能:获取资源的绝对路径
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ServletDemo08", urlPatterns = "/demo08")
public class ServletDemo08 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取打印输出流
PrintWriter out = response.getWriter();
// 创建资源路径字符串
String path = "/WEB-INF/classes/net/huawei/servlet/college.properties";
// 获取资源绝对路径
String realPath = context.getRealPath(path);
// 输出资源绝对路径
out.println("college.properties: " + realPath);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/demo08 にアクセスします。
4、HttpServletResponse オブジェクト
3. 応答メッセージ本文を送信するケースのデモンストレーション
net.huawei.response パッケージを作成する
net.huawei.response パッケージに PrintServlet01 クラスを作成する
package net.huawei.response;
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.io.OutputStream;
/**
* 功能:演示响应体输出字节流
* 作者:华卫
* 日期:2023年04月07日
*/
@WebServlet(name = "PrintServlet01", urlPatterns = "/print01")
public class PrintServlet01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 定义字符串数据
String data = "欢迎访问泸州职业技术学院~";
// 获取字节输出流对象
OutputStream out = response.getOutputStream();
// 往客户端输出信息
out.write(data.getBytes());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/print01 にアクセスし
、net.huawei.response パッケージに PrintServlet02 クラスを作成します。
package net.huawei.response;
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.io.PrintWriter;
/**
* 功能:演示响应体打印字符流
* 作者:华卫
* 日期:2023年04月07日
*/
@WebServlet(name = "PrintServlet02", urlPatterns = "/print02")
public class PrintServlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 定义字符串数据
String data = "欢迎访问泸州职业技术学院~";
// 获取打印字符流
PrintWriter out = response.getWriter();
// 往客户端输出信息
out.println(data);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/print02 にアクセスします
。 ページ上の中国語文字化けの問題を解決するには、コードを変更します。
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/print02 にアクセスします。
5、HttpServletResponseアプリケーション
2. リクエストリダイレクトを実現する事例デモ
ログインページを作成します -login.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="login" method="post">
<fieldset>
<legend>用户登录</legend>
<table cellpadding="2" align="center">
<tr>
<td align="right">用户名:</td>
<td>
<input type="text" name="username"/>
</td>
</tr>
<tr>
<td align="right">密码:</td>
<td>
<input type="password" name="password"/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
ウェルカム ページを作成する - welcome.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功</title>
</head>
<body>
<h3 style="text-align: center">欢迎你,登录成功~</h3>
</body>
</html>
net.huawei.response パッケージに LoginServlet クラスを作成してユーザーのログイン要求を処理する
package net.huawei.response;
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;
/**
* 功能:登录处理程序
* 作者:华卫
* 日期:2023年04月07日
*/
@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取登录表单提交的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 判断是否登录成功,决定重定向到不同页面
if ("howard".equals(username) && "903213".equals(password)) {
// 重定向到欢迎页面
response.sendRedirect("/WebDemo/welcome.html");
} else {
// 重定向到登录页面
response.sendRedirect("/WebDemo/login.html");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/login.html にアクセスし、
login.html ページでユーザー名「howard」とパスワード「903213」を入力し、
ログイン ボタンをクリックして、ようこそページに移動します
。 ログイン ボタンをクリックして、ようこそページに移動します。
2. 文字化け問題を解決する事例デモ
net.huawei.response パッケージ内に ChineseServlet クラスを作成する
package net.huawei.response;
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.io.PrintWriter;
/**
* 功能:演示解决中文乱码问题
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ChineseServlet", urlPatterns = "/chinese")
public class ChineseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建数据字符串
String data = "欢迎访问泸州职业技术学院~";
// 获取打印字符输出流
PrintWriter out = response.getWriter();
// 在页面输出信息
out.println(data);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/chinese にアクセスします。
ブラウザで表示される内容は全て「??~」となっており、文字化けが発生していることが分かります。ここで文字化けが発生する理由は、応答オブジェクトの文字出力ストリームがエンコード時に ISO-8859-1 文字コード テーブルを使用しているためです。ブラウザは受信したデータをデコードする際、デフォルトのコードテーブル GB2312 を使用して「63」を「?」にデコードするため、「蘆州職業技術学院へようこそ」の 12 文字は「???」として表示されます。
ページ文字化け問題を解決する
HttpServletResponse インターフェイスには、文字エンコード方法を設定するために使用される setCharacterEncoding() メソッドが用意されています。次に、 ChineseServlet クラスを変更します。コード String data = "蘆州職業技術学院へようこそ~"; の前にコード行を追加し、文字エンコードに使用するコード テーブルを utf-8 に設定します。
ブラウザで表示される内容は全て「??~」となっており、文字化けが発生していることが分かります。ここで文字化けが発生する理由は、応答オブジェクトの文字出力ストリームがエンコード時に ISO-8859-1 文字コード テーブルを使用しているためです。ブラウザは受信したデータをデコードする際、デフォルトのコードテーブル GB2312 を使用して「63」を「?」にデコードするため、「蘆州職業技術学院へようこそ」の 12 文字は「???」として表示されます。
ページ文字化け問題を解決する
HttpServletResponse インターフェイスには、文字エンコード方法を設定するために使用される setCharacterEncoding() メソッドが用意されています。次に、 ChineseServlet クラスを変更します。コード String data = "蘆州職業技術学院へようこそ~"; の前にコード行を追加し、文字エンコードに使用するコード テーブルを utf-8 に設定します。
Tomcatサーバーを再起動し、http://localhost:8080/WebDemo/chineseにアクセスすると、
ブラウザの文字化けは「???」ではありませんが、出力されるべき「蘆州職業技術学院へようこそ」ではありません。これはブラウザのデコードエラーによるものです。レスポンスオブジェクトの文字出力ストリームのエンコード方式はUTF-8、ブラウザが使用するデコード方式はGBKです。
応答オブジェクトの文字出力ストリーム設定のエンコード方式を GBK に変更する 応答
オブジェクトの文字出力ストリーム設定のエンコード方式を GBK に変更することは、
ページ上の中国語の文字化けの問題を解決するより良い方法であり、特定の文字エンコードに従って中国語を表示するようにブラウザに直接要求します
。
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/chinese にアクセスします。
// 设置HttpServletResponse使用utf-8编码
response.setCharacterEncoding("utf-8");
// 通知浏览器使用utf-8解码
response.setHeader("Content-Type", "text/html;charset=utf-8");
6、HttpServletRequest オブジェクト
(1) リクエストライン情報の取得方法
目標: HttpServletRequest インターフェースを使用してリクエスト行を取得する方法をマスターする
1. 関連するメソッド
メソッド宣言関数の説明
String getMethod( ) このメソッドは、HTTP リクエスト メッセージ (GET、POST など) のリクエスト メソッドを取得するために使用されます String getRequestURI( ) このメソッドは、リクエスト ラインのリソース名部分、つまり、URL のホストとポートの後、パラメーター部分の前のデータ文字列を取得するために使用されます プロトコル名とバージョン (HTTP/1.0 または HTTP /1.1 など) String getContextPath( ) このメソッドは、パスを取得するために使用されますリクエスト URL 内の Web アプリケーションに属するパスです。このパスは、Web サイト全体のルート ディレクトリからの相対パスを意味する「/」で始まり、「/」で終わりませ
ん。リクエスト URL が Web サイトのルート ディレクトリに属している場合、返される結果は空の文字列 ("") です。String getServletPath( ) このメソッドは、サーブレットの名前、またはサーブレットによってマップされたパスを取得するために使用されます。 String getRemoteAddr( ) このメソッドは、要求側クライアントのIP アドレスを取得するために使用され、その形式は「192.168.0.3」に似ています。 String getRemoteHost( ) このメソッドは、サーブレットの完全なホスト名を取得するために使用されます。要求クライアントの形式は「pc1.itc ast.cn」に似ています。クライアントの完全なホスト名を解決できない場合、このメソッドはクライアントの IP アドレスを返すことに注意してくださいint getRemotePort() このメソッドは、要求元のクライアントのネットワーク接続のポート番号を取得するために使用されますString getLocalAddr() このメソッドは、Web サーバー上の現在の要求元のネットワーク接続の IP アドレスを取得するために使用されます
getRequestURL() メソッドによって返される結果は String 型ではなく StringBuffer 型であることに注意してください。これにより、結果の変更が容易になります。
2. 事例デモンストレーション
net.huawei.request パッケージを作成し、そのパッケージ内に RequestLineServlet クラスを作成します。
package net.huawei.request;
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.io.PrintWriter;
/**
* 功能:输出请求行的相关信息
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "RequestLineServlet", urlPatterns = "/request")
public class RequestLineServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html;charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取并输出请求行的相关信息
out.println("getMethod: " + request.getMethod() + "<br />");
out.println("getRequestURI: " + request.getRequestURI() + "<br />");
out.println("getQueryString: " + request.getQueryString() + "<br />");
out.println("getProtocol: " + request.getProtocol() + "<br />");
out.println("getContextPath: " + request.getContextPath() + "<br />");
out.println("getPathInfo: " + request.getPathInfo() + "<br />");
out.println("getPathTranslated: " + request.getPathTranslated() + "<br />");
out.println("getServletPath: " + request.getServletPath() + "<br />");
out.println("getRemoteAddr: " + request.getRemoteAddr() + "<br />");
out.println("getRemoteHost: " + request.getRemoteHost() + "<br />");
out.println("getRemotePort: " + request.getRemotePort() + "<br />");
out.println("getLocalAddr: " + request.getLocalAddr() + "<br />");
out.println("getLocalName: " + request.getLocalName() + "<br />");
out.println("getLocalPort: " + request.getLocalPort() + "<br />");
out.println("getServerName: " + request.getServerName() + "<br />");
out.println("getServerPort: " + request.getServerPort() + "<br />");
out.println("getScheme: " + request.getScheme() + "<br />");
out.println("getRequestURL: " + request.getRequestURL() + "<br />");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/request にアクセスします。
getContextPath: /WebDemo + getServletPath: /request = getRequestURI: /WebDemo/request getScheme: http + ":" + getServerName: localhost + ":" + getServerPort: 8080 + getRequestURI: /WebDemo/request = getRequestURL: http ://localhost:8080/WebDemo/request URI : Uniform
Resource Identifier、Uniform Resource Identifier URL:Uniform Resource Locator、Uniform Resource Locator デモ リクエスト文字列クラス 演習:コンソールにクエリ文字列情報を出力
する
package net.huawei.request;
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.io.PrintWriter;
/**
* 功能:输出请求行的相关信息
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestLineServlet", urlPatterns = "/request")
public class RequestLineServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取并输出请求行的相关信息
out.println("getMethod: " + request.getMethod() + "<br />");
out.println("getRequestURI: " + request.getRequestURI() + "<br />");
out.println("getQueryString: " + request.getQueryString() + "<br />");
out.println("getProtocol: " + request.getProtocol() + "<br />");
out.println("getContextPath: " + request.getContextPath() + "<br />");
out.println("getPathInfo: " + request.getPathInfo() + "<br />");
out.println("getPathTranslated: " + request.getPathTranslated() + "<br />");
out.println("getServletPath: " + request.getServletPath() + "<br />");
out.println("getRemoteAddr: " + request.getRemoteAddr() + "<br />");
out.println("getRemoteHost: " + request.getRemoteHost() + "<br />");
out.println("getRemotePort: " + request.getRemotePort() + "<br />");
out.println("getLocalAddr: " + request.getLocalAddr() + "<br />");
out.println("getLocalName: " + request.getLocalName() + "<br />");
out.println("getLocalPort: " + request.getLocalPort() + "<br />");
out.println("getServerName: " + request.getServerName() + "<br />");
out.println("getServerPort: " + request.getServerPort() + "<br />");
out.println("getScheme: " + request.getScheme() + "<br />");
out.println("getRequestURL: " + request.getRequestURL() + "<br />");
// 在控制台输出请求字符串的信息
if (request.getQueryString() != null) {
String strQuery = request.getQueryString();
String[] queries = strQuery.split("&");
for (String query : queries) {
String[] fields = query.split("=");
System.out.println(fields[0] + " : " + fields[1]);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/request?username=howard&password=903213 にアクセスします。
クエリ文字列を = で分割し続けることもできます。
2. ケースのデモンストレーション
net.huawei.request パッケージ内に RequestHeadersServlet クラスを作成します。
package net.huawei.request;
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.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:演示获取请求头的信息
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestHeaderServlet", urlPatterns = "/header")
public class RequestHeaderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求头名枚举对象
Enumeration<String> headerNames = request.getHeaderNames();
// 遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段
while (headerNames.hasMoreElements()) {
// 获取头字段名称
String headerName = headerNames.nextElement();
// 输出头字段名称及其值
out.println(headerName + " : " + request.getHeader(headerName) + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/header にアクセスし
て F12 キーを押し、開発者ツールを通じてリクエスト ヘッダー情報を表示します。
3. ケースデモリクエストの転送
net.huawei.request パッケージに RequestForwardServlet クラスを作成し、データをリクエスト オブジェクトに保存して、処理のために別のサーブレットに転送します。
package net.huawei.request;
import javax.servlet.RequestDispatcher;
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;
/**
* 功能:演示请求转发
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "RequestForwardServlet", urlPatterns = "/forward")
public class RequestForwardServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html;charset=utf-8");
// 设置请求对象属性
request.setAttribute("message", "欢迎访问泸州职业技术学院~");
// 获取请求派发器对象(参数是请求转发的Servlet的url)
RequestDispatcher dispatcher = request.getRequestDispatcher("/result");
// 请求转发给url为`/result`的Servlet
dispatcher.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
net.huawei.request パッケージに ResultServlet クラスを作成して、RequestForwardServlet クラスのリクエスト オブジェクトに格納されているデータを取得して出力します。
package net.huawei.request;
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.io.PrintWriter;
/**
* 功能:处理转发的请求
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ResultServlet", urlPatterns = "/result")
public class ResultServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html;charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求转发保存在request对象里的数据
String message = (String) request.getAttribute("message");
// 输出获取的信息
if (message != null) {
out.println("转发来的消息:" + message);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
対応図
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/forward にアクセスします。
注: アドレス バーには RequestForwardServlet のリクエスト パスが表示されたままですが、ブラウザには ResultServlet に出力される内容が表示されます。これは、リクエストの転送がサーバ内部で行われる動作であるためで、RequestForwardServlet から ResultServlet までがリクエストであり、request 属性を使用して 1 回のリクエストでデータ共有(同一リクエストの転送)が可能です。
2. 事例デモンストレーション
登録ページを作成する - register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="register" method="post">
<fieldset>
<legend>新用户注册</legend>
<table cellpadding="2" align="center">
<tr>
<td align="right">用户名:</td>
<td>
<input type="text" name="username" />
</td>
</tr>
<tr>
<td align="right">密码:</td>
<td>
<input type="password" name="password" />
</td>
</tr>
<tr>
<td align="right">性别:</td>
<td>
<input type="radio" name="gender" value="男"/> 男
<input type="radio" name="gender" value="女"/> 女
</td>
</tr>
<tr>
<td align="right">兴趣:</td>
<td>
<input type="checkbox" name="interest" value="看电影"/>看电影
<input type="checkbox" name="interest" value="敲代码"/>敲代码
<input type="checkbox" name="interest" value="玩游戏"/>玩游戏
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="注册"/>
<input type="reset" value="重填" />
</td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
net.huawei.request パッケージ内に RquestParamsServlet クラスを作成して、登録フォームによって送信されたデータを取得します
package net.huawei.request;
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.io.PrintWriter;
/**
* 功能:获取请求参数
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestParamsServlet", urlPatterns = "/register")
public class RequestParamsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取注册表单提交的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] interests = request.getParameterValues("interest");
// 输出获取的表单数据
out.println("姓名:" + username + "<br />");
out.println("密码:" + password + "<br />");
out.println("性别:" + gender + "<br />");
out.print("兴趣:");
for (int i = 0; i < interests.length; i++) {
out.println(interests[i]);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
Tomcat サーバーを再起動し、http://localhost:8080/WebDemo/register.html にアクセスし、フォーム データを入力して
[登録] ボタンをクリックします。
(5) リクエストパラメータの中国語文字化け問題を解決する
目標:リクエストパラメータの中国語文字化け問題の解決方法を習得する
HttpServletRequest インターフェースには、リクエスト オブジェクトのデコード方法を設定するために使用される setCharacterEncoding() メソッドが提供されます。
ResquestParamsServlet クラスを変更し、コード行を追加して、リクエスト オブジェクトの文字エンコーディングを設定します。
Tomcatサーバーを再起動し、http://localhost:8080/WebDemo/register.htmlにアクセスし、フォームデータを入力して
[登録]ボタンをクリックすると、ページに中国語の文字化けはありません
登録操作をデモンストレーションするために画面を録画します
2. Request オブジェクトを介してデータを渡すケースのデモンストレーション
net.huawei.request パッケージに RquestServlet01 クラスを作成します。
package net.huawei.request;
import javax.servlet.RequestDispatcher;
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;
/**
* 功能:设置请求对象属性,请求转发
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestServlet01", urlPatterns = "/request01")
public class RequestServlet01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 设置请求对象属性
request.setAttribute("id", "20210201");
request.setAttribute("name", "陈燕文");
request.setAttribute("gender", "女");
request.setAttribute("age", "18");
request.setAttribute("major", "软件技术专业");
request.setAttribute("class", "2021级软件2班");
request.setAttribute("phone", "15890903456");
// 获取请求派发器对象(参数是请求转发的Servlet的url)
RequestDispatcher dispatcher = request.getRequestDispatcher("/request02");
// 请求转发给url为`/request02`的Servlet
dispatcher.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
net.huawei.request パッケージに RquestServlet02 クラスを作成します。
package net.huawei.request;
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.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:获取请求转发的数据
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestServlet02", urlPatterns = "/request02")
public class RequestServlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求对象属性名枚举对象
Enumeration<String> attributes = request.getAttributeNames();
// 获取请求转发保存在request对象里的数据并输出
while (attributes.hasMoreElements()) {
// 获取属性名
String attribute = attributes.nextElement();
// 输出属性名及其值
out.println(attribute + " : " + request.getAttribute(attribute) + "<br />");
}
// 删除请求对象的属性
while (attributes.hasMoreElements()) {
// 获取属性名
String attribute = attributes.nextElement();
// 删除属性
request.removeAttribute(attribute);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
サーバーを起動し、http://localhost:8080/WebDemo/request01 にアクセスし
、学生情報のみを表示するように RequestServlet02 を変更します。
package net.huawei.request;
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.io.PrintWriter;
/**
* 功能:获取请求转发的数据
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestServlet02", urlPatterns = "/request02")
public class RequestServlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求转发保存在request对象里的数据并输出
out.println("学号:" + request.getAttribute("id") + "<br />");
out.println("姓名:" + request.getAttribute("name") + "<br />");
out.println("性别:" + request.getAttribute("gender") + "<br />");
out.println("年龄:" + request.getAttribute("age") + "<br />");
out.println("专业:" + request.getAttribute("major") + "<br />");
out.println("班级:" + request.getAttribute("class") + "<br />");
out.println("手机:" + request.getAttribute("phone") + "<br />");
// 删除请求对象的属性
request.removeAttribute("id");
request.removeAttribute("name");
request.removeAttribute("gender");
request.removeAttribute("age");
request.removeAttribute("major");
request.removeAttribute("class");
request.removeAttribute("phone");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
サーバーを起動し、http://localhost:8080/WebDemo/request01 にアクセスします。