Servlet共享配置信息
数据库的配置信息一般是有多个Servlet共享的,那么在这种情况下,上一份笔记中的方法已经不再适合了。我们需要一个更好的解决方案,那就是ServletContext对象。
<context-param>
<param-name>GlobalData</param-name>
<param-value>GlobalValue</param-value>
</context-param>
Servlet容器在启动时时会给每一个Servlet应用创建一个ServletContext对象,这个ServletContext对象是唯一的,并且代表了对应的web应用。这样,所有在同一个web应用中的Servlet访问的都是同一个ServletContext对象。在结构上,<context-param>标签和<servlet>标签同级,多个信息配置在不同的<context-param>中。
ServletContext ctx = this.getServletContext();
ctx.getInitParameter("name1");
以上方法都是建立在配置信息已知的前提下,如果我们想要共享的信息是动态的呢?
ServletContext ctx = this.getServletContext();
ctx.setAttribute("GlobalData1", "GlobalValue1");
(String)ctx.getAttribute("GlobalData1");
ctx.removeAttribute("GlobalData1");
注意访问Servlet的先后顺序。
如果我们想要读取的配置信息并不是保存在应用信息中,而是想要读取一个外部的配置信息,就需要使用其他的接口了。
ServletContext ctx = this.getServletContext();
//通过getResource的方法获取
try{
URL url = ctx.getResource("/WEB-INF/classes/log4j.properties");//返回一个url对象
InputStream in = url.openStream();
String propertyValue = GeneralUtil.getPropery(key, in);
System.out.println(propertyValue);
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
//通过getResourceAsStream的方法获取
InputStream in2 = ctx. getResourceAsSteam("/WEB-INF/classes/log4j.properties");
String p2 = GeneralUtil.getPropery(key, in2);
System.out.println(p2);
//通过getRealPath的方法获取,返回外部资源文件的绝对路径
String path = ctx.getRealPath("/WEB-INF/classes/log4j.properties");
File f = new File(path);
//转化为inputStream
InputStream in3 = new FileInputStream(f);
String p3 = GeneralUtil.getPropery(key, in3);
通过以上三个方法获取外部资源文件,结果都是相同的,只是过程不同而已。
而实际上,ServletContext不只是用来获取外部资源配置文件用的,它还可以实现Servlet转发,在以后的笔记中会详细说明。