コンセプト
サーブレットとは、サーバー側で動作するJavaアプレットで、クライアントのリクエストを処理し、ブラウザの動的リソースに応答するためにサン社が提供する仕様(インターフェース)のセットです。しかし、サーブレットの本質は Java コードであり、Java API を通じてコンテンツをクライアントに動的に出力します。
サーブレット仕様: サーブレット技術、フィルター (フィルター) 技術、リスナー (リスナー) 技術の 3 つの技術点が含まれます。
サーブレットの実装
実装手順:
- サーブレットインターフェースを実装するクラスを作成する
- 実装されていないメソッド (サービス メソッド) をオーバーライドする
- web.xmlでサーブレットを設定する
ただし、実際の開発では、カバーするメソッドが多すぎるため、サーブレットインターフェースを直接実装することはなく、HttpServletを継承するクラスを作成するのが一般的です。
public MyServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
サーブレットのライフサイクル
サーブレットはいつ作成されましたか? デフォルトでは、サーブレットが初めてアクセスされたときにオブジェクトが作成されます。
サーブレットはいつ破棄されますか? サーバーはサーブレットを閉じて破棄します
アクセスされるたびに実行する必要があるメソッドですか? service(ServletRequest req, ServletResponse res) メソッド
質問: XXXServlet に 10 回アクセスすると、init()、destroy()、service()、doGet()、doPost() の実行時間は合計何回になりますか? リクエストオブジェクトはいくつ作成されますか? 回答は何件作成されますか?
回答: init()、1 回、destroy()、サーバーは閉じられていない、実行されていない、service()、10 回、リクエストオブジェクトの作成 10 回、レスポンスの作成 10 回
サーブレット構成
<servlet>
<servlet-name>ServletName</servlet-name>
<servlet-class>xxxpackage.xxxServlet</servlet-class> <!--Servlet的类-->
<init-param> <!--初始化一个变量,可看成全局变量,可省略-->
<param-name>参数名称</param-name> <!--变量名称-->
<param-value>参数值</param-value> <!--变量值-->
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletName</servlet-name>
<url-pattern>/aaa/xxx</url-pattern> <!--映射的url路径 -->
</servlet-mapping>
URLパターンの設定方法は以下の通りです。
-
完全一致によってアクセスされるリソースが、構成されたリソースとまったく同じである場合にのみ、それらのリソースにアクセスできます。
-
ディレクトリ一致形式: /virtual directory.../*、* は任意のディレクトリを表します
-
拡張子一致形式: *.extension
注: 1. パスに関しては、設定されたパス一致範囲が大きいほど優先度が低くなります; 2. ディレクトリ一致と拡張子一致を混合しないでください (例: /aaa/bbb/*.abcd) (これは誤りです)。
ServletConfig オブジェクト
ServletConfig は、サーブレットの構成を web.xml にカプセル化します。
たとえば、web.xml パラメータの構成は次のとおりです。
<init-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</init-param>
方法:
//获得servlet的name(获得配置文件中<servlet-name>元素的内容)
String servletName =getServletConfig().getServletName();
//获取init-param中的所有参数(返回所有<param-name> )
Enumeration<String> en = getServletConfig().getInitParameterNames();
while(en.hasMoreElements()){
String key = en.nextElement();
//根据键获取值(根据<init-param>中的<param-name>获得</param-value>
String value = getServletConfig().getInitParameter(key);)
res.getWriter().print(key+"==>"+value+"<br/>");
}
サーバーの起動によりサーブレット構成がインスタンス化されます
サーブレットの作成時: デフォルトでは、初めてアクセスしたときに作成されます。なぜデフォルトなのでしょうか? サーブレット構成に構成を追加すると、サーバーの起動時にサーブレット オブジェクトが作成されます。
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>com.itheima.servlet.QuickStratServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:///mydb</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/quickStratServlet</url-pattern>
</servlet-mapping>
1.load-on-startup 要素は、コンテナが開始時にサーブレットをロードする (インスタンス化して init() メソッドを呼び出す) かどうかをマークします。
2. その値は、サーブレットがロードされる順序を示す整数である必要があります。
3. 値が 0 または 0 より大きい場合、アプリケーションの開始時にコンテナーがサーブレットをロードして初期化することを意味します。
4. 値が 0 未満であるか、指定されていない場合は、サーブレットが選択されている場合にのみコンテナがロードされることを意味します。
5. 正の数値が小さいほど、サーブレットの優先順位が高くなり、アプリケーションの起動時にロードされる時間が早くなります。
6. 値が同じ場合、コンテナはロードする順序を選択します。
したがって、<load-on-startup>x</load-on-startup>
、1、2、3、4、5 の x の値が優先度を表します。
ServletContext オブジェクト
ServletContext は、Web アプリケーションの環境 (コンテキスト) オブジェクトを表します。ServletContext オブジェクトは、Web アプリケーションの情報を内部的にカプセル化します。Web アプリケーションには ServletContext オブジェクトが 1 つだけ存在します。では、Web アプリケーションにはサーブレット オブジェクトがいくつあるのでしょうか? 多くの。
ServletContext オブジェクトのライフサイクル
作成: Web アプリケーションがロードされます (サーバーが Web アプリケーションを起動または公開します (サーバーが起動している場合))。
破棄: Web アプリケーションはアンインストールされます (サーバーはシャットダウンされ、Web アプリケーションは削除されます)。
ServletContext オブジェクトを取得する
1、ServletContext servletContext = config.getServletContext();
2、ServletContext servletContext = this.getServletContext();
ServletContextの役割
1. Web アプリケーションのグローバル初期化パラメータを次の方法で取得します。
getInitParameterNames(); ==> 获得所有键
getInitParameter(key); ==> 根据键获得对应的值
例: web.xml で初期化パラメータを構成します。
<!--配置全局的初始化参数-->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
コンテキストオブジェクトを通じてパラメータを取得できます
ServletContext context= getServletContext();
String initValue= context.getInitParameter("driver");
resp.getWriter().print(initValue);//com.mysql.jdbc.Driver
2. Web アプリケーション内のリソースの絶対パスを取得します。
この機能は重要です。方法:
getRealPath ==> 相対パスによる絶対パスの取得
getResourceAsStream ==> 相対パスによる指定されたリソース ストリームの取得
3. ServletContext はドメイン オブジェクトです
ドメインオブジェクトとは何ですか? ドメインとは何ですか? データが格納される領域がドメイン オブジェクトです。
ServletContext ドメイン オブジェクトのスコープは Web アプリケーション全体です (すべての Web リソースは ServletContext ドメインのデータに自由にアクセスでき、データは共有できます)。
域对象的通用的方法
放入键值对 setAttribute(key,value)
通过键取值 getAttribute(key)
通过键删除 removeAttribute(key)
遍历所有键 getAttributeNames()
//通过servletContext设置值
sc.setAttribute("bag", "Calvin Klein");
sc.setAttribute("car", "BMW");
sc.setAttribute("passport", "HAWAII");
//通过servletContext取值
String bag = (String) sc.getAttribute("bag");
//不喜欢,扔掉(删除)
sc.removeAttribute("bag");
//遍历
Enumeration<String> en = sc.getAttributeNames();
while(en.hasMoreElements()){
String key = en.nextElement();
Object value = sc.getAttribute(key);
System.out.println(key +"==>"+value);
}