Servlet学习笔记(五):ServletConfig和ServletContext详解
来源:互联网 发布:小额贷款app源码 编辑:程序博客网 时间:2024/05/22 14:31
一、ServletConfig 对象及其使用
1、补充:Context和ContextPath : 一个Web工程,如名为JavaWeb,访问的路径为http://localhost:8080/JavaWeb,这整个web应用就成为一个Context,路径/JavaWeb被称为上下文路径(ContextPath )。request.getContextPath ()可以获取。
2、ServletConfig: 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init()方法时,将ServletConfig 对象传递给servlet。进而,通过ServletConfig对象就可以得到当前servlet的初始化参数。
1)初始化参数配置在<init-param>标签中,如:
<servlet> <servlet-name>ServletConfigServlet</servlet-name> <servlet-class>servlet.base.ServletConfigServlet</servlet-class> <init-param> <param-name>userName</param-name> <param-value>SAM-SHO</param-value> </init-param> </servlet>
2)服务器会自动封装在ServletConfig中,我们利用init()或者init(ServletConfig config)方法,可以只获取一次ServletConfig对象,然后通过其getInitParameter()方法,获取配置好的参数。ServletConfig对象也可以直接通过父类GenericServlet封装好的getServletConfig()方法获取或直接通过父类封装的getInitParameter()直接获取。
@Overridepublic void init(ServletConfig config) throws ServletException {// 如果重写父类带参数的init()方法,这句一定写。// 不然拿不到ServletConfig 对象,空指针。// 原因在于,父类中代参的init()实现的时候,先this.config = config;然后调用无参this.init();super.init(config);String userName = config.getInitParameter("userName");String userName2 = this.getInitParameter("userName");String userName3 = this.getServletConfig().getInitParameter("userName");logger.debug("初始化参数1: "+userName+" | "+"初始化参数2: "+userName2+" | 初始化参数3: "+userName3);}@Overridepublic void init() throws ServletException {String userName2 = this.getInitParameter("userName");String userName3 = this.getServletConfig().getInitParameter("userName");logger.debug("初始化参数4: "+userName2+" | 初始化参数5: "+userName3);}
3)注意点:如果重写父类带参数的init()方法,这句一定写,super.init(config),不然拿不到ServletConfig 对象,空指针。原因在于,父类中代参的init()实现的时候,先this.config = config;然后调用无参this.init()。其实你复写两个init()方法后,输出的顺序也解释了这一点。推荐使用不带参数的init()方法。父类代码以及上例输出如下:
public void init(ServletConfig config) throws ServletException {this.config = config;this.init(); }【输出】[JavaWeb] [2014-09-29 20:04:02,162] [DEBUG] [ServletConfigServlet:56] - 初始化参数4: SAM-SHO | 初始化参数5: SAM-SHO[JavaWeb] [2014-09-29 20:04:02,169] [DEBUG] [ServletConfigServlet:45] - 初始化参数1: SAM-SHO | 初始化参数2: SAM-SHO | 初始化参数3: SAM-SHO4)通过getInitParameterNames(),可以获取枚举类型的所有初始化参数。
5)实际项目中,参数放在xml与properites文件中更灵活,写程序获取即可。
二、ServletContext对象及其使用
1、简介:
1)生命周期:Web容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用。ServletContext对象只在Web应用被关闭时才被销毁;不同的Web应用,ServletContext各自独立存在。
2)获取:SevletConfig 对象中维护了 ServletContext 对象的引用,通过 SevletConfig.getServletContext()方法获取ServletContext 对象。或者直接调用封装好的getServletContext ()方法即可获取。
3)作用:由于一个Web应用中的所有 Servlet 共享同一个ServletContext 对象,因此 Servlet 对象之间可以通过ServletContext 对象来实现通讯。 ServletContext 对象通常也对称之为context 域对象。
2、应用:
1)获取上下文参数。context-param 标签配置得参数是供web应用共享的,所有的servlet都可以访问。
<!--上下文参数--><context-param><param-name>B</param-name><param-value>2</param-value></context-param>
// 知识点二:获取上下文参数,上下文参数是给所有Servlet使用的String userName = servletContext.getInitParameter("userName");logger.debug("获取上下文参数: " + userName);
2)利用ServletContext,实现 Servlet 对象之间通讯。 主要是4个有关 Attribute 的方法:setAttribute()、getAttribute()、removeAttribute()、getAttributeNames()。
// 所有servlet实现通信servletContext.setAttribute("new_userName", userName);String new_userName = (String) servletContext.getAttribute("new_userName");logger.debug("所有servlet实现通信: " + new_userName);servletContext.removeAttribute("new_userName");servletContext.getAttributeNames();
/** * 抽出的方法,固定写法 * @param in * @throws IOException */private void getProperites(InputStream in) throws IOException {Properties props = new Properties();props.load(in);String url = props.getProperty("url");String username = props.getProperty("username");String password = props.getProperty("password");logger.debug(url);logger.debug(username);logger.debug(password);}
A、getResource() :获取资源文件的URL后,直接通过openStream()得到流。
// 1-利用 getResource 得到URL ,然后直接 构建IO流URL url = servletContext.getResource("/WEB-INF/classes/jdbc.properties");//得到URLInputStream in_url = url.openStream();//直接得到流getProperites(in_url);//获取资源文件
解释:"/WEB-INF/classes/jdbc.properties": 以“/”开头,代表web工程 部署好以后的配置文件的地址,src其实就是/WEB-INF的classes文件夹。
B、利用 getResourceAsStream() 获取配置文件。——最常用。
// 2-1 利用 getResourceAsStream 获取配置文件// 以“/”开头,代表web工程 部署好以后的配置文件的地址,src其实就是/WEB-INF的classes文件夹InputStream in = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");this.getProperites(in);
C、getRealPath() 得到资源文件的绝对路径。利用文件流,获取资源文件。
注意,不能使用传统的相对路径获取资源文件。
如:FileInputStream fileIn = new FileInputStream("/classes/jdbc.properties");因为相对的是Java虚拟机的路径,即这边是tomcat的bin/start.bat所在的文件夹,这样肯定找不到资源文件。可以再toncat的bin下新classes/jdbc.properties,试验看看。
<span style="font-size: 18px;">// 2-2 getRealPath 得到资源文件的绝对路径// 这种方式可以获取文件的名称,可以用于下载文件得开发。String realPath = servletContext.getRealPath("/WEB-INF/classes/jdbc.properties");logger.debug("资源文件的绝对路径 : " + realPath);// 在web项目中不能直接使用传统相对路径访问文件,如// FileInputStream fileIn = new FileInputStream("/classes/jdbc.properties");// 因为相对的是Java虚拟机的路径,即这边是tomcat的bin/start.bat所在的文件夹,这样肯定找不到资源文件。http://// 可以再toncat的bin下新建classes/jdbc.properties,试验看看FileInputStream fileIn = new FileInputStream(realPath);this.getProperites(fileIn);</span>
D、地址的写法。地址给谁用的。如果是给服务器用的,以"/"代表当前web应用; 如果是给浏览器用的,代表网址。
/* * 原则:地址给谁用的。如果是给服务器用的,以"/"代表当前web应用; 如果是给浏览器用的,代表网址。 *///转发 -服务器使用,"/"是当前web应用request.getRequestDispatcher("/my.jsp").forward(request, response);//重定向-浏览器使用,增加上下文路径response.sendRedirect("/JavaWeb/my.jsp");//获取资源-getRealPath。this.getServletContext().getRealPath("/my.jsp");//获取资源-getResourceAsStreamthis.getServletContext().getResourceAsStream("/my.jsp");//页面地址的-浏览器使用//<form action="/JavaWeb/my.jsp">
4)利用ClassLoader获取资源文件。在《java进阶(六):Java类加载器》中已经有涉及到。这边作补充。
A、getResourceAsStream() 。利用classLoader获取资源文件 不能以'/'打头
// 3-1 利用classLoader获取资源文件 不能以'/'打头// 新建一个与src同级别的source文件夹comfig,里面存放 jdbc.properties文件InputStream is = this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");this.getProperites(is);// 3-1-1 变化的 classLoader获取资源文件 ,项目中常用。 ClassLoader loader = Thread.currentThread().getContextClassLoader(); InputStream resourceAsStream = loader.getResourceAsStream("jdbc.properties"); this.getProperites(resourceAsStream);B、getResource():得到绝对路径,然后获取配置文件。
// 3-2 利用类加载器读取配置文件,不能实时的获取最新的配置文件信息。类加载器加载过的类,就不会再加载// getResource()返回的是URL,然后getPath()再获取绝对路径,这样就可以获取更新后的数据URL classUrl = this.getClass().getClassLoader().getResource("jdbc.properties");String path = classUrl.getPath();logger.debug("利用getResource() 获取配置文件的路径: "+path);this.getProperites(new FileInputStream(path));
- Servlet学习笔记(五):ServletConfig和ServletContext详解
- Servlet知识详解(一)ServletContext对象 和 ServletConfig对象学习笔记
- (五)Servlet就是这样-ServletConfig和ServletContext对象
- Servlet中的ServletContext和ServletConfig详解
- 【Servlet】ServletConfig和ServletContext
- Servlet、ServletConfig和ServletContext
- ServletConfig和ServletContext详解
- JavaWeb学习笔记:ServletConfig()和ServletContext()
- servlet-01 servletConfig和servletContext
- Servlet之ServletConfig和ServletContext
- Servlet技术浅析(五)之-----ServletConfig接口和ServletContext接口
- 学习笔记(二)HttpServlet、ServletContext、ServletConfig
- JavaWeb学习笔记----Servlet的ServletConfig对象和ServletContext对象的使用
- ---servlet(二)ServletConfig,ServletContext
- Servlet的学习(二)-ServletConfig对象和ServletContext对象
- Servlet路径、ServletConfig、ServletContext和乱码问题(转载)
- Jsp/Servlet 读书笔记(三) -- ServletConfig和ServletContext
- Servlet获取配置信息(ServletConfig)和ServletContext
- 使用SQLiteOpenHelper需要注意的问题
- JVM GC调优一则--增大Eden Space提高性能
- PS抠图
- 在论OC中foundation框架(上)
- 在git 中修改之前的提交内容
- Servlet学习笔记(五):ServletConfig和ServletContext详解
- Mahout in action读书笔记&Mahout学习笔记
- CRC16 - CRC64 的碰撞测试
- 世界是数字的重点读书笔记(计算机科普知识)
- PackageManager后台静默安装
- 【笔记】放球模型
- 《c++ primer》第二章学习笔记
- POJ 2828 Buy Tickets
- 小白马卫士项目总结之手机防盗