一、ServletConfig对象及其应用(用的不多

     1. Context和ContextPath:一个web工程,若名为JavaWeb,访问的路径为:http://localhost:8080/JavaWeb,这整个web应用就为一个Context;

                                            路径/JavaWeb称为Context(上下文路径),利用request.getContextPath()可以获取。

     2. ServletConfig:代表当前Servlet在web.xml中的配置信息

      当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init()方法时,将ServletConfig 对象传递给servlet。进而,通过ServletConfig对象就可以得到当前servlet的初始化参数。

      这样做的好处是:如果将数据库信息、编码方式等配置信息放在web.xml中,如果以后数据库的用户名、密码改变了,则直接很方便地修改web.xml就行了,避免了直接修改源码的麻烦。

  • String getServletName()  :获取当前Servlet在Web.xml中配置的名字;
  • String getInitParameter(String Name) :获取当前Servlet指定名称的初始化参数的值;
  • Enumeration getInitParameterNames()  :获取当前Servlet所有初始化参数的名字组成的枚举;
  • ServletContext getServletContext()  : 获取代表当前web应用的ServletContext对象。

      在Servlet的配置文件中,可以通过一个或多个<init-param>为Servlet配置一些初始化参数。

      示例代码:新建一个ServletConfigTest的Servlet文件,在web.xml的<servlet>下,通过<init-param>为此servlet配置两个初始化参数。

 1 <servlet>
 2     <servlet-name>ServletConfigTest</servlet-name>
 3     <servlet-class>com.yx.servlet.test.ServletConfigTest</servlet-class>
 4     <init-param>
 5         <param-name>name1</param-name>
 6         <param-value>value1</param-value>
 7     </init-param>
 8     <init-param>
 9         <param-name>encode</param-name>
10         <param-value>utf-8</param-value>
11     </init-param>
12   </servlet>
13   
14   <servlet-mapping>
15     <servlet-name>ServletConfigTest</servlet-name>
16     <url-pattern>/Servlet_test/ServletConfigTest</url-pattern>
17   </servlet-mapping>

  注意:在web.xml中配置<servlet-class>时,应为(所在包名.servlet名称),否则会报404错误。

 1 package com.yx.servlet.test;
 2 
 3 import java.io.IOException;
 4 import java.util.Enumeration;
 5 
 6 import javax.servlet.ServletConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.annotation.WebServlet;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 
13 /**
14  * Servlet implementation class ServletConfigTest
15  */
16 @WebServlet("/ServletConfigTest")
17 public class ServletConfigTest extends HttpServlet {
18     private static final long serialVersionUID = 1L;
19        
20     /**
21      * @see HttpServlet#HttpServlet()
22      */
23     public ServletConfigTest() {
24         super();
25         // TODO Auto-generated constructor stub
26     }
27     
28     /**
29      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
30      */
31     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
32         
33         ServletConfig config = this.getServletConfig(); //拿到init方法中的ServletConfig对象
34         
35         //获取当前Servlet在web.xml中的配置名称(不常用)
36         String sName = config.getServletName(); 
37         System.out.println("当前servlet在web.xml中的配置名称为:"+sName);
38         
39         //获取当前Servlet中配置的初始化参数(一次只能获取一个)经常用到
40         //String value = config.getInitParameter("name1");
41         //System.out.println(value);
42         
43         //获取当前Servlet中配置的初始化参数(全部获取)经常用到
44         Enumeration enumeration = config.getInitParameterNames();
45         while(enumeration.hasMoreElements()){
46             String name = (String)enumeration.nextElement();
47             String value = config.getInitParameter(name);
48             System.out.println(name+":"+value);
49         }
50         
51         
52     }
53 
54     /**
55      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
56      */
57     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
58         // TODO Auto-generated method stub
59         doGet(request, response);
60     }
61 
62 }

核心代码地33行,通过this.getServletConfig()获取init方法中的ServletConfig对象,然后获取配置信息。

 

二、ServletContext对象及其应用(非常重要

  简介:

  (1) 生命周期:Web容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用。ServletContext对象只在Web应用被关闭时才被销毁;不同的Web应用,ServletContext各自独立存在。

  (2) 获取:SevletConfig 对象中维护了 ServletContext 对象的引用,通过 SevletConfig.getServletContext()方法获取ServletContext 对象。或者直接调用封装好的getServletContext () 方法即可获取。

  (3) 作用:由于一个Web应用中的所有 Servlet 共享同一个ServletContext 对象,因此 Servlet  对象之间可以通过ServletContext  对象来实现通讯。 ServletContext 对象通常也对称之为context 域对象。

  ServletContext的应用:

  (1)在Web应用中不同Servlet之间的数据共享(通信)

  ServletContext_01.java

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2         ServletContext context = this.getServletContext();
3         context.setAttribute("name", "yx");
4     }

  ServletContext_02.java

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2         ServletContext context = this.getServletContext();
3         String Isname = (String) context.getAttribute("name");
4         System.out.println(Isname);
5     }

  (2)获取Web应用的初始化参数

  之前在<init-param>中为单独的Servlet文件添加配置信息,这些配置信息在其他的Servlet文件中是无法访问的。如果用<context-param>(与servlet标签并列)对整个Web应用进行信息配置的话,那么所有的servlet文件都可以访问这些参数。例如:数据库的一些配置信息。

<servlet>
    <servlet-name>ServletTest_03</servlet-name>
    <servlet-class>com.yx.servlet.test.ServletTest_03</servlet-class>
  </servlet>

  <context-param>
    <param-name>username</param-name>
    <param-value>yanxi</param-value>
  </context-param>
  <context-param>
    <param-name>password</param-name>
    <param-value>123456</param-value>
  </context-param>

<servlet-mapping>
    <servlet-name>ServletTest_03</servlet-name>
    <url-pattern>/Servlet_test/ServletTest_03</url-pattern>
  </servlet-mapping>

从程序代码中获取这些配置参数:

 1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         ServletContext context = this.getServletContext();//得到上下文对象
 3         
 4         //获取单个的context里的参数
 5         String value1 = context.getInitParameter("username");
 6         String value2 = context.getInitParameter("password");
 7         System.out.println(value1+":"+value2);
 8         
 9         //一次全部获取context中所有参数信息
10         Enumeration enumeration = context.getInitParameterNames();
11         while(enumeration.hasMoreElements()){
12             String name = (String)enumeration.nextElement();
13             String value = context.getInitParameter(name);
14             System.out.println(name+":"+value);
15         }
16         
17     }

 输出结果:

  (3)通过ServletContext对象实现servlet的转发

将对本servlet的请求转发到另一个servlet(或jsp)执行,并response。

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2         
3         //参数中写虚拟路径
4         RequestDispatcher dispather = this.getServletContext().getRequestDispatcher("/Servlet_test/ServletTest_05");
5         dispather.forward(request, response);//将会跳到ServletTest_05中执行
6     }

ServletTest_05中的代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.getWriter().write("onlyu");
}

注:不要忘记web.xml中对servlet的配置。

ServletContext的其他应用,可阅读参考文献。

本文主要是对ServletConfig、ServletContext的一个学习过程,参考了下列博文:

(1)http://www.cnblogs.com/smyhvae/p/4140877.html

(2)http://blog.csdn.net/u012228718/article/details/41730903

(3)http://blog.csdn.net/pql925/article/details/53259089

posted on 2017-10-16 12:52  yanxi1900  阅读(179)  评论(0编辑  收藏  举报