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);

    }

}

 

posted @ 2019-08-13 14:23  三十六烦恼风x  阅读(139)  评论(0编辑  收藏  举报