javaWEB总结(4):ServletContext对象方法
前言:之前每次学到ServletContext对象都会抗拒,跳着学,后面才发现有很多不懂的原理都在这个对象里面,后悔莫及,所以今天特地把他单放在一篇文章里,算是对他的忏悔。
1.什么是ServletContext对象?如何获取?
(1)ServletContext对象代表当前WEB应用,可以说是当前WEB应用的大管家,可以从中获取当前WEB应用的各个方面信息。
(2)ServletContext对象可由ServletConfig的getServletContext方法获取。
2.ServletContext的API
方法很多,只介绍比较重要的几个方法
3.项目结构
比之前多了两个测试文件(用来测试,只要名称对应就可以)
4.HelloServlet.java
package com.dao.chu; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * * Title: HelloServlet Description:实现Servlet接口的类 </p> */ public class HelloServlet implements Servlet { //在控制台打印中,用来分割ServletContext对象方法 private final static String notic ="=========================ServletContext对象方法==================================="; //在控制台打印中,用来分割HelloServlet类 private final static String helloServlet ="=========================helloServlet类==================================="; @Override public void destroy() { System.out.println("destroy..."); } @Override public ServletConfig getServletConfig() { System.out.println("getServletConfig..."); return null; } @Override public String getServletInfo() { System.out.println("getServletInfo..."); return null; } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init..."); // 获取参数名为user的参数值 String userValue = servletConfig.getInitParameter("user"); System.out.println("userValue is " + userValue); // 获取参数名为password的参数值 String passwordValue = servletConfig.getInitParameter("password"); System.out.println("passwordValue is " + passwordValue); // 获取servlet节点配置的所有初始化参数名组成的Enumeration Enumeration<String> parameterNames = servletConfig .getInitParameterNames(); // 循环 while (parameterNames.hasMoreElements()) { String name = (String) parameterNames.nextElement(); // 打印所有循环出来的参数名 System.out.println("name is " + name); // 用参数名来获取所有的参数值,并打印出来 String value = servletConfig.getInitParameter(name); System.out.println("value is " + value); } /* 获取配置的servlet名称 */ String servletName = servletConfig.getServletName(); System.out.println("servletName: " + servletName); //=========================ServletContext对象方法=================================// System.out.println(notic); //获取ServletContext对象 ServletContext servletContext = servletConfig.getServletContext(); // 获取参数名为driver的参数值并打印 String driverValue = servletContext.getInitParameter("driver"); System.out.println("driverValue is "+driverValue); // 获取context节点配置的所有初始化参数名组成的Enumeration Enumeration<String> contextNames = servletContext.getInitParameterNames(); while (contextNames.hasMoreElements()) { String contextParamName = (String) contextNames.nextElement(); // 打印所有循环出来的参数名 System.out.println("contextParamName is "+contextParamName); // 用参数名来获取所有的参数值,并打印出来 String contextParamValue = servletContext.getInitParameter(contextParamName); System.out.println("contextParamValue is "+contextParamValue); } //获取文件在服务器部署的绝对路径 String realPath = servletContext.getRealPath("/note.txt"); System.out.println("realPath is "+realPath); //获取当前web应用的跟路径 String contextPath = servletContext.getContextPath(); System.out.println("contextPath is "+contextPath); //通过ClassLoader得到输入流 InputStream is1; try { ClassLoader loader = getClass().getClassLoader(); is1 = loader.getResourceAsStream("jdbc.properties"); System.out.println("is1 is "+is1); } catch (Exception e) { e.printStackTrace(); } //通过servletContext的getResourceAsStream得到输入流 try { InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties"); System.out.println("is2 is "+is2); } catch (Exception e) { e.printStackTrace(); } } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("service..."); } public HelloServlet() { //控制台加分隔符 System.out.println(helloServlet); System.out.println("HelloServlet's constructor.."); } }
5.SecondHelloServlet.java
package com.dao.chu; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * * Title: HelloServlet * Description:第二个实现Servlet接口的类 * </p> */ public class SecondHelloServlet implements Servlet{ //在控制台打印中,用来分割SecondHelloServlet类 private final static String secondHelloServlet ="=========================secondHelloServlet类==================================="; @Override public void destroy() { System.out.println("second destroy.."); } @Override public ServletConfig getServletConfig() { System.out.println("second getServletConfig.."); return null; } @Override public String getServletInfo() { System.out.println("second getServletInfo.."); return null; } @Override public void init(ServletConfig arg0) throws ServletException { System.out.println("second init.."); } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("second service.."); } public SecondHelloServlet(){ //控制台加分隔符 System.out.println(secondHelloServlet); System.out.println("SecondHelloServlet's constructor.."); } }
6.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 配置当前WEB应用的初始化参数 --> <context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param> <context-param> <param-name>jdbcUrl</param-name> <param-value>jdbc:mysql://daochuwenziyao</param-value> </context-param> <!-- 配置和映射servlet --> <!-- helloServlet --> <servlet> <!-- servlet注册的名字 --> <servlet-name>helloServlet</servlet-name> <!-- servlet的全类名 --> <servlet-class>com.dao.chu.HelloServlet</servlet-class> <!-- 配置servlet的初始化参数 ,要放在load-on-startup节点 前面--> <init-param> <!-- 参数名 --> <param-name>user</param-name> <!-- 参数值 --> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123456</param-value> </init-param> <!-- load-on-startup节点 --> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <!-- 需要和某一个servlet子节点的servlet-name 子节点的文本节点一致 --> <servlet-name>helloServlet</servlet-name> <!-- 映射的具体访问路径:/代表当前WEB应用的根目录 --> <url-pattern>/hello</url-pattern> </servlet-mapping> <!-- secondHelloServlet --> <servlet> <!-- servlet注册的名字 --> <servlet-name>secondHelloServlet</servlet-name> <!-- servlet的全类名 --> <servlet-class>com.dao.chu.SecondHelloServlet</servlet-class> <!-- load-on-startup节点 --> <load-on-startup>1</load-on-startup> </servlet> </web-app>
我们只需看“ServletContext对象方法”中的输出即可
8.总结:
在ServletContext中有以下几个重要的方法:
(1)初始化变量方法getInitParameter和getInitParameterNames:ServletConfig和ServletContext对象都有初始化参数的方法,方法相同但是领域不同。ServletConfig为局部初始化参数,只能在当前配置的servlet中获取,而ServletContext为全局初始化参数,只要在当前web应用中就可以获取;
(2)getRealPath方法:获取文件在服务器部署的绝对路径;
(3)getContextPath方法:获取当前web应用的跟路径,后面会经常用到;
(4)getResourceAsStream方法,获取输入流,与通过ClassLoader得到输入流不同的是传递的参数为服务器部署的绝对路径。
附:
本次示例代码:点击打开链接
为了尊重原作者,下面粘贴佟刚老师视频的地址: