• 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);
    
        }
    
    }
  • 相关阅读:
    Java CompletableFuture:allOf等待所有异步线程任务结束
    多线程分批处理数据
    ListSplitUtil (批量数据处理)
    mysql性能优化相关
    JsonUtil
    批量数据数据处理
    多集合取交集公用方法
    ALSA:Linux下声卡编程
    word
    安卓使用自己导入的db3数据库文件
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11345659.html
Copyright © 2020-2023  润新知