ServletContext对象
1.Web容器在启动时,他会为每个web应用程序都创建一个对应的ServletContext对象,所以ServletContext 就代表当前的web应用。用于数据共享
2,获取ServletContext对象
方式一:ServletConfig对象中维护类ServletContext对象的引用,所以可以通过ServletConfig.getServletContext方法获取ServletContext对象;
Servletcontext contest=this.GetServletConfig().getServletContext();
方式二:调用servlet的getServletContext方法得到其对象
ServletContext context =this.getServletContext();
3.ServletContext的生命周期:在服务器启动时,会分别为每一个web应用创建servletContext对象,servletContext对象会在的对应web应用被删除时和服务器停止时销毁。
4.ServletContext对象的常用方法:详见文档:
getAttribute(java.lang.String name)
getInitParameter(java.lang.String name)
removeAttribute(java.lang.String name)
setAttribute(java.lang.String name, java.lang.Object object)
getNamedDispatcher(java.lang.String name)
getRequestDispatcher(java.lang.String path)
5,ServletContext的功能:
①:由于一个WEB应用中所有的Servlet共享同一个ServletContext对象,所以对个Servlet通过ServletContext对象实现数据共享;ServletContext对象通常也被称之为context域对象
例:在一个Servlet1中的数据
String data ="abde";
SevletContext context = this.getServletContext();
context.setAttribute("data",data);
可以在Servlet2中得到
SevletContext context = this.getServletContext();
String value = context.getAttribute("data");
注意:servletContext域 代表什么呢:1.这是一个容器,
2.说明了这个容器的作用范围,也就是应用程序范围
②:获取web应用的初始化参数。
在整个web的配置文件中,可以使用一个或多个<context-param>标签为整个 web配置一些初始化信息;
例:
<web-app>
<context-param>
<param-name>data</param-name>
<param-value>xxxxx</param-value>
</context-param>
</web-app>
在servlet中获取初始化信息
//得到指定的初始化参数。
String value this.getServletContext().getInitParameter("data");
//获取所有的初始化信息
Enumeration e =this.getServletContext().getInitParameterNames();
while(e.hasMoreElements()){
String name = (String) e.nextElement();
//获取初始化信息
String v = this.getServletConfig().getInitParameter(name);
System.out.println(v);
}
③:实现servlet的转发
因为Servlet不适合数据输出,需要把数据转发给jsp输出
例:servlet中的data数据转发的1.jsp中输出
String data="abcde";
//把数据带给jsp ,要通过request域
//得到转发对象 RequestDispatcher
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("1.jsp");
//用forward方法转发
rd.forWard(request,response);
//在jsp中获取数据,并输出;
④:利用ServletContext对象读取资源文件
注意:Web开发中的配置文件有两种类型,.xml和.properties方法;当配置 信息之间有关系时,就用xml类型,没有关系时就用properties类型。
例:在Servlet中读取.properties资源文件
//db.properties文件内容
Url=jdbc:mysql://localhost:3306/test
User=aaa;
方式一:ServletContext 的getResourceAsStream方法读取
//在servlet中读取
ServletContext context = this.getServletContext();
//ServletContext 的getResourceAsStream("文件的相对路径")方法是 //将配置文件作为输入.
InputStream in=
context.getResourceAsStream("/WEB-INF/CLASSES/db.properties");
//用Properties 对象的load方法获取输入流中的键值对。
Properties prop=new Properties();
Prop.load(in);
//读取键对应的值。
String value1 = prop.getProperties("url");
String value2 = prop.getProperties("user");
注意:在读取资源文件时不可以用传统的inputStream流读取。最好用 ServletContext对象读取。
方式二:ServletContext的getRealPath方法读取
通过ServletContext的getRealPath方法是得到资源的绝对路径,再用传统的流读取资源文件。并且还可以得到当前的资源名称
//在servlet中读取
ServletContext context = this.getServletContext();
//得到绝对路径path
String path =
context.getRealPath("/WEB-INF/CLASSES/db.properties");
//用path得到当前文件名
String fileName = String.substring(path.lastIndexOf("\\")+1);
//用普通流读取
FileInputStream in = new FileInputStream(path);
//用Properties 对象的load方法获取输入流中的键值对。
Properties prop=new Properties();
Prop.load(in);
//读取键对应的值。
String value1 = prop.getProperties("url");
String value2 = prop.getProperties("user");
⑤:在web应用中的普通java文件怎样读取资源文件
在实际开发中,读取配置文件的操作不会在Servlet中进行(如连接数据库);以为要分层开发,所以会创建一个专门连接数据库的类(UserDao)。 在UserDao类中获取配置文件就不可以使用ServletContext对象获取了。就只能通过类加载器ClassLoader去读;
例:实际开发中的UserDao
public class UserDao {
//创建公用的Properties对象
private static Properties prop = new Properties();
//静态代码块
static{
try {
//得到类加载器
//注意:同一个web应用下类和文件使用是同一个类加载器
ClassLoader loader = UserDao.class.getClassLoader();
//getResourceAsStream方法,读取资源文件并用流返回
InputStream in =loader.getResourceAsStream("db.properties");
//将流读入Properties对象中
prop.load(in);
} catch (Exception e) {
throw new ExceptionInInitializerError(e); }
//修改
public void update(){
System.out.println(prop.getProperty("url"));
}
//添加
public void add(){
System.out.println(prop.getProperty("url"));
}
//查询
public void select(){
System.out.println(prop.getProperty("url"));
}
}
然后在Servlet中创建UserDao对象调用其增删改查的方法;
public class ServletDemo3 extends HttpServlet {
public void doGet
(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserDao dao=new UserDao();
dao.update();
}
public void doPost
(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
注意:1.使用类加载器,加载配置文件时,配置文件不能太大,因为是加载到内存中过大会导致内存溢出
2.当在配置文件被更改后,上述数的例的造作就读不到,更新后的配置文件。
就需要通过类加载的方式先得到资源文件的位置,再通过传统的方式读取资源文件,这样就可以读到更新后的数据
//得到类加载器
ClassLoader loader = UserDao.class.getClassLoader();
//通过getResource(资源名称)方法的的URL
Java.net.URL url=loader.getResource("db.properties");
//得到文件路径
String path = url.getPath();
FileInputStream in =new FileInputStream(path);
Properties prop = =new Properties();
prop.load(in);
System.out.println(prop.getProperty("url"));