一、ServletConfig。
在servlet配置文件中,可以使用多个<init-param>标签为servlet配置一些初始参数。而web容器在创建servlet实例对象时,会自动把初始化信息封装到ServletConfig对象中,并调用servlet的init()方法,并将ServletConfig对象传递给servlet。进而,我们可以通过ServletConfig对象得到servlet的初始化信息。
有些信息不适合在程序中写死,就可以放在配置文件中。比如数据库,编码表等。
二、ServletContext。
web容器在启动时,它会为每个web应用创建一个对应的ServletContext对象,它代表当前web应用。由于一个web应用中所有servlet对象共享一个ServletContext对象,所以多个servlet对象可以通过ServletContext对象实现数据共享。ServletContext对象也被称为context域对象(web开发四大域对象,page、request、session、context)。
在开发中,ServletContext通常用来:
(1)获取web应用的初始化参数
如此就为整个web应用配置了初始化参数,整个web应用的所有servlet都可以通过ServletContext对象得到初始化信息。比如上面提到的数据库信息,就可以在此配置,因为很多servlet都要用到数据库,而在所有servlet依依配置麻烦。
(2)实现servlet的转发
在web开发中,servlet通常只用来处理数据,而把数据显示交给jsp显示,这就会用到servlet转发。
当然此处数据存在context域中有问题,因为多个用户访问就会出现数据覆盖,在开发中应存在request域中,此处只为介绍其作用。
(3)利用ServletContext读取资源文件
资源文件有两种xml和properties,有关系数据用xml,没关系用properties。以存储数据库信息的properties为例。
在servlet配置文件中,可以使用多个<init-param>标签为servlet配置一些初始参数。而web容器在创建servlet实例对象时,会自动把初始化信息封装到ServletConfig对象中,并调用servlet的init()方法,并将ServletConfig对象传递给servlet。进而,我们可以通过ServletConfig对象得到servlet的初始化信息。
有些信息不适合在程序中写死,就可以放在配置文件中。比如数据库,编码表等。
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.netjava.config.ServletDemo1</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:2353/data</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>xxx</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>xxx</param-value>
</init-param>
</servlet>
//1.写法一
ServletConfig config=this.getServletConfig();
System.out.println(config.getInitParameter("charset"));//指定名称信息
Enumeration e1=config.getInitParameterNames();
while(e1.hasMoreElements()){//所有信息
String name=(String) e1.nextElement();
System.out.println(config.getInitParameter(name));
}
System.out.println("--------------------");
//2.写法二
System.out.println(this.getInitParameter("charset"));
Enumeration e2=this.getInitParameterNames();
while(e2.hasMoreElements()){
String name=(String) e2.nextElement();
System.out.println(this.getInitParameter(name));
}
二、ServletContext。
web容器在启动时,它会为每个web应用创建一个对应的ServletContext对象,它代表当前web应用。由于一个web应用中所有servlet对象共享一个ServletContext对象,所以多个servlet对象可以通过ServletContext对象实现数据共享。ServletContext对象也被称为context域对象(web开发四大域对象,page、request、session、context)。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo2 extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.
String data="xxx";
this.getServletContext().setAttribute("data", data);
//2.
String username="yyy";
this.getServletConfig().getServletContext().setAttribute("username", username);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo3 extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println((String)this.getServletContext().getAttribute("data"));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
在开发中,ServletContext通常用来:
(1)获取web应用的初始化参数
<context-param>
<param-name>data</param-name>
<param-value>xxx</param-value>
</context-param>
如此就为整个web应用配置了初始化参数,整个web应用的所有servlet都可以通过ServletContext对象得到初始化信息。比如上面提到的数据库信息,就可以在此配置,因为很多servlet都要用到数据库,而在所有servlet依依配置麻烦。
(2)实现servlet的转发
在web开发中,servlet通常只用来处理数据,而把数据显示交给jsp显示,这就会用到servlet转发。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//将数据交给1.jsp显示
String data="xxxx";
this.getServletContext().setAttribute("data", data);
this.getServletContext().getRequestDispatcher("/WEB-INF/1.jsp").forward(request, response);
}
当然此处数据存在context域中有问题,因为多个用户访问就会出现数据覆盖,在开发中应存在request域中,此处只为介绍其作用。
(3)利用ServletContext读取资源文件
资源文件有两种xml和properties,有关系数据用xml,没关系用properties。以存储数据库信息的properties为例。
url=jdbc:mysql://localhost:2343//data
username=root
password=root
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
InputStream ins=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties props=new Properties();
props.load(ins);
System.out.println(props.get("url"));
}