サーブレットの概要、実装の詳細、リソースへのアクセス、のServletConfig、のServletContext
(A)Setvlet基本的な概要
(1)サーブレットとは何ですか?
サーブレット(サーバアプレット)短いJavaServletは、動的な生成、プラットフォームに依存しないとプロトコル機能で、主な機能は、対話的にデータを参照して生成することで、Javaのサーバー側のプログラムで書かれた、小型のコネクタのサービスプログラムやサービスと呼ばれていますWebコンテンツがあります
JavaWeb我々は3つのコンポーネント(サーブレット、フィルター、リスナー)サーバによって呼び出され、サーブレットは、サーバーが要求データを受信し、要求が完了すると、処理を受けて連絡します - >要求処理 - >完了応答の性質Servletインタフェースを実装するJavaクラス
サーブレットクラスは、私たちによって書かれていますが、オブジェクトがサーバーによって作成され、サーバによって適切なメソッドを呼び出すために
(2)サーブレットを行うために使用しますか?
、ログイン、登録、そのようなものが存在してインタラクティブ機能、およびサーブレットなどのより一般的なネットワーク機能のいくつかは、サーブレットJavaWebの知識が重要なポイントの一つであると言うことができる、私たちはこれらの要求に対処することができます
(B)サーブレットを達成する方法
サーブレットを達成するための3つの方法があります。
- インターフェイスを実装するにjavax.servlet.Servlet。
- するjavax.servlet.GenericServletクラスを継承しました。
- Javax.servlet.http.HttpServletは、クラスを継承しました。
実際の開発は、私たちはしばしばのHttpServletクラスを継承することを選択することも非常に重要である私たちのサーブレット、Servletインタフェースを完成さが、このように認識し、それが始めるの私達の不可欠な一部であり、
(1)私たちの最初のServeltを作成
私たちは、Webプロジェクトを作成し、対応するパラメータを選択し、我々はJDKのバージョン1.8をインストールし、あなたがJavaEE8バージョン4.0に選択することができ、対応するバージョンであるが、ここでは、バージョン7の選択と市場にまだかなり多くあります
唯一の我々は、それが要求を処理するために使用される方法であるため、()メソッドのサービスを気に私たち最初のサーブレットの方法は、他の4つを無視し、デモは、Servletインタフェースを実装するクラスを作成し、このインタフェースでは、我々はすぐに生成する方法が実装されていません指定されたメソッド内の出力文
package cn.ideal.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServeltDemo1 implements Servlet {
//初始化方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//Servlet配置方法
@Override
public ServletConfig getServletConfig() {
return null;
}
//提供服务方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("理想二旬不止");
}
//Servlet信息方法
@Override
public String getServletInfo() {
return null;
}
//销毁方法
@Override
public void destroy() {
}
}
これは、単純なサーブレットコードを終えたが、どのようにブラウザでにアクセスすることができますか?私たちは、ウェブ/ WEB-INF内のweb.xmlを設定する必要があり、我々は<web-app></web-app>
次のコードを追加します(後者を最適化する方法があるが、あなたが覚えていることをお勧めします)
<servlet>
<!--给这个Servlet起一个名字,一般与类名相同-->
<servlet-name>ServletDemo1</servlet-name>
<!--全类名-->
<servlet-class>cn.ideal.web.servlet.ServeltDemo1</servlet-class>
</servlet>
<!--配置映射路径-->
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<!--外界访问的路径-->
<url-pattern>/Demo1</url-pattern>
</servlet-mapping>
今、私たちは私たちの中にあるurl-pattern
、理想的なバイナリ文字列より10日外観の設定にアクセスするためのパス、およびコンソール出力で十分に確認してください
エフェクトの(2)のweb.xml
我々は単にのweb.xmlで、実際には、このweb.xmlの原因を分析進捗状況を構築するサーブレットの設定の目的は、ブラウザの中に置くことです結ばサーブレットを対応するアクセス・パス、上記の例では、アクセス・パスは、次のとおりです。 「/ DEMO1」と「cn.ideal.web.servlet.ServeltDemo1」一緒にバインドします
1 <servlet></servlet>
:ここでは、同じ名前の一般的なクラスに対応し、サーブレットServletDemo1 ServletDemo1の名前を指定します。
2、 <servlet-mapping></servlet=mapping>
:特定へのアクセスパスを設定します
渡さどちらも<servlet-name></servlet-name>
一緒に仲間を
実装プロセス:
サーバーは、ブラウザからのリクエストを受けた1は、リソースパスサーブレットを取得するには、URLパスを解析し、
2、見つけ、web.xmlファイルを見つけ<url-pattern>
、対応する完全なクラス名を探し、ラベルを<servlet-class>
図3は、Tomcatのバイトコードファイルがメモリにロードされ、オブジェクト、前記メソッド呼び出しを作成しています
だから私たちは知っている必要があります:サーブレット内のメソッドのほとんどが作成され、私達によって呼び出されることはない、のTomcatの完成により、
(C)サーブレット・インタフェース
(1)ライフサイクルの概要
私は単にいくつかのプロセスのライフサイクルとして理解されます:
彼の一生の間に - 生まれ - サービス - 死 - 埋葬
1は、彼の生涯の間に:最初の訪問のTomcatサーブレット、Tomcatはサーブレットのインスタンスを作成します。
2は、生まれた: Tomcatは、オブジェクトを初期化するためには、init()メソッドを呼び出します
3、サービス:クライアント・アクセス・サーブレット、サービス()メソッドが呼び出されます
4.死:のTomcatサーブレットがオフまたは長期間使用しない場合、破棄()メソッドが呼び出され
図5は、埋葬:後のガベージコレクション(簡単ではない)を待つために、メソッドが呼び出された)(サーブレットを破壊し、再初期化するために、init()メソッドを使用する必要があります
(2)詳細なライフサイクル
彼の一生の間に1、
でSサーバ時間ervletは、最初にアクセス、またはでサーバーの起動サーブレットを作成します。あなたは、サーバーの起動サーブレットを作成する場合は、デフォルトでは、ということを意味し、web.xmlファイルで設定する必要がありますサーブレットが最初の訪問の時にサーバーによって作成されました
サーブレットタイプは、サーバーは、オブジェクトのインスタンスを1つだけ作成します。例えば、私たちが訪れ初めて<http://localhost:8080/Demo1>
、サーバが/Demo1
見つけてcn.ideal.web.servlet.ServeltDemo1
直接反射によってServletDmoe1のインスタンスを作成、またはしない場合にのみ、サーバは、サーブレットのこのタイプが作成されたかどうかを決定しますすでに既存の使用例
2、生まれ
サーブレットが作成された後、サーバーがしますすぐに呼び出すサーブレットのvoid init(ServletConfig)
方法が、サーブレットの人生を、この方法は、我々はサーブレットのメソッドの初期化にいくつかの作業を置くことができ、一度呼び出すことができます!
3、サービス
サーバは、各時間は、要求を受信すると、要求を処理するサービス・サーブレット()メソッドを呼び出すことです。サーバがリクエストを受信するサービス()メソッドが複数回呼び出されます、それはこのために、一度サービス()メソッドを呼び出しますので、私たちは要求サービス(メソッド)を処理するコードを記述する必要があります!
4、死と埋葬
サーバーが閉鎖されるとサーブレットも破壊する必要があるが、破壊前に、サーバが最初に破壊する()メソッドサーブレットを呼び出します、私たちはここにリソースを解放するためにいくつかのコードを置くことができます
3つのサーブレット・インターフェースを入力
これらの5つの方法では、我々はパラメータに接触していない3種類を見ることができます
public void init(ServletConfig servletConfig) throws ServletException {}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}
ServletConfig、のServletRequest、ServletResponseを:それは、3種類あります
:のServletConfig
たServletConfigは、サーバによって作成されたオブジェクトであり、その後、サーブレットのinit(メソッド)に渡されます
私たちは、単によりよく理解するために、以下の方法最初のgetServletNameで()その上で、我々はコンテキストを書くことを学ぶ方法の裏、および他の知識を使用します
//获取Servlet在web.xml文件中的配置名称,即<servlet-name>指定的名称
String getServletName()
//用来获取ServletContext对象
ServletContext getServletContext()
//用来获取在web.xml中配置的初始化参数,通过参数名来获取参数值;
String getInitParameter(String name)
//用来获取在web.xml中配置的所有初始化参数名称
Enumeration getInitParameterNames()
B:のServletRequest&ServletResponseを
これらの2つのタイプが表す、サーブレットサービス()メソッドで表示され、要求および応答オブジェクトを、両方の例は、サーバによって作成されます
しかし、我々は、Webアプリケーションを実行したい、そして最終的に我々は(サービスの機能を関連するHTTPメソッドを使用する場合)、HTTPにリンクされ、強いたServletResponseのServletRequestに回すことができるとのHttpServletRequestとHttpServletResponseの
HttpServletRequestの方法:
//获取指定请求参数的值;
String getParameter(String paramName)
//获取请求方法,例如GET或POST
String getMethod()
//获取指定请求头的值;
String getHeader(String name)
//设置请求体的编码!
/*
GET没有请求体,所以这个方法只只对POST请求有效当调用
这个方法必须在调用getParameter()方法之前调用!
使用request.setCharacterEncoding(“utf-8”)之后,再通过getParameter()方法获取参数
时,参数值都已经通过了转码,即转换成了UTF-8编码
*/
void setCharacterEncoding(String encoding)
HttpServletResponseの方法:
//获取字符响应流,使用该流可以向客户端输出响应信息。
PrintWriter getWriter()
Eg:response.getWriter().print(“<h1>Just for test</h1>”);
//获取字节响应流,例如可实现向客户端响应一张图片
ServletOutputStream getOutputStream()
//用来设置字符响应流的编码
void setCharacterEncoding(String encoding)
//向客户端添加响应头信息
void setHeader(String name, String value)
Eg:setHeader(“Refresh”, “3;url=http://www.xxx.com”) 表示三秒后自动刷新到该网址
//该方法是setHeader(“content-type”, “xxx”)的简便方法,即用来添加名为content-type响应头的方法
/*
content-type响应头用来设置响应数据的MIME类型,例如要向客户端响应jpg的图片,那么
可以setContentType(“image/jepg”),如果响应数据为文本类型,那么还要台同时设置编
码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为文本类型
中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;
*/
void setContentType(String contentType)
//向客户端发送状态码,以及错误消息
void sendError(int code, String errorMsg)
(D)GenericServletからクラス
A:唯一のクラス、このクラスのソースコードを見ることで知ることができます
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
メソッドを実装する必要があり、他の方法が既にソースコードで定義されています
B:GenericServletからのinit()メソッド
また、我々は、前述の2つのメソッドを言及する必要があります
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
GenericServletからクラスは、サーブレットのinit(のServletConfig)メソッド、クラス設定のメンバーに割り当てられた設定パラメータ、その後、独自の引数なしのinitのこのクラスを呼び出す()メソッドを実装します
この方法は、GenericServletからされて自分のダウンサーブレットから継承されたのではなく、方法を。あなたが完了したい場合は、当社のカスタムサーブレットは、初期化アクションは、init(のServletConfig)メソッドを繰り返す必要はないだろうが、むしろに行く必要があるときは、init()をオーバーライドメソッドを。initの中でGenericServlet(のServletConfig)メソッド保存ServletConfigオブジェクト、コードが格納されている場合のServletConfigカバーなので、あなたがたServletConfigを使用することはできません
C:インターフェースのServletConfigを実装
GenericServletからものServletConfigインタフェースを実装して、あなたがすることができます直接呼び出すのServletConfigのgetInitParameter()、のgetServletContext()メソッドを。
しかし、これは、我々はまだ焦点の話を私たちのクラスではありません、我々は次のクラスを見て
(E)のHttpServletクラス
(1)概要
では、我々は、サーブレットの準備、非常に面倒、とのHttpServletクラスは、すべてのサーブレット・インタフェースのメソッドを達成した、5つのメソッドを実装する必要があるのHttpServletを拡張するだけServletインタフェースを実現する上で、あなたがメソッドをオーバーライドする必要があり、それが提供します以下のための特別支援HTTPリクエスト、より強力な
(2)サービス()メソッド
HttpServletの中にservice(ServletRequest,ServletResponse)
処理することになるのServletRequestとServletResponseをに強いターンのHttpServletRequestとHttpServletResponseの
//HttpServlet 源码节选
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
this.service(request, response);
}
強い旋削した後、その後のHttpServlet呼び出すクラスが提供するservice(HttpServletRequest,HttpServletResponse)
メソッドを、このクラスでメソッド自体、我々が使用している場合、唯一のカバーする必要があることを示唆し、継承されたのではなく、service(HttpServletRequest,HttpServletResponse)
この強力なターンである必要はありません、それを二つのオブジェクト
注:実際には、ステップによって、さらに簡略化のステップがあり、使用しないでください service(HttpServletRequest,HttpServletResponse)
(3)のdoGet()メソッドとdoPost()
HttpServletをするにはservice(HttpServletRequest,HttpServletResponse)
方法の要求がGETやPOSTで判断することになり、GETリクエストならば、それはPOSTリクエストであれば、クラスのdoGet()メソッドを呼び出すために行ってきましたサブクラスで私たちを示しているのdoPost()メソッドを呼び出すために行ってきましたdoGet()またはdoPost()メソッドをカバーすることがあってもよいです
(VI)サーブレットの詳細
(1)スレッド安全性の問題
サーブレット・サーバは、多くの場合、サーブレットは、複数の要求を処理する必要がある、それはサーブレット高効率ものの、明らかですが、スレッドセーフでないオブジェクトのインスタンスを作成することになります
同時に複数のスレッド異なる操作変数のメンバーがあるかもしれないので、だから我々は簡単に、サーブレットにメンバ変数を作成しないでください
結論:でサーブレットのメンバーシップを確立しないでください!ローカル変数を作成するには、メンバーの量はステートレス作成することができ、またはステータスが唯一のメンバーを読みます
(2)サーバーの起動時にサーブレットが作成されます
私たちは時にライフサイクルサーバがサーブレットを作成するために開始したときに、サーブレットは、あなたが最初のサーバーがアクセスしたときに作成されますが、私たちはweb.xmlにサーブレットを設定することができますことを言っただろう前に、
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.ideal.web.ServletDemo1</servlet-class>
<!--在<servlet>中配置<load-on-startup>,其中给出一个非负整数!-->
<load-on-startup>0</load-on-startup>
</servlet>
その役割は、作成サーブレットサーバの起動の順番を決定することです
(3)サーブレットは、複数のURLをバインドすることができます
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
<url-pattern>/BServlet</url-pattern>
</servlet-mapping>
このような構成の後に関わらず、アクセス/ AServlet又は/ BServletの、アクセスがAServletあります
(4)ワイルドカードマッチング問題
で<url-pattern>
ワイルドカードを使用することができ、つまり、「*」は、任意の接頭辞または接尾辞を一致させることができます
<!--路径匹配-->
<url-pattern>/servlet/*<url-patter>:/servlet/a、/servlet/b,都匹配/servlet/*;
<!--扩展名匹配-->
<url-pattern>*.xx</url-pattern>:/abc/de.xx、/a.xx,都匹配*.xx;
<!--什么都匹配-->
<url-pattern>/*<url-pattern>:匹配所有URL;
特定のアドレスへの優先アクセス、プレフィックスまたはサフィックスはURL中間位置に表示されないことができ、さらに特定のアドレスがある場合は、ワイルドカードでのURLのみが発生する可能性のいずれかとワイルドカード
(七)のServletContext
(1)概要
各ServletContextオブジェクトのためのWebアプリケーションを作成するサーバーが、それは、破壊されます、Tomcatが起動したときに作成され、それは、Webサイト、およびこのオブジェクトを表していると言うことができるとき、Tomcatのシャットダウン
(2)機能
ServletContextオブジェクトを持つすべてのサーブレットを共有するので、ServletContextオブジェクトの役割は、Webアプリケーション全体で動的リソースデータとの間で共有され、あなたはそれによってデータを共有し、サーブレット間で異なるのServletContextを介して通信することができます。
(3)ServletContextオブジェクトを取得します
GenericServletから()メソッドのgetServletContext、直接this.getServletContextは()を得るために使用することができます
public class MyServlet implements Servlet {
public void init(ServletConfig config) {
ServletContext context = config.getServletContext();
}
}
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletContext context = this.getServletContext();
}
}
(4)オブジェクトフィールドの機能
すべてのオブジェクトは、ドメインデータ機能にアクセスするための方法を持って、この実施形態では、データを記憶するものとして見ることができる、の地図
私たちを見て、いくつかの共通データの操作方法
メモリ
//用来存储一个对象,也可以称之为存储一个域属性
void setAttribute(String name, Object value)
Eg:servletContext.setAttribute(“xxx”, “XXX”)
//在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX
得ます
//用来获取ServletContext中的数据
Object getAttribute(String name)
//获取名为xx的域属性
Eg:String value = (String)servletContext.getAttribute(“xxx”);
//获取所有域属性的名称;
Enumeration getAttributeNames()
取り除きます
//用来移除ServletContext中的域属性
void removeAttribute(String name)
小さな例訪問統計
package cn.ideal.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取ServletContext对象
ServletContext servletContext = this.getServletContext();
//获取ServletContext对象中的count属性
Integer count = (Integer) servletContext.getAttribute("count");
if (count == null) {
//如果在ServletContext中不存在count属性,name设置为count的值为1,表示第一次访问
count = 1;
} else {
//如果在Servlet中存在count属性,说明以前被访问过,name让count在原来的基础上加1
count++;
}
servletResponse.setContentType("text/html;charset=UTF-8");
//向客户端响应本页面被访问的次数
servletResponse.getWriter().print("<h1>本页面一共访问" + count + "次</h1>");
//保存count的值到ServletContext对象中
servletContext.setAttribute("count", count);
}
}
(VIII)リソースへのアクセスに関連する方法を
(1)のパスを取得します。
私たちはサーブレットの両方を取得したい場合は、Use ServletContextオブジェクトは、WEB-INFディレクトリの下bbb.txtファイルを作成し、そのようなWebアプリケーションのルートディレクトリにaaa.txtファイルを作成するなどのWebアプリケーションでリソースにアクセスするために使用することができます私は、パスを記述します
//获取aaa.txt的路径
String realPath = servletContext.getRealPath(“/aaa.txt”)
//获取bbb.txt的路径
String realPath = servletContext.getRealPath(“/WEB-INF/b.txt”)
私たちは、このようなパス/ WEB-INFの下にあるすべてのリソースへのアクセスなどのディレクトリパスを指定したすべてのリソースに得ることができる方法があり、単一のファイル・パスは、ケースです取得します。
Set set = context.getResourcePaths("/WEB-INF");
System.out.println(set);
(2)資源の流れへのアクセスを
だけでなく、私たちはパスを取得するServletContextを使用することができ、我々はまた、例えば、上記の二つの文書を前提とする資源の流れを得ることができます
//获取aaa.txt
InputStream in = servletContext.getResourceAsStream(“/aaa.txt”);
//获取bbb.txt
InputStream in = servletContext.getResourceAsStream(“/WEB-INF/b.txt”);
リソース(3)は、クラスパスを取得します。
InputStream in = this.getClass().getClassLoader().getResourceAsStream("xxx.txt");
System.out.println(IOUtils.toString(in));
(IX)のアノテーションを使用することは、もはやのweb.xmlに構成されていません
それぞれが非常に簡単で便利な、私たちはweb.xmlに設定する必要がありますが、私たちのサーブレットのバージョン3.0以上ならば、あなたはweb.xmlのを作成しないことを選択することができ、そして解決するために、アノテーションを使用してサーブレットを作成します
たとえば、次のように我々は、サーブレット、web.xml構成を作成します
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.ideal.web.servlet.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/Demo2</url-pattern>
</servlet-mapping>
//在类名的上方写入这样一句代码,引号内为外部访问路径
@WebServlet("/Demo2")
我々は関与の原則を見て、非常に簡単ではありません。
//WebServlet 源码节选
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";
String[] value() default {};
String[] urlPatterns() default {};
int loadOnStartup() default -1;
この注釈は、見ることができます@Target({ElementType.TYPE})
クラスのスコープが、@Retention(RetentionPolicy.RUNTIME)
その中で最も重要なことは、主に団体として、理由はweb.xmlに、実行時に名前の関数を、名前()メソッドが、ここではそれほど重要ではないまま、私たちことString[] urlPatterns() default {};
配列は、もちろん、設定も可能であると定義されているアドレス、つまり、設定urlPatterns = "/Demo2"
の最も重要な値が値、実際には、このアドレスに代わって、それはのように書くことができ表すのValue = "/Demo2"
、および値をとすることができますので、省略することができます書かれました"/Demo2"
終了:
間違った場所に不備、またはコンテンツがある場合は、私に叫ぶのアドバイス、カニのみんなを与えることを歓迎します!^ _ ^
あなたが助けることができるなら、それは私に注意を払うことです!(記事の更新シリーズは初めて公衆の数になります)
ここでは、すべて自分のための夢や仕事で、見知らぬ人です❤
2の上に10日以上:スティック元のJavaテクノロジのパブリック番号を押してください