接上一篇。

2.3.4 利用ServletContext对象读取资源文件

比如我们要读取web项目中的配置文件。

项目目录结构如下:

使用ServletContext对象读取资源文件的示例代码如下:

package MyServletDemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletContextDemo6 extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8");
response.setHeader("content-type","text/html;charset=UTF-8");
//读取src目录下的properties配置文件
readSrcDirPropCfgFile(response);
response.getWriter().println("<hr/>");
//readWebRootDirPropCfgFile(response);//读取WebRoot目录下的properties配置文件
response.getWriter().println("<hr/>");
readPropCfgFile(response);//读取src目录下的db.config包中的db3.properties配置文件
response.getWriter().println("<hr/>");
readPropCfgFile2(response);//读取src目录下的gacl.servlet.study包中的db4.properties配置文件
}
private void readPropCfgFile2(HttpServletResponse response)
throws IOException {
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/MyServletDemo/db3.properties");
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");
response.getWriter().println("读取src目录下的MyServletDemo包中的db4.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
} private void readPropCfgFile(HttpServletResponse response)
throws FileNotFoundException, IOException {
//通过ServletContext获取web资源的绝对路径
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db2.properties");
InputStream in = new FileInputStream(path);
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");
response.getWriter().println("读取src目录下的db.config包中的db3.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
}
private void readSrcDirPropCfgFile(HttpServletResponse response) throws IOException {
/**
* 通过ServletContext对象读取src目录下的db1.properties配置文件
*/
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");
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");
response.getWriter().println("读取src目录下的db1.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

上面的代码中,src目录都换成了WEB-INF/classes。这是因为当我们将项目以war的方式发布到tomcat上的时候,启动tomcat,tamcat会自动解压war包项目,之后我们在src目录下面所有的Java文件会编译成class字节码文件,然后存放到WEB-INF/classes目录,如果有其他文件也会相对于src的目录等级存放到相对于WEB-INF/classes相同目录等级下。所以src要替换成WEB-INF/classes。

void setContentType(String type)  设置发送到客户端的响应的内容类型,例如字符编码规范,text/html;charset=UTF-8。

setHeader(String name, String value)  设置具有给定名称和值的响应头。

运行之前还是在web.xml中进行servlet的配置。运行后输出结果:

2.3.5 使用类装载器读取资源文件

资源文件可以通过类加载器的方式加载到内存中,这种方式的好处是程序不用明确制定配置文件的具体所在目录。程序可以自动的在src目录下搜索该文件,并加载。即类加载器只能加载src目录下的资源文件,其它目录无法加载 ,此时/表示:/WEB-INF/classes/目录 。但是这种方法有一个弊端,通过类加载器加载进来的配置文件不能太大,否则会导致JVM内存溢出。 还有,类加载器加载类,类只加载一次,所以当该类被加载进内存后,如果此时有人修改了配置文件里面的配置信息,当再次访问该类时,得到的配置信息并没有改变,还是原来的,如果我们要得到更新后的配置信息就不能够用这种方法来加载配置信息。

使用类装载器读取资源文件的示例代码如下:

package MyServletDemo;

import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ServletContextDemo7 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("content-type","text/html;charset=UTF-8");
test1(response);
response.getWriter().println("<hr/>");
test2(response);
response.getWriter().println("<hr/>");
} /**
* 读取类路径下的资源文件
* @param response
* @throws IOException
*/
private void test1(HttpServletResponse response) throws IOException {
//获取到装载当前类的类装载器
ClassLoader loader = ServletContextDemo7.class.getClassLoader();
//用类装载器读取src目录下的db1.properties配置文件
InputStream in = loader.getResourceAsStream("db1.properties");
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");
response.getWriter().println("用类装载器读取src目录下的db1.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
} private void test2(HttpServletResponse response) throws IOException {
//获取到装载当前类的类装载器
ClassLoader loader = ServletContextDemo7.class.getClassLoader();
//用类装载器读取src目录下的gacl.servlet.study包中的db4.properties配置文件
InputStream in = loader.getResourceAsStream("MyServletDemo/db3.properties");
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");
response.getWriter().println("用类装载器读取src目录下的gacl.servlet.study包中的db4.properties配置文件:");
response.getWriter().println(
MessageFormat.format(
"driver={0},url={1},username={2},password={3}",
driver,url, username, password));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response);
}
}

在web.xml中配置servlet,运行后输出:

3. 在客户端缓存servlet的输出

对于不经常变化的数据,在servlet中可以为其设置合理的缓存时间值,以避免浏览器频繁向服务器发送请求,提升服务器的性能。

package MyServletDemo;

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 { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "23623276172";
/**
* 设置数据合理的缓存时间值,以避免浏览器频繁向服务器发送请求,提升服务器的性能
* 这里是将数据的缓存时间设置为1天
*/
response.setDateHeader("expires",System.currentTimeMillis() + 24 * 3600 * 1000);
response.getOutputStream().write(data.getBytes());
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response);
} }

wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

最新文章

  1. 理解insert all/insert first的使用
  2. Python之路-python(装饰器、生成器、迭代器、Json &amp; pickle 数据序列化、软件目录结构规范)
  3. JAVA -Xms -Xmx -XX:PermSize -XX:MaxPermSize 区别
  4. 使用IIS Express
  5. undo日志
  6. 【转】Android bluetooth介绍(二): android blueZ蓝牙代码架构及其uart 到rfcomm流程
  7. 腾讯QQ:异地登陆也被封号,你们是怎么决策的???
  8. getHibernateTemplate()
  9. 大数据 --&gt; MapReduce原理与设计思想
  10. Android Multimedia框架总结(十七)音频开发基础知识
  11. js深拷贝
  12. struts2简单入门-执行流程
  13. servlet的运行机制,转发和重定向
  14. wpf小技巧——datagrid 滚动条问题
  15. mongodb创建用户(转发)
  16. tcp编程 示例
  17. PHP设计模式——訪问者模式
  18. PHP之语句
  19. Python模块学习 ---- logging 日志记录
  20. 读取txt文件,并用其他格式显示

热门文章

  1. 卸载jdk1.7
  2. JVM_垃圾收集器
  3. [Maven实战-许晓斌]-[第二章]-2.2基于UNIX系统安装maven
  4. Objective-C中的meta-class
  5. Layout2:StackPanel(补交作业)
  6. c++ Initialization
  7. tomcat 搭建以及发布配置
  8. Navicat 导出sql文件和导入sql文件
  9. DEM反应添加顺序注意问题
  10. 51nod1238. 最小公倍数之和 V3(数论)