11ServletConfig
1. ServletConfig
代表web.xml中当前servlet的初始化配置信息的对象。
在每一个servlet身上的注册servlet标签中都可以添加一些初始化配置信息参数,这些参数可以在访问时,通过ServletConfig获取。这样当请求当前servlet文件的一些配置信息就可以放置在servletConfig中,它与配置文件的区别在于 servletConfig作用于当前的Servlet,而配置文件可以在一个web应用中随意获取。
a. 功能一:获取初始化配置信息
i. 获取方式:
1) 重写init方法,获取ServletConfig对象。虽然可以得到,但是它是一个局部变量,如果要在全局操作,则需要将其转换为全局变量。并且若有多个servlet都需要获取初始化配置信息,多次重写init方法,十分不便。不推荐使用。他的加载配置信息只有服务器第一次创建servlet对象调用init方法时
//局部变量
@Override public void init(ServletConfig config) throws ServletException { this.config = config; String driver = config.getInitParameter("driver");
System.out.println("driver:"+driver); }
//全局变量
public class SConfigDemo1 extends HttpServlet { public ServletConfig config = null; @Override public void init(ServletConfig config) throws ServletException { this.config = config; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String d = config.getInitParameter("driver"); System.out.println("d:"+d); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
2) 通过当前对象调用getServletConfig()方法,可以直接获取一个ServletConfig对象,并且可以在任意的位置调用。
ii. 获取ServletConfig对象的api
this.getServletConfig()
iii. 获取初始化参数的api
this.getServletConfig().getInitParameter()
iv. 代码实现
创建SConfigDemo.java
//使用方法直接产生一个ServletConfig对象 public class SConfigDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig config = this.getServletConfig(); //因为getServletConfig方法是父类HTTpServlet所继承的抽象类GenericServlet中的方法,所以我们也可以继承下来用this对象调用 String driver = config.getInitParameter("driver"); //获取第二个初始化配置信息 String url = config.getInitParameter("url"); System.out.println("driver:"+driver+">>url:"+url); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
配置web.xml文件
<servlet> <servlet-name>SConfigDemo2</servlet-name> <servlet-class>cn.tedu.SConfig.SConfigDemo2</servlet-class> <init-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </init-param> <init-param> <param-name>url</param-name> <param-value>localhost:3306/mydb1</param-value> </init-param> </servlet>
v. 可以在每一个servlet身上添加多个初始化配置信息参数。通过来初始化参数名称,依次获取。
vi. 注意:每一个servlet只能获取当前servlet身上的初始化配置参数。其他的servlet无法获取。
b. 功能二--获取ServletContext对象
this.getServletConfig().getServletContext()
2. ServletContext对象
代表当前web应用的对象
若有多个Servlet同时需要同一份配置信息,可以把这些信息配置为一个全局的配置信息,这样web应用范围内的全部servlet都可以读取到。
a. 获取ServletContext对象
this.getServletConfig().getServletContext()
this.getServletContext()
b. 功能一:获取全局初始化配置信息
SerlvetContext.getInitParameter(String name)
i. 代码实现:
package cn.tedu.SContext; import java.io.IOException; 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 SContextDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取ServletContext对象 ServletContext sc = this.getServletConfig().getServletContext(); ServletContext sc1 = this.getServletContext(); //获取全局配置信息 // String name = sc.getInitParameter("name"); // System.out.println("name:"+name); String name = sc1.getInitParameter("name"); System.out.println("sc1:name:"+name); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
ii. 全局配置信息
<!-- 当前web应用的全局配置信息 --> <context-param> <param-name>name</param-name> <param-value>value</param-value> </context-param>
c. 功能二:作为域对象使用
i. 域对象:如果一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,那么这个对象就可以称之为域对象。
域对象的API:
iii. 生命周期
随着web应用的加载,ServletContext对象创建。
随着web应用的销毁,ServletContext对象销毁。
iv. 作用范围
整个web应用。
v. 主要功能
在整个web应用的范围内共享数据。
1) 代码实现
创建ServletContextDemo2.java
package cn.tedu.SContext; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //作为域对象使用--在web应用范围内共享数据 public class SContextDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取代表web应用的域对象 ServletContext sc = this.getServletContext(); //2.向域中设置域属性 sc.setAttribute("name", "曹洋"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
修改ServletContextDemo1:
package cn.tedu.SContext; import java.io.IOException; 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 SContextDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //读取web域属性 ServletContext sc = this.getServletContext(); String name = (String) sc.getAttribute("name"); System.out.println("name:"+name); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3. 功能三--获取资源路径
a. 相对路径
conf.properties
直接书写要获取的资源路径名称,再通过File读取,发现读取的路径结果,是tomcat启动的目录路径(tomcat/bin文件下的),这个路径是错误,所以在读取文件的时候,不能够直接书写某一个文件的相对路径。
b. 绝对路径
/conf.properties
使用绝对路径获取资源路径名称,再通过File读取,读取结果为盘符加上文件名称,从磁盘的根目录寻找对应路径的文件,这种文件读取路径也是错误的。所以在读取文件时,不能直接书写绝对路径。
c. 全路径
书写从盘符到文件的全路径名称,的确可以获取到指定路径的文件,但是如果路径稍作修改,获取存放文件的路径发生改变,则所有用到全路径的位置都需要修改,十分不便。所以尽管可以得到正确的路径,也不推荐使用。
d. ServletContext获取路径
可以获取到从盘符到web应用名称的全路径。在getRealPath()中添加上web应用内的文件相对路径,即可获取到当前文件的全路径名称。这种获取方式获取到的路径是正确的,并且也是动态获取的(如果路径修改,此处获取的路径也会跟着修改)。所以推荐使用这种形式。
e. 通过类加载器获取文件路径
使用类的字节码,获取类加载器,再获取src目录,最后读取目录中的某一个文件。这种读取方式可以获取到盘符到当前文件的全路径,而且是全部动态获取,可以便捷的得到文件路径。所以推荐使用这种方式来获取文件路径名称。
ServletContext.class.getClassLoader().getResource("fileName").getPath();
ServletContext.class.getClassLoader().getResource(“").getPath(); //获得的是src文件夹的路径
//资源路径问题 public class SContextDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //相对路径 // String path="/conf.properties";/ //绝对路径 // String path="/conf.properties"; //全路径 // String path="D:\\software\\apache-tomcat-7.0.62\\webapps\\day11\\WEB-INF\\classes\\conf.properties"; //类加载器读取src目录下的文件 // String path = SContextDemo3.class.getClassLoader().getResource("conf.properties").getPath();//获得的是src文件下的conf.properties配置文件 //当你想获取src下中 a文件中的b.txt String path = SContextDemo3.class.getClassLoader().getResource("").getPath().toString()+"\\a\\b.txt"; //ServletContext读取web应用路径 ServletContext sc = this.getServletContext(); //获取从盘符到当前web应用目录的路径。 String path = sc.getRealPath("\\WEB-INF\\classes\\conf.properties"); File file = new File(path); //获取所读取文件的全路径名称 String aPath = file.getAbsolutePath(); System.out.println("aPath:"+aPath); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }