JavaWeb学习总结(四)—ServletConfig和ServletContext
一、ServletConfig
1. ServletConfig介绍:#
ServletConfig是Servlet中的init()方法的参数类型,服务器会在调用init()方法时传递ServletConfig对象给init()方法。
ServletConfig对象封装了Servlet在web.xml中的配置信息,它对应<servlet>元素。ServletConfig类的功能有:
- String getServletName():获取Servlet配置名,即<servlet-name>的值;
- ServletContext getServletContext():获取ServletContext对象,这个对象稍后介绍
- String getInitParameter(String name):获取初始化参数
- Enumeration getInitParameterNames():获取所有初始化参数的名称
2. 在web.xml文件中,配置<servlet>时可以为<servlet>配置0~N个初始化参数,例如#
<servlet> <servlet-name>ServletContextDemo1</servlet-name> <servlet-class>com.web.study.ServletContextDemo1</servlet-class> <!-- 配置ServletConfigDemo1的初始化参数 --> <init-param> <param-name>name</param-name> <param-value>scott</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>tiger</param-value> </init-param> <init-param> <param-name>charset</param-name> <param-value>utf-8</param-value> </init-param> </servlet>
3. 通过ServletConfig获取当前Servlet的初始化参数#
package com.web.study; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.jmx.snmp.Enumerated; public class ServletContextDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig config = this.getServletConfig(); //获取指定的初始化参数 String p1 = config.getInitParameter("name"); response.getWriter().print(p1); response.getWriter().print("<hr/>");
//获取所有的初始化参数 Enumeration<String> e = config.getInitParameterNames(); while (e.hasMoreElements()){ String names = e.nextElement(); String value = config.getInitParameter(names); response.getWriter().print(names + "=" + value + "<br/>"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
运行输出:
二、ServletContext#
1.ServletContext简介:#
ServletContext是Servlet三大域对象之一,ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb应用只创建一个ServletContext对象,在HttpServlet中可以通过以下方法来获取ServletContext对象:
1. ServletContext sc = this.getServletContext()
2. ServletContext sc = this.getServletConfig().getServletContext()
2.ServletContext的应用#
1.读取web.xml中配置的应用初始化参数,注意这个读取的不是某一个Servlet的初始化参会数,而是全局的。#
<!-- 全局的初始化参数 --> <context-param> <param-name>p1</param-name> <param-value>v1</param-value> </context-param> <context-param> <param-name>p2</param-name> <param-value>v2</param-value> </context-param>
代码如下:
package com.web.study; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletContextDemo5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); //获取ServletContext ServletContext context = this.getServletContext(); //得到参数 String value1 = context.getInitParameter("p1"); response.getWriter().print(value1); } }
浏览器将会输出:v1.
2.多个Servlet实现数据共享。#
ServletContextDemo3往ServletContext中储存数据。
package com.web.study; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletContextDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); ServletContext context = this.getServletContext(); //将data存储到ServletContext对象中 context.setAttribute("scott", "tiger"); } }
ServletContextDemo3往ServletContext中读取数据。
package com.web.study; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletContextDemo4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); ServletContext context = this.getServletContext(); /* * 从ServletContext对象中取出数据 */ String name = (String) context.getAttribute("scott"); response.getWriter().print(name); } }
先访问ServletContextDemo3,再访问ServletContextDemo4,访问输出:
#
3.用servletContext实现请求转发#
利用ServletContextDemo6转发请求
package com.web.study; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; 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"); String data = "<h1><font color='red'>我是ServletContextDemo6</font></h1>"; response.getOutputStream().write(data.getBytes()); //获取ServletContext对象 ServletContext context = this.getServletContext(); //获取请求转发对象 RequestDispatcher rd = context.getRequestDispatcher("/ServletContextDemo7"); //调用forward方法实现请求转发 rd.forward(request, response); } }
ServletContextDemo7
package com.web.study; import java.io.IOException; import java.io.PrintWriter; 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.setContentType("text/html"); response.getOutputStream().write("我是servletDemo7".getBytes()); } }
结果如下:
ServletContextDemo6页面应该是:
4.利用ServletContext对象读取资源文件#
资源文件分部如下:
properties的内容:
type=oracle driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@192.168.0.90:1521:wluat username=jeedev password=jeedev
实现代码:
package com.web.study; 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; /** * 使用servletContext读取资源文件 */ public class ServletContextDemo8 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * response.setContentType("text/html;charset=UTF-8");目的是控制浏览器用UTF-8进行解码; * 这样就不会出现中文乱码了 */ response.setHeader("content-type","text/html;charset=UTF-8"); readSrcDirPropCfgFile(response);//读取src目录下的properties配置文件 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目录下的com.web.study包中的db4.properties配置文件 } /** * 读取src目录下的com.web.study包中的db4.properties配置文件 * @param response * @throws IOException */ private void readPropCfgFile2(HttpServletResponse response) throws IOException { InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/web/study/db4.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目录下的com.web.study包中的db4.properties配置文件:"); response.getWriter().println( MessageFormat.format( "driver={0},url={1},username={2},password={3}", driver,url, username, password)); } /** * 读取src目录下的db.config包中的db3.properties配置文件 * @param response * @throws FileNotFoundException * @throws IOException */ private void readPropCfgFile(HttpServletResponse response) throws FileNotFoundException, IOException { //通过ServletContext获取web资源的绝对路径“D:\Program\apache-tomcat-6.0.45\webapps\ServletDemo\WEB-INF\classes\db\config\db3.properties” String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db3.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)); } /** * 通过ServletContext对象读取WebRoot目录下的properties配置文件 * @param response * @throws IOException */ private void readWebRootDirPropCfgFile(HttpServletResponse response) throws IOException { /** * 通过ServletContext对象读取WebRoot目录下的properties配置文件 * “/”代表的是项目根目录 */ InputStream in = this.getServletContext().getResourceAsStream("/db2.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("读取WebRoot目录下的db2.properties配置文件:"); response.getWriter().print( MessageFormat.format( "driver={0},url={1},username={2},password={3}", driver,url, username, password)); } /** * 通过ServletContext对象读取src目录下的properties配置文件 * @param response * @throws IOException */ 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); } }
运行结果如下:
使用类装载器读取资源文件#
package com.web.study; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; 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 ServletcontextDemo9 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * response.setContentType("text/html;charset=UTF-8");目的是控制浏览器用UTF-8进行解码; * 这样就不会出现中文乱码了 */ 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)); } /** * 读取类路径下面、包下面的资源文件 * @param response * @throws IOException */ private void test2(HttpServletResponse response) throws IOException { //获取到装载当前类的类装载器 ClassLoader loader = ServletContextDemo7.class.getClassLoader(); //用类装载器读取src目录下的gacl.servlet.study包中的db4.properties配置文件 InputStream in = loader.getResourceAsStream("com/web/study/db4.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)); } /** * 通过类装载器读取资源文件的注意事项:不适合装载大文件,否则会导致jvm内存溢出 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
访问输出:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了