ServletConfig和ServletContext对象的作用和使用
2017-07-07 09:21
453 查看
ServletConfig
官方定义: public abstract interface ServletConfig A servlet configuration object used by a servlet container used to pass information to a servlet during initialization. 一个servlet的配置对象,用来给servlet容器传递信息到servlet,在Servlet初始化的时候。 ServletConfig的几个方法: 1.getInitParameter(java.lang.String name) ------>根据name,获取初始化信息 Returns a String containing the value of the named initialization parameter, or null if the parameter does not exist. 2.getInitParameterNames() ------>获取所有初始化信息的名称 Returns the names of the servlet's initialization parameters as an Enumeration of String objects, or an empty Enumeration if the servlet has no initialization parameters. 3.getServletContext() ------>获取ServletContext对象 Returns a reference to the ServletContext in which the caller is executing. 4.getServletName() ------>获取这个servlet实例的名称 Returns the name of this servlet instance.例子:在web.xml中配置servlet并且设置servlet的初始化信息;
[java] view
plain copy
<servlet>
<servlet-name>Servlet_03</servlet-name>
<servlet-class>com.enterise.always.servlet.Servlet_03</servlet-class>
<init-param>
<param-name>name_01</param-name>
<param-value>value_01</param-value>
</init-param>
<init-param>
<param-name>name_02</param-name>
<param-value>value_02</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_03</servlet-name>
<url-pattern>/servlet/Servlet_03</url-pattern>
</servlet-mapping>
java:
[java] view
plain copy
package com.enterise.always.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet_03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//1.获取ServletConfig对象
ServletConfig config = getServletConfig();
//1.getInitParameter
String para_01 = config.getInitParameter("name_01");
String para_02 = config.getInitParameter("name_02");
System.out.println("para_01----------->"+para_01);
System.out.println("para_02----------->"+para_02);
//2.getInitParameterNames
Enumeration enumeration = config.getInitParameterNames();
while(enumeration.hasMoreElements()){
String name = (String) enumeration.nextElement();
String value = config.getInitParameter(name);
System.out.println("name----------->"+name);
System.out.println("value----------->"+value);
}
//3.getServletContext
ServletContext servletContext = config.getServletContext();
System.out.println("servletContext----------->"+servletContext);
//4.getServletName
String servletName = config.getServletName();
System.out.println("servletName----------->"+servletName);
}
}
后台打印数据:
[java] view
plain copy
para_01----------->value_01
para_02----------->value_02
name----------->name_02
value----------->value_02
name----------->name_01
value----------->value_01
servletContext----------->org.apache.catalina.core.ApplicationContextFacade@b398da
----------->Servlet_03
例子:
在servlet创建的时候,获取数据库的链接信息:
1.在web.xml中配置数据库的连接信息
[java] view
plain copy
<servlet>
<servlet-name>Servlet_04</servlet-name>
<servlet-class>com.enterise.always.servlet.Servlet_04</servlet-class>
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/data</param-value>
</init-param>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
2.在servlet中获取数据:
[java] view
plain copy
public void init(ServletConfig config) throws ServletException {
System.out.println("Servlet_04.init()--2");
Enumeration enumeration = config.getInitParameterNames();
while(enumeration.hasMoreElements()){
String name = (String) enumeration.nextElement();
String value = config.getInitParameter(name);
System.out.println("name----------->"+name);
System.out.println("value----------- >"+value);
}
}
后台打印数据:
[java] view
plain copy
2013-8-31 15:59:36 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()
Servlet_04.init()--2
name----------->driver
value----------- >com.mysql.jdbc.driver
name----------->password
value----------- >root
name----------->user
value----------- >root
name----------->url
value----------- >jdbc:mysql://localhost:3306/data
2013-8-31 15:59:36 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2013-8-31 15:59:36 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2013-8-31 15:59:36 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/22 config=null
2013-8-31 15:59:36 org.apache.catalina.startup.Catalina start
信息: Server startup in 738 ms
从数据打印信息中来看,在servlet创建的时候,就会调用初始化的方法。
原因是在web.xml中配置了:
<load-on-startup>2</load-on-startup>
用途:
如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。
如果没有在servlet配置这个参数的话,在装载并创建servlet对象的时候是不会调用init方法的。
----------------------------------------------------------------------------------------------------------------------------------------------------
ServletContext:
官方文档定义: public abstract interface ServletContext Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file. There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog and possibly installed via a .war file.) In the case of a web application marked "distributed" in its deployment descriptor, there will be one context instance for each virtual machine. In this situation, the context cannot be used as a location to share global information (because the information won't be truly global). Use an external resource like a database instead. The ServletContext object is contained within the ServletConfig object, which the Web server provides the servlet when the servlet is initialized. 安装在一个服务器中的一个特定URL名字空间(比如,/myapplication)下的所有Servlet,JSP,JavaBean等Web部件的集合构成了一个Web的应用,每一个Web应用(同一JVM),容器都会有一个背景对象,而javax.servlet.ServletContext接口就提供了访问这个背景对象的途径。 也就是说在整个web应用中,只有一个ServletContext,WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。 1.获取ServletContext实例: //1.第一种方式 ServletContext servletContext_01 = this.getServletContext(); //2.第二种方式 ServletContext servletContext_02 = this.getServletConfig().getServletContext(); 2.利用ServletContext实现数据共享: 在Servlet_03中: //往servletContext对象中设置数据 ServletContext servletContext = config.getServletContext(); servletContext.setAttribute("name", "共享数据---》"); 在Servlet_04中: //从servletContext对象中获取数据 ServletContext servletContext = getServletConfig().getServletContext(); System.out.println("value------------>"+servletContext.getAttribute("name"));
3.在web.xml中配置初始化信息。 <!-- context的配置信息 --> <context-param> <param-name>name_param1</param-name> <param-value>value_param1</param-value> </context-param> <context-param> <param-name>name_param2</param-name> <param-value>value_param2</param-value> </context-param> 获取初始化参数 ServletContext context = this.getServletContext(); Enumeration enumeration = context.getInitParameterNames(); while(enumeration.hasMoreElements()){ String name = (String) enumeration.nextElement(); String value = (String) context.getInitParameter(name); System.out.println("name-------------->"+name); System.out.println("value----------------->"+value.toString()); } 控制台打印数据: name-------------->name_param2 value----------------->value_param2 name-------------->name_param1 value----------------->value_param1 4.实现servlet的转发 //4.实现servlet的转发。 ServletContext context = this.getServletContext(); //在request设置参数,然后在jsp界面中获取。 req.setAttribute("name", "value"); RequestDispatcher requestDispatcher = context.getRequestDispatcher("/index.jsp"); requestDispatcher.forward(req,resp); 在jsp界面获取的数据: <% String value = (String)request.getAttribute("name"); System.out.println("value-------------->"+value); %>
5.读取资源的配置文件。 ServletContext context = this.getServletContext(); InputStream inputStream = context.getResourceAsStream("/db.properties"); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] by = new byte[1024]; int len = 0; while((len = inputStream.read(by))!= -1){ outStream.write(by, 0, len); } String content = new String(outStream.toByteArray()); System.out.println("content------------->"+content); outStream.close(); inputStream.close();
相关文章推荐
- java_web学习第二天(ServletConfig和ServletContext对象的作用和使用)
- JavaWeb学习笔记----Servlet的ServletConfig对象和ServletContext对象的使用
- Servlet概述以及ServletConfig 和ServletContext对象的作用
- ServletContext对象(4)、web项目中路径使用、ServletConfig,ServletContext方法总结
- 黑马程序员-Servlet的细节、ServletConfig对象、ServletContext对象及ServletContext应用
- Servlet知识详解(一)ServletContext对象 和 ServletConfig对象学习笔记
- javaweb-day05-5&6&7(Servlet - ServletConfig对象 和 ServletContext对象)
- ServletConfig与ServletContext对象详解
- ServletConfig对象与ServletContext区别
- JavaWeb开发之Servlet中的线程问题及使用ServletConfig对象操作Servlet中的参数
- ServletConfig与ServletContext对象详解
- JavaWeb学习笔记(7)——ServletConfig和ServletContext对象
- Servlet技术中的对象-ServletConfig与ServletContext
- servlet映射,线程安全,servletconfig对象,servletcontext对象
- mvc-servlet---ServletConfig与ServletContext对象详解(转载)
- ServletConfig对象与ServletContext
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
- 【ServletConfig、ServletContext】使用ServletContext、类加载器读取资源文件
- 内置对象config的使用,使用web.xml配置一个servlet对象,并为它取一个名字。
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法