图片 4

小谈-—ServletConfig对象和servletContext对象

那生龙活虎节将介绍 ServletContext 和 ServletConfig 那八个接口。
通过那三个接口,我们得以在web.xml中安装有个别参数,如数据库地址、客商名密码等,供
Servlet 使用, 那样每一遍参数值变动时,不用再行编写翻译Servlet了。

    
在Servlet的配备文件中,能够动用三个或七个标签为servlet配置部分开端化参数。当servlet配置了初叶化参数后,web容器在开立servlet实例对象时,会活动将这个带头化参数封装到ServletConfig对象中,并在调用servlet的init方法时,ServletConfig对象传递给servlet。从而,程序猿通过ServletConfig对象就能够赢稳妥前servlet的伊始化参数信息。
示范代码如下:

 

javax.servlet.ServletContext接口(上下文参数卡塔尔国是指向性全数项目标大局设置, 而javax.servlet.ServletConfig接口(开端化参数卡塔尔国是针对当前Servlet的装置。
两个的装置剧情都写在web.xml中。在Eclipse中新建Servlet时,
能够见见设置初步化参数的岗位,如下图:

复制代码 代码如下:
 package com.yyz.servletconfig;
 import java.io.IOException;
 import java.util.Enumeration;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 public class ServletConfigDemo1 extends HttpServlet {
     ServletConfig config;
     public void doGet(HttpServletRequest request, HttpServletResponse
response)
             throws ServletException, IOException {
       //获取钦命的起头化参数
         String value = config.getInitParameter(“xxx”);
         response.getOutputStream().write(value.getBytes());
         //获取具备的开头化参数
         Enumeration e = cofig.getInitParameterNames();
         while(e.hasMoreElements()){
             String name = (String) e.nextElement();
             value = config.getInitParameter(name);
             response.getOutputStream().write((name+”=”+value+”
“).getBytes());
         }
     }
     public void doPost(HttpServletRequest request, HttpServletResponse
response)
             throws ServletException, IOException {
         doGet(request,response);
     }
     @Override
     public void init(ServletConfig config) throws ServletException {
         this.config = config;
     }
 }

一、servletContext概述

  servletContext对象是Servlet三大域对象之后生可畏,各个Web应用程序都装有二个ServletContext对象,该对象是Web应用程序的全局对象也许上下文。汤姆cat服务器在运维时,会自行创设多少个ServletContext对象,在关闭时,会自动销毁那几个ServletContext对象。每一种Web应用程序只具备三个ServletContext对象,ServletContext对象能够在一切Web应用中国共产党享数据能源。

  1. 生命周期非常短
  2. 每一个web应用都有多少个唯风流倜傥的servletContext对象.
  3. 在各类应用加载的时候,服务器就能创建servletContext对象。
  4. ServletContext对象是七个域目的(领域卡塔尔(قطر‎
  5. 获得servletContext的方式

图片 1

相应的web.xml如下:

在自定义Servlet中有以下三种方式获取到ServletContext对象:

  • 透过ServletConfig对象的this.getServletContext(卡塔尔方法赢得。
  • 行使request.getSession(卡塔尔.getServletContext(卡塔尔(قطر‎方法获得。
  • 通过三回九转GenericServlet类或HttpServlet类,调用GenericServlet类或HttpServlet类的getServletContext(卡塔尔国方法获得。

    1 import java.io.IOException;
    2
    3 import javax.servlet.ServletConfig;
    4 import javax.servlet.ServletContext;
    5 import javax.servlet.ServletException;
    6 import javax.servlet.http.HttpServlet;
    7 import javax.servlet.http.HttpServletRequest;
    8 import javax.servlet.http.HttpServletResponse;
    9 //演示获取servletContext对象
    10 /*
    11
    有两种方式获取servletContext对象
    12 1. 选用servletConfig对象获得13 2. 行使servlet实例对象获得14 3. 使用request对象获得15 @author Administrator
    16
    17
    /
    18 public class ServletContext1 extends HttpServlet {
    19
    20 ServletContext sc ;
    21
    22 @Override
    23 public void init(ServletConfig config卡塔尔(قطر‎ throws ServletException {
    24 super.init(config卡塔尔 ;
    25 sc = config.getServletContext(卡塔尔国 ;//1.
    26 }
    27
    28 public void doGet(HttpServletRequest request, HttpServletResponse response卡塔尔国29 throws ServletException, IOException {
    30 //第三种艺术
    31 ServletContext sc1 = this.getServletContext(卡塔尔国 ;
    32 System.out.println(sc卡塔尔;
    33 System.out.println(sc1 == sc卡塔尔;
    34 //第三种艺术
    35 ServletContext sc2 = request.getSession(State of Qatar.getServletContext(卡塔尔(قطر‎ ;
    36 System.out.println(sc2 == scState of Qatar;
    37 }
    38
    39 public void doPost(HttpServletRequest request, HttpServletResponse response)40 throws ServletException, IOException {
    41 doGet(request, response卡塔尔国;
    42 }
    43 }

而上下文参数就没那样便利,只可以通过手工编写制定web.xml来增加了。
幸亏Eclipse提供了有利的XML编辑器,
张开web.xml之后就可以见到各样Servlet的配置境况, 右键单击最顶层的“web-app”成分,采用Add
Child->context-param
, 然后各自改正 param-name 和 param-value 就能够。

复制代码 代码如下:
 

应用

1卡塔尔国 完成数量分享

2State of Qatar 获取全局配置参数

3卡塔尔国 伏乞转载

a卡塔尔(قطر‎ 拿取央求转载器,然后转向

4卡塔尔(قطر‎ 获取能源文件

5卡塔尔 用来收获文件的MIME的类型.

图片 2

 
 “
     xmlns:xsi=””
     xsi:schemaLocation=”

     version=”2.5″>
  
   
     ServletConfigDemo1
     com.yyz.servletconfig.ServletConfigDemo1
    
                xxx
                yyy
    
      
                name
                yyz
    
      
                password
                yyy
    
  
 
     ServletConfigDemo1
     /servlet/ServletConfigDemo1
  
  
 

案例

下边我将经过例子表达:登陆成功后,5秒后跳转到有个别页面,在页面中显得你是第x次登入成功

 

  • 开创三个VisitServlet用来获得访谈次数,并蕴藏在ServletContext对象中。

 

 

 1 public class VisitServlet extends HttpServlet {
 2     @Override
 3     public void init() throws ServletException {
 4         ServletContext context = getServletContext();
 5         context.setAttribute("times", 0);
 6     }
 7     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 8         ServletContext context = getServletContext();
 9         
10         int times = (Integer)context.getAttribute("times");
11         times ++;
12         context.setAttribute("times", times);

            response.setHeader(“Refresh”,
“5;url=/test/showTimeServlet”);

13     }
14     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
15         doGet(request, response);
16     }
17 }

 

  • 创建一个ShowTimeServlet用来突显访谈次数。

    1 public class ShowTimeServlet extends HttpServlet {
    2 public void doGet(HttpServletRequest request, HttpServletResponse response卡塔尔 throws ServletException, IOException {
    3 ServletContext context = getServletContext(卡塔尔国;
    4 //获取访问的次数
    5 int times = (Integer卡塔尔context.getAttribute(“times”卡塔尔;
    6
    7 response.setContentType(“text/html;charset=utf-8”);
    8 PrintWriter out = response.getWriter();
    9 out.println(“

    VisitServlet共被访问了”+times+”次

    “);
    10 }
    11 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    12 doGet(request, response);
    13 }
    14 }

 

 

获得Servlet的web.xml配置信息

1 <context-param>
2         <param-name>username</param-name>
3         <param-value>苍老师</param-value>
4 </context-param>
5 <context-param>
6       <param-name>password</param-name>
7       <param-value>123</param-value>
8 </context-param>

收获web.xml配置消息中

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 获取web应用的初始化信息
 */
public class ServletContextDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            //获得ServletContext域对象
        ServletContext context = this.getServletContext();
            //获得单个数据(username)
              String name = context.getInitParameter("username") ;
//        System.out.println(name);
             //获得所有数据
        Enumeration enumeration = context.getInitParameterNames();
        while(enumeration.hasMoreElements()){
            String name = (String)                     enumeration.nextElement();
            String value = context.getInitParameter(name);
            System.out.println(name+":"+value);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 开发浏览器,在地点栏输入http://localhost:8080/test/visit,访问VisitServlet。
  • 再新开辟浏览器,在地方栏输入http://localhost:8080/test/show,呈现访谈次数。

 

那么在先后中怎么着赢得这两类参数?请看这多少个艺术:

测量检验结果如下:

图片 3

javax.servlet.GenericServlet.getServletConfig()

图片 4

 二、servletConfig概述

  在javax.servlet包中,定义了ServletConfig接口。Servlet容器使用ServletConfig对象在Servlet发轫化时向其传递配置新闻。

所谓的Serlvet配置消息,正是在Web应用程序中web.xml文件中配置有关Servlet的内容。

<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>ServletConfigTest</servlet-name>
    <servlet-class>app.java.servlet.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/servlet/ServletConfigTest</url-pattern>
  </servlet-mapping>
    <init-param>
    <param-name>name</param-name>
    <param-value>yl</param-value>
    </init-param>
    <init-param>
    <param-name>blog</param-name>
    <param-value>http://www.longestory.com</param-value>
    </init-param>
  • getServletName(卡塔尔国方法:获取web.xml文件中结构的Servlet名称。

    public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {

    ServletConfig servletConfig = this.getServletConfig();
    
    String servletName = servletConfig.getServletName();
    System.out.println(servletName);
    

    }

 运行Web应用程序,在调整台北打字与印刷“ConfigServletTest”。

  • getInitParameter(String
    name卡塔尔(قطر‎方法:再次来到钦命名称的开首化参数的值,倘诺参数空中楼阁则赶回null值。

public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
    ServletConfig servletConfig = getServletConfig();

    String name = servletConfig.getInitParameter("name");
    String blog = servletConfig.getInitParameter("blog");
    System.out.println(name + "'s blog is " + blog);
}

运转Web应用程序,在调节新竹打字与印刷“yl’s
blog is

  • getInitParameterNames(卡塔尔方法:重返Servlet配置的有着开端化参数名称的枚举聚积. Enumeration是Iterator的前身,用法与Iterator风流浪漫致。

    public void service(ServletRequest req, ServletResponse res)

            throws ServletException, IOException {
    ServletConfig servletConfig = getServletConfig();
    
    Enumeration enumeration = servletConfig.getInitParameterNames();
    while (enumeration.hasMoreElements()) {
        String element = (String) enumeration.nextElement();
        String value = servletConfig.getInitParameter(element);
        System.out.println(element + ": " + value);
    }
    

    }

  • ServletConfig有何样实际效果吧?在struts 1
    框架中就运行了ServletConfig内容。


    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>
          /WEB-INF/struts-config.xml,
          /WEB-INF/struts-config-Wildcard.xml
       </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
    



    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
    

2017-05-12

 

回去当前Servlet的ServletConfig对象。

 在上头的代码中,ServletConfig德姆o1对象中有一个ServletConfig对象,其实那是不要求的。因为ServletConfig德姆o1世袭了HttpServlet,HttpServlet又继续了GenericServlet
。GenericServlet 已经在中间维护了几个ServletConfig对象。相关落实如下:

javax.servlet.ServletConfig.getServletContext()

复制代码 代码如下:
 public abstract class GenericServlet
     implements Servlet, ServletConfig, java.io.Serializable
 {
     …    …
 private transient ServletConfig config;
 public ServletConfig getServletConfig() {
           return config;
     }
 }

回来当前应用程序的ServletContext对象。

所以大家能够透过我们写的Servlet对象的getServletConfig(State of Qatar方法直接获得ServletConfig对象,示例代码如下:

因而那三个点子,大家就能够取妥善前Servlet的最早化参数对象和上下文参数对象。

复制代码 代码如下:
 package com.yyz.servletconfig;
 
 import java.io.IOException;
 import java.io.PrintWriter;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 public class ServletConfigDemo2 extends HttpServlet {
 
     public void doGet(HttpServletRequest request, HttpServletResponse
response)
             throws ServletException, IOException {
 
         String value =
this.getServletConfig().getInitParameter(“name”);
         System.out.println(value);
 }
 
     public void doPost(HttpServletRequest request, HttpServletResponse
response)
             throws ServletException, IOException {
 
         doGet(request, response);
     }
 
 }

ServletContext的基本点方法:

web.xml文件:

String getInitParameter(String name)

复制代码 代码如下:

得到钦定上下文参数的值。


    xmlns:xsi=””
    xsi:schemaLocation=”

    version=”2.5″>
 
    ServletConfigDemo2
    com.yyz.servletconfig.ServletConfigDemo2
    
               name
               yyz
   
 
 
    ServletConfigDemo2
    /servlet/ServletConfigDemo2
 

ServletConfig的要害措施:

String getInitParameter(String name)

获得内定初步化参数的值。

java.util.Enumeration getInitParameterNames()

获得具备的早先化参数的称号。

事必躬亲程序分别通过ServletContext和ServletContent读出值并出示出来。
因为参数值在Servlet的生命周期中是不改变的,仅需读取二遍就能够,
所以将获取参数的代码写在了 init(State of Qatar 方法并不是 doGet(卡塔尔国方法中。
别的没什么极其供给表达的地点,参数追加的方法参谋前文就可以。

演示下载:[initparam_jb51net.zip

](
复制代码 代码如下:
package com.idv2.learnjsp; 

 import java.io.IOException; 
 import java.io.PrintWriter; 

 import javax.servlet.ServletConfig; 
 import javax.servlet.ServletContext; 
 import javax.servlet.ServletException; 
 import javax.servlet.http.HttpServletRequest; 
 import javax.servlet.http.HttpServletResponse; 

 /** 
  * Servlet implementation class for Servlet: InitParam 
  * 
  */
  public class InitParam extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet { 

     /** 
      * 自动生成的行列号 
      */
     private static final long serialVersionUID =
7732869603825506920L; 

     /** 
      * 程序名称 
      */
     private String appName; 

     /** 
      * 页面标题 
      */
     private String title; 

     public void init() { 

         // 获取参数 
         ServletConfig config = getServletConfig(); 
         ServletContext context = config.getServletContext(); 
         title = config.getInitParameter(“title”); 
         appName = context.getInitParameter(“appname”); 
     } 

     /* (non-Java-doc) 
      * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest
request, HttpServletResponse response) 
      */
     protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { 

         response.setContentType(“text/html; charset=UTF-8”); 

         PrintWriter out = response.getWriter(); 

         out.println(“”); 
         out.println(“

“); 
         out.println(“

” + title + “

“); 
         out.println(“”); 
         out.println(“”); 
         out.println(“Application name: ” + appName); 
         out.println(“”); 
         out.println(“”); 
     } 
 }

发表评论

电子邮件地址不会被公开。 必填项已用*标注