[Java][Web]ServletContext 方法的应用
Posted 秤心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java][Web]ServletContext 方法的应用相关的知识,希望对你有一定的参考价值。
由于一个 Web 应用中的所有 Servlet 共享同一个 ServletContext 对象,所以多个 Servlet 通过 ServletContext 对象实现数据共享。
ServletContext 对象通常也被称之为 context 域对象。(还有 request session page)
String data = "aaaa123"; this.getServletContext().setAttribute("data", data);
String value = (String) this.getServletContext().getAttribute("data"); response.getOutputStream().write(("data:" + value).getBytes());
这两个放在两个 ServletDemo 类中时,在不同浏览器的不同页面都可以访问到 ServletContext 的值。
// 读取 WebRoot\WEB-INF\web.xml 中的属性值 String value = this.getServletContext().getInitParameter("data1"); response.getOutputStream().write(value.getBytes());
<servlet> <servlet-name>ServletDemo5</servlet-name> <servlet-class>cn.itcast.ServletDemo5</servlet-class> <init-param> <param-name>data1</param-name> <param-value>x1x2x3</param-value> </init-param> </servlet>
以下代码实现了 Servlet 的转发: ( 1.jsp 位于 WebRoot\1.jsp ),但因为 ServletContext 是所有用户共用的域,因此此处使用并不合适。
String data = "aaa5"; // 把数据带给 1.jsp 不能通过 ServletContext 域,而要通过 request 域。 this.getServletContext().setAttribute("data", data); RequestDispatcher rDispatcher = this.getServletContext() .getRequestDispatcher("/1.jsp"); rDispatcher.forward(request, response);
<div style="border:1px solid red;"> <% String data = (String) application.getAttribute("data"); out.write(data); %> </div>
以下代码用于读取 src 目录下的 db.properties 配置文件中的键值
// 资源文件在源代码中放在 src 目录下,但发布后会出现在 WEB-INF\classes 目录下。 InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties properties = new Properties(); properties.load(inputStream); String urlString = properties.getProperty("url"); String username = properties.getProperty("username"); String password = properties.getProperty("password"); response.getOutputStream().write(("url:" + urlString).getBytes()); response.getOutputStream().write(("\r\nusername:" + username).getBytes()); response.getOutputStream().write(("\r\npassword" + password).getBytes());
如果配置文件放在包下,路径会在 /WEB-INF/classes/cn/itcast/ 目录下
如果配置文件在 WebRoot 目录下,路径会成为 /db.properties
如果要使用 FileInputStream 来读取资源文件,可使用以下代码取得文件真实路径:
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
如果是 java 类等,不是 Servlet 的类来读资源文件,则使用以下代码
InputStream inputStream = UserDao.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(inputStream);
然后因为只需应用启动时读取一次,所以通常写成以下代码来使用:
private static Properties dbconfig = new Properties(); static { try { InputStream inputStream = UserDao.class.getClassLoader() .getResourceAsStream("db.properties"); dbconfig.load(inputStream); } catch (Exception e) { throw new ExceptionInInitializerError(e); } } // 如果读取资源文件的程序不是 Servlet 的话,就只能通过类装载器来读取 public void update() throws IOException { System.out.println(dbconfig.getProperty("url")); }
这样的代码发布后,修改配置文件需要重启应用,可以使用以下方法改进:
InputStream inputStream = UserDao.class.getClassLoader().getResourceAsStream("db.properties"); // 按上面代码加载的配置文件 修改后仍读到原来的值 String path = UserDao.class.getClassLoader().getResource("db.properties").getPath(); FileInputStream inputStream = new FileInputStream(path);
不使用第一句代码,而使用后面的代码即可。
以上是关于[Java][Web]ServletContext 方法的应用的主要内容,如果未能解决你的问题,请参考以下文章
Web后端学习之——Java ServletContext 详解
java.lang.NoClassDefFoundError: javax/servlet/ServletContext
Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议