文档章节

Servlet中ServletConfig和ServletContext漫谈

孟飞阳
 孟飞阳
发布于 2016/07/13 10:01
字数 1611
阅读 67
收藏 2

Servlet的API有很多,这里只谈谈两个Servlet对象:ServletConfig对象和ServletContext对象。

1. ServletConfig对象

        在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数,当Servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些参数封装到ServletConfig对象中,并在调用Servlet的init方法时,将ServletConfig对象传递给Servlet。进而,程序员通过ServletConfig对象就可以得到当前Servlet的初始化参数信息。该对象的getInitParameter(String name)用来获得指定参数名的参数值,getInitParameterNames()用来获得所有参数名,我们测试一下:

        在test工程的src下新建一个包servletConfig,然后新建一个ServletConfigDemo1类,在配置文件里进行如下配置:

<servlet>  
    <servlet-name>ServletConfigDemo1</servlet-name>  
    <servlet-class>servletConfig.ServletConfigDemo1</servlet-class>  
    <init-param>  
    <param-name>category</param-name>  
    <param-value>book</param-value>  
    </init-param>       
    <init-param>  
    <param-name>school</param-name>  
    <param-value>tongji</param-value>  
    </init-param>       
    <init-param>  
    <param-name>name</param-name>  
    <param-value>java</param-value>  
    </init-param>       
</servlet>  
<servlet-mapping>  
    <servlet-name>ServletConfigDemo1</servlet-name>  
    <url-pattern>/ServletConfigDemo1</url-pattern>  
</servlet-mapping> 

        在ServletConfigDemo1.java中的代码如下:

public class ServletConfigDemo1 extends HttpServlet {  
    ServletConfig config = null;      
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        String value = config.getInitParameter("category");//获取指定的初始化参数  
        resp.getOutputStream().write((value + "<br/>").getBytes());  
          
        Enumeration e = config.getInitParameterNames();//获取所有参数名  
        while(e.hasMoreElements()){  
            String name = (String) e.nextElement();  
            value = config.getInitParameter(name);  
            resp.getOutputStream().write((name + "=" + value + "<br/>").getBytes());  
        }  
    }  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        doGet(req, resp);  
    }  
    @Override  
    public void init(ServletConfig config) throws ServletException {          
        this.config = config; //初始化时会将ServletConfig对象传进来  
    }  
}  

        在浏览器中输入:http://localhost:8080/test/ServletConfigDemo1,即可在浏览器中显示读取参数的结果。

        注:实际开发中,并不需要重写init方法,以上代码中重写init方法是为了说明config对象的传递过程。其实在父类的init方法中已经实现了该config的传递了,我们只要直接调用getServletConfig()就可以得到config对象,即在doGet方法中直接通过下面的调用方式获得ServletConfig对象:

  1. ServletConfig config = this.getServletConfig();  

        那么ServletConfig对象有什么作用呢?一般主要用于以下情况:

         1)获得字符集编码;

         2)获得数据库连接信息;

         3)获得配置文件,查看struts案例的web.xml文件等。

2. ServletContext对象

        web容器在启动时,它会为每个web应用程序都创建一个对应的ServletContext对象,它代表当前web应用(web工程)。在ServletConfig接口中有个getServletContext方法用来获得ServletContext对象;ServletContext对象中维护了ServletContext对象的引用,也可以直接获得ServletContext对象。所以开发人员在编写Servlet时,可以通过下面两种方式获得ServletContext对象:

  1. this.getServletConfig().getServletContext();  
  2. this.getServletContext();  

        一般直接获得即可。
        由于一个web应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯,ServletContext对象通常也被称为context域对象。有如下主要方法:

getResource(String path); //方法获得工程里的某个资源  
getResourceAsStream(String path); //通过路径获得跟资源相关联的流  
setAttribute(Sring name, Object obj); //方法往ServletContext里存对象,通过MAP集合来保存。  
getAttribute(String name); //方法从MAP中取对象  
getInitParameter(String name); //获得整个web应用的初始化参数,  
//这个跟ServletConfig获取参数不同,这是在<context-param></context-param>中定义的,config对象里的getInitParameter方法获得的是具体某个servlet的初始化参数。  
getNamedeDispatcher(String name); //方法用于将请求转给另一个servlet处理,参数表示要转向的servlet。  
//调用该方法后,要紧接着调用forward(ServletRequest request, ServletResponse response)方法  
getServletContextName(); // 获得web应用的名称。

        ServletContext应用有哪些呢?
         1)多个Servlet通过ServletContext对象实现数据共享(见下面的Demo1和Demo2)
         2)获取web应用的初始化参数(见Demo3)
         3)实现Servlet的转发(见Demo4和Demo5)
         4)利用ServletContext对象读取资源文件(xml或者properties)(见Demo6)

        下面对ServletContext对象写几个Demo测试一下:

Demo1:往context域中存入数据

public class ServletContextDemo1 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {        
        String data = "adddfdf";  
        ServletContext context = this.getServletConfig().getServletContext();  
        context.setAttribute("data", data);//将数据写到ServletContext  
    }  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        doGet(req, resp);  
    }     
}  

Demo2:从context域中读取数据

public class ServletContextDemo2 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {        
        ServletContext context = this.getServletContext();  
        String data = (String) context.getAttribute("data");//通过键值从ServletContext中获取刚才存入的数据  
        resp.getOutputStream().write(data.getBytes());  
    }  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
          
        doGet(req, resp);         
    }     
} 

Demo3:获取整个web应用的初始化参数

public class ServletContextDemo3 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
  
        ServletContext context = this.getServletContext();  
        String url = context.getInitParameter("url");//获取整个web应用的初始化参数,参数是在<context-param></context-param>中定义的  
        resp.getOutputStream().write(url.getBytes());  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
  
        doGet(req, resp);         
    }         
}

 

Demo4:实现转发

public class ServletContextDemo5 extends HttpServlet {  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        ServletContext context = this.getServletContext();  
        RequestDispatcher rd = context.getRequestDispatcher("/ServletContextDemo5");  
        rd.forward(req, resp);//将请求转发给ServletContextDemo5.java处理  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        doGet(req, resp);  
    }     
}  

Demo5:

public class ServletContextDemo5 extends HttpServlet {  
  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        resp.getOutputStream().write("ServletDemo5".getBytes());//处理ServletDemo4传过来的请求  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        doGet(req, resp);  
    }  
      
} 

Demo6:读取资源文件

public class ServletContextDemo6 extends HttpServlet {  
  
    @Override  
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        //test1(resp);  
        //test2(resp);  
        //test3(resp);  
        //test4();  
    }  
      
    //读取文件,并将文件拷贝到e:\根目录,如果文件太大,只能用servletContext,不能用类装载器  
    private void test4() throws FileNotFoundException, IOException {  
        String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");  
        String filename = path.substring(path.lastIndexOf("\\")+1);  
          
        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");  
        byte buffer[] = new byte[1024];  
        int len = 0;  
          
        FileOutputStream out = new FileOutputStream("e:\\" + filename);  
        while((len = in.read(buffer)) > 0){  
            out.write(buffer, 0, len);  
        }  
    }  
  
    //使用类装载器读取源文件(不适合装载大文件)  
    private void test3(HttpServletResponse resp) throws IOException {  
        ClassLoader loader = ServletContextDemo6.class.getClassLoader();  
        InputStream in = loader.getResourceAsStream("db.properties");  
        Properties prop = new Properties();  
        prop.load(in);  
        String driver = prop.getProperty("driver");  
        resp.getOutputStream().write(driver.getBytes());  
    }  
  
    private void test2(HttpServletResponse resp) throws FileNotFoundException,  
                    IOException {  
        String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");//获取绝对路径  
        FileInputStream in = new FileInputStream(path);//传统方法,参数为绝对路径  
          
        Properties prop = new Properties();  
        prop.load(in);  
        String driver = prop.getProperty("driver");  
        resp.getOutputStream().write(driver.getBytes());  
    }  
  
    //读取web工程中资源文件的模板代码(源文件在工程的src目录下)  
    private void test1(HttpServletResponse resp) throws IOException {  
        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");  
        ////注:源文件若在工程的WebRoot目录下,则上面参数路径直接为"/db.properties",因为WebRoot即代表web应用  
        Properties prop = new Properties();  
        prop.load(in);//先装载流  
        String driver = prop.getProperty("driver");  
        String url = prop.getProperty("url");  
        String username = prop.getProperty("username");  
        String password = prop.getProperty("password");  
        resp.getOutputStream().write(driver.getBytes());  
    }  
  
    @Override  
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        doGet(req, resp);  
    }     
}

 

© 著作权归作者所有

共有 人打赏支持
孟飞阳
粉丝 208
博文 981
码字总数 546304
作品 5
朝阳
个人站长
私信 提问
浅谈ServletContext 与application的异同

servletContext接口是Servlet中最大的一个接口,呈现了web应用的Servlet视图。ServletContext实例是通过 getServletContext()方法获得的,由于HttpServlet继承Servlet的关系GenericServlet类...

小欣妹妹
2017/11/01
0
0
servlet init parameters和context init parameters的区别

Context init parameters 在web.xml中如下 <web-app ...> <context-param> <param-name>foo</param-name> <param-value>bar</param-value> </context-param> <!-- other stuff including se......

巴顿
2013/12/14
0
0
2014-07-03 Java Web的学习(3)-----Servlet的知识

1.什么是Servlet SUN公司定义Servlet规范,其中Servlet API是这样定义的:A servlet is a small Java program that runs withina Web server. Servlets receive and respond to requests from ......

查封炉台
2014/07/08
0
0
ServletConfig对象和ServletContext对象

三、ServletConfig对象 1.ServletConfig,顾名思义,Servlet配置。ServletConfig本质是一个接口,里面包含4个方法。 (1) String getServletName();获取servlet的名字 (2) ServletContext get...

Wakeeee_
2018/07/01
0
0
Java Web-Servlet

章节目录 什么是Servlet Servlet 、ServletContext、Servlet Container、web 容器之间的区别 Servlet、ServletConfig、GenericServlet、HttpServlet、自定义Servlet 之间的联系 HttpServlet ......

markfork
2018/06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
42分钟前
1
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
43分钟前
2
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
59分钟前
2
0
IntelliJ IDEA 第一个 Scala 程序

IntelliJ 安装完成 Scala 插件后,你需要尝试使用 IntelliJ 来创建并且运行第一个程序。 通常这个程序只是简单的输出 Hello World。 创建一个新工程 在文件下面选择新建,然后选择创建工程。...

honeymose
今天
2
0
csapp 习题 - 如何实现异或 exclusive-or

阅读 csapp v3 时,练习题 2.13 很有意思。练习题描述如下。 位设置是对于参数 mask 中每一个为 1 的位,那么参数 x 中相应位则被设置为 1 ;位清除是对于参数 mask 中每一个为 1 的位,那么...

ylme
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部