ホームページ  >  記事  >  Java  >  Java のサーブレットの ServletContext の詳細な紹介

Java のサーブレットの ServletContext の詳細な紹介

黄舟
黄舟オリジナル
2017-07-26 15:08:191600ブラウズ

この記事ではサーブレットの ServletContext の導入を中心に紹介しますが、編集者がとても良いと思ったので参考にさせていただきます。エディターをフォローして見てみましょう

代わりに、外部の世界 (web.xml ファイルなど) を介して渡されるため、簡単に変更できます。 これは、46309ed845064fdb06e746051efff9e0 タグの下で 380fae52cc7d04565d26dd4bbf4b5460 タグを使用して、キーと値をカプセル化します。複数の 380fae52cc7d04565d26dd4bbf4b5460 タグを使用して複数の初期化パラメータを設定できます。Tomcat の web.xml でデフォルトのサーブレットを確認できます。このデフォルトのサーブレットには 2 つの初期化があることがわかります。パラメータはそれぞれ「debug=0」と「listings=false」です。

サーブレットが web.xml ファイル内で 380fae52cc7d04565d26dd4bbf4b5460 タグを構成すると、Web コンテナはサーブレット インスタンス オブジェクトの作成時にこれらの初期化パラメータを ServletConfig オブジェクトに自動的にカプセル化し、サーブレットの初期化 init メソッドを呼び出します。 ServletConfig オブジェクトをサーブレットに渡します。

サーブレット インターフェイスの初期化メソッド init(ServletConfig config) から、サーバーがサーブレット オブジェクトを作成するときに ServletConfig オブジェクトを渡し、その ServletConfig オブジェクトにはパラメータと < によって設定されたパラメータが含まれていることがわかります。 init-param> タグ。


私が初めてサーブレットの学習を始めたときに、サーブレット インターフェイスの非ライフサイクル メソッドの 1 つが、ServletConfig オブジェクトを返す getServletConfig() メソッドであることをすでに述べました。そのため、Web でこのサーブレットにアクセスするために情報を設定すると、MyEclipse コンソールにその情報が表示されます。



ServletConfig クラスでは、getInitParameter(String name) メソッドが特定のパラメータを渡します。 name を使用して、対応するパラメータの値を取得します。 getInitParameterNames () メソッドは、複数のパラメータのキーと値のペアがある場合、すべてのパラメータ名を Enumeration オブジェクトにロードして返します。


public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    ServletConfig config = this.getServletConfig();
    String initValue = config.getInitParameter("love");
    System.out.println(initValue);
  }

最後に、ServletConfig オブジェクトの役割は、通常、エンコーディング テーブル タイプの取得、データベース接続情報の取得、構成ファイル (Struts の web.xml ファイルなど) の取得などに使用されます。


ServletConfig オブジェクトについて説明した後、このオブジェクトのメソッドを見ると、このメソッドには別のメソッド getServletContext() があることがわかります。これは、

ServletContext オブジェクトを返します。これは、ServletConfig オブジェクトの非常に重要なクラスです。サーブレット
。もちろん、ServletContext オブジェクトは親クラスのメソッドから直接取得することもできます。

Web コンテナは、起動時に Web アプリケーションごとに ServletContext オブジェクトを作成します。この ServletContext オブジェクトは現在の Web アプリケーションを表します。 ServletContext オブジェクトは Web アプリケーションを表すため、Web アプリケーション内のすべてのサーブレットとその他のリソースは ServletContext オブジェクトを共有します。このとき、ServletContext オブジェクトを通じてサーブレット オブジェクト間で通信できます。 ServletContext オブジェクトは、Context ドメイン オブジェクトとも呼ばれます。


まず、ServletContext オブジェクトを取得する 2 つの方法を見てみましょう:

public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    ServletConfig config = this.getServletConfig();
    Enumeration initParams = config.getInitParameterNames();
    while(initParams.hasMoreElements()) {
      String paramName = (String)initParams.nextElement();
      String paramValue = config.getInitParameter(paramName);
      System.out.println(paramName+" = "+paramValue );
    }
  }

最初に ServletConfig オブジェクトを取得することによって取得することも、親クラスのメソッドを通じて直接取得することもできます。これら 2 つの方法で取得されるものは次のとおりです。同じオブジェクト (同じアドレス) です。


ServletContext はこの Web アプリケーションを表すため、サーブレット間の直接通信に使用できます。その後、2 つのサーブレット間でデータを送信するためのプロジェクトを作成します。 [myservlet] Web プロジェクトの下に 2 つのサーブレット (ServletDemo1 と ServletDemo2) を作成します。

ServletDemo1 は、ServletContext にパラメーターのキーと値のペアを設定します。コードは次のとおりです。


public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    //两种获取ServletContext对象的方法:
    ServletContext context1 = this.getServletConfig().getServletContext();
    ServletContext context2 = this.getServletContext();
    
    //System.out.println(context1 == context2);  //ture
  }

ServletDemo2 は、ServletContext からキーと値のペアを取得します。コードは:

public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    ServletContext context = this.getServletContext();  
    System.out.println(context.getAttribute("lover"));
  }

在浏览器先访问ServletDemo1后(先执行ServletDemo1才能使ServletContext设置参数),再访问ServletDemo2后,MyEclipse的控制台就输出了ServletContext中设置的参数,这就达到了从一个Servlet传递数据给另一个Servlet。当然这只是ServletContext的一个小小应用。

在ServletContext类中还有getInitParameter(String name)方法或者getInitParameterNames()方法,这两个方法获取的是web应用所配置的参数(毕竟ServletContext代表web应用),就像ServletConfig中类似的方法获取的是某个Servlet中的380fae52cc7d04565d26dd4bbf4b5460标签配置的参数。

而对于配置web应用的参数是在web.xml文件中使用75d9475f58d50d678ef97bf7ae35ef75标签,正如在该文件中为Servlet配置参数而使用380fae52cc7d04565d26dd4bbf4b5460标签一样。这种配置75d9475f58d50d678ef97bf7ae35ef75标签的好处在于属于全局性的配置,而每个Servlet的配置参数仅局限于在Servlet的范围内,举个例子,对于整个web应用配置数据库连接,这样在web应用中的每个Servlet都可以使用,而无需再在每个Servlet中都单独设置一次,提高了效率。

例:在【myservlet】web工程下建立了名为ServletDemo3的Servlet,并在该web工程下的web.xml文件中添加75d9475f58d50d678ef97bf7ae35ef75标签作为该web应用的配置参数:

在ServletDemo3中的代码如下:


public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    String username = context.getInitParameter("username");
    String password = context.getInitParameter("password");
    
    System.out.println(username +":"+ password);
}

在浏览器中访问该Servlet,如果MyEclipse的控制台能打印该信息,说明每个Servlet可以通过ServletContext对象来获取web应用的配置信息,也从侧面说明了ServletContext代表了这个web应用:

ServletContext类中的getMimeType(String  file)方法用于返回该文件的MIME类型:


public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String filename = "1.html";
    ServletContext context = this.getServletContext();
    System.out.println(context.getMimeType(filename));  
  }

输出:text/html。

ServletContext中的转发方法(重要) 

在ServletContext对象中还有这么两个方法:getNameDispatcher(String name)(不常用)和getRequestDispatcher(String path),返回的是RequestDispatcher对象。转发有什么作用呢,举个例子,比如一个Servlet中的数据交个另一个Servlet来处理,或者Servlet将某个实时数据交给JSP来显示,虽然我们在浏览器中访问的是最开始的Servlet,但是进行转发后看到的其他web资源,而浏览器的地址栏不会改变。

注:在请求对象request对象中也有这么一个getRequestDispatcher(String path)方法,功能与ServletContext对象的这个方法一样,也可以实现转发,因此用哪个对象都行,没有区别。

例:在【myservlet】web工程下创建一个名为ServletDemo1的Servlet和一个show.jsp,

在ServletDemo1中将数据转发给show.jsp,代码为:


public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
  String data = "Ding love LRR";
  this.getServletContext().setAttribute("data", data); //将数据存至web应用的配置中
  ServletContext context = this.getServletContext();    
  RequestDispatcher dispathcer = context.getRequestDispatcher("/show.jsp"); //通过要转发的目的地来获取转发对象
  dispathcer.forward(request, response);   //通过forward方法将请求对象和响应对象转发给别人处理
  }

而在show.jsp中接收这个数据,并封装在HTML中:


<font size="100px" color="red">
    ${data }
</font>

接着我们去浏览器里访问ServletDemo1,就会看到:

虽然我们请求的ServletDemo1资源,但是由于在ServletDemo1中将请求进行了转发,所以其实服务器返回的是show.jsp的资源,但是我们浏览器地址依然会是ServletDemo1,这也是转发和重定向的区别之一。

以上がJava のサーブレットの ServletContext の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。