首頁  >  文章  >  Java  >  Java中有關servlet之ServletContext的具體介紹

Java中有關servlet之ServletContext的具體介紹

黄舟
黄舟原創
2017-07-26 15:08:191608瀏覽

這篇文章主要介紹了servlet之ServletContext簡介,小編覺得還挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

在對Servlet配置的web.xml檔中,常常會使用一些初始化的參數來配置Servlet,總的功能來說就是不在Servlet程式中將某個變數寫死,而是透過外界(如web.xml檔)進行傳遞,同時方便修改。 這個是使用46309ed845064fdb06e746051efff9e0標籤下的380fae52cc7d04565d26dd4bbf4b5460標籤,使用380fae52cc7d04565d26dd4bbf4b5460標籤的c13d9669d2c8f87a36a39c8f95f41552和f226acac8cb0e4a9d59fcba58b57a899來封裝一個鍵值對,可以使用多個380fae52cc7d04565d26dd4bbf4b5460標籤進行多個初始化參數的設定,我們可以看看Tomcat的web.xml中的預設Servlet:

##可以看到在這個預設Servlet中有兩個初始化參數,分別是「debug=0」和「listings=false」。


當Servlet在web.xml檔案中配置了380fae52cc7d04565d26dd4bbf4b5460標籤後,web容器會在建立Servlet實例物件時,自動將這些初始化參數封裝到ServletConfig物件中,並在呼叫Servlet的初始化init方法時,將ServletConfig物件傳遞給Servlet。


我們從Servlet介面的初始化方法:init(ServletConfig config),可以知道,當伺服器建立Servlet物件就將ServletConfig物件傳遞,而在ServletConfig物件中包含380fae52cc7d04565d26dd4bbf4b5460標籤所配置的參數和值。


剛開始學Servlet時,就已經談到Servlet介面的非生命週期方法就有一個方法是getServletConfig()方法,傳回ServletConfig物件。所以當我們在開發的Servlet的web.xml檔案中配置一些資訊:


#而在Servlet中的程式取得這個配置的參數:


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

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

重新部署該web應用,然後在瀏覽器來存取這個Servlet,將會看到在MyEclipse的控制台上列印:


在ServletConfig類別中,getInitParameter(String name)方法是傳入特定參數名稱來取得對應參數的值,getInitParameterNames()方法則是將所有的參數名稱裝進一個Enumeration物件,當我們有多個參數鍵值對時:


在Servlet中進行遍歷和輸出:


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物件的作用通常用於獲得編碼表類型,獲得資料庫連接信息,獲得配置文件(如Struts的web.xml文件中)等等。


說完了ServletConfig對象,當我們去看這個對象的方法時會發現這個方法中還有一個方法getServletContext()是返回一個

ServletContext對象,這是Servlet中一個非常重要的類別。當然ServletContext物件還可以從父類別的方法直接取得。

Web容器在啟動時會為每個web應用建立一個ServletContext對象,而這個ServletContext物件代表目前這個web應用。因為一個ServletContext物件代表一個web應用,所以該web應用程式中所有的Servlet和其他資源都共用一個ServletContext對象,這時,我們就

可以透過ServletContext物件進行Servlet物件之間的通訊。而ServletContext物件也稱為Context域物件。

我們先來看看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
  }

可以透過先取得ServletConfig物件來獲取,或是直接透過父類別的方法來獲取,這兩種方式取得到的是同一物件(相同位址)。


既然說ServletContext代表這個web應用,我們可以用它來進行Servlet直接的通訊,那麼我們就創建一個工程來進行兩個Servlet之間的資料傳輸。在一個【myservlet】web工程下建立兩個Servlet:ServletDemo1和ServletDemo2,


ServletDemo1在ServletContext中設定參數鍵值對,程式碼為:


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

    ServletContext context = this.getServletContext();
    context.setAttribute("lover", "LRR");
  }

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中有關servlet之ServletContext的具體介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn