zoukankan      html  css  js  c++  java
  • ServlertContext

    1、ServletContext代表着整个JavaWeb应用,每个项目只有唯一的ServletContext的实例。

    2、生命周期

      服务器启动时创建

      服务器关闭时销毁

    3、获取ServletContext对象:ServletConfig对象的getServletContext方法得到

      方式1:通过ServletConfig来获取ServeltContext

    //获取ServletContext的引用
    public class ServletDemo1 extends HttpServlet {
         //获取ServletConfig   
        private ServletConfig config;
    
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
         //获取servletContext ServletContext sc
    = config.getServletContext(); sc.setAttribute("p", "abc"); //获取全局参数 System.out.println(sc.getInitParameter("encoding")); System.out.println("Demo1:"+sc); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

    方式2:直接获取,推荐

    public class ServletDemo2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
         //获取ServletContext ServletContext sc
    = this.getServletContext(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

    4、ServletContext对象的核心API

    java.lang.String getContextPath()   --得到当前web应用的路径(就是运行的项目名称)

    public class ContextDemo1 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1.得到ServletContext对象
            //ServletContext context = this.getServletConfig().getServletContext();
            ServletContext context = this.getServletContext(); //(推荐使用)
            
            
            //2.得到web应用路径  /Demo
            /**
             * web应用路径:部署到tomcat服务器上运行的web应用名称
             */
            String contextPath = context.getContextPath();
            
            System.out.println(contextPath);
            
            
            /**
             * 案例:应用到请求重定向
             */
            response.sendRedirect(contextPath+"/index.html");
        }
    
    }

    --得到web应用的初始化参数 

    java.lang.String getInitParameter(java.lang.String name)   根据初始化参数名字得到参数的值

    java.util.Enumeration getInitParameterNames()  获取所有参数的值

    注意:初始化参数配置在web.xml文件中。用<context-param>标签,web应用参数可以让当前web应用的所有servlet获取!!!

    <!-- 配置web应用参数 -->
        <context-param>
            <param-name>AAA</param-name>
            <param-value>AAA's value</param-value>
        </context-param>
        <context-param>
            <param-name>BBB</param-name>
            <param-value>BBB's value</param-value>
        </context-param>
        <context-param>
            <param-name>CCC</param-name>
            <param-value>CCC's value</param-value>
        </context-param>

    代码:

    /**
     * 得到web应用参数
     * 
     *
     */
    public class ContextDemo2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //得到SErvletContext对象
            ServletContext context = this.getServletContext();
            
            //根据初始化参数的名字得到初始化参数的值:java.lang.String getInitParameter(java.lang.String name)
            String gp =sc.getInitParameter("AAA");
            System.out.println(gp);
                
            //获取所有初始化参数 java.util.Enumeration getInitParameterNames()
            Enumeration<String > en =sc.getInitParameterNames();
            //遍历
            while(en.hasMoreElements()){
                String paramterName = en.nextElement();
                String paramterValue = sc.getInitParameter(paramterName);
                System.out.println(paramterName+":"+paramterValue);
            }
    //尝试得到ConfigDemo中的servlet参数 String path = this.getServletConfig().getInitParameter("path"); System.out.println("path="+path); } }

    域对象有关的方法 

               void setAttribute(java.lang.String name, java.lang.Object object)  保存数据

               java.lang.Object getAttribute(java.lang.String name)  等到数据

               void removeAttribute(java.lang.String name)  移除数据

    域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。

         ServletContext就是一个域对象!!!!

    ServletContext域对象:作用范围在整个web应用中有效!!!

     

    /**
     * 保存数据
     * 
     *
     */
    public class ContextDemo3 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1.得到域对象
            ServletContext context = this.getServletContext();
            
            //2.把数据保存到域对象中
            //context.setAttribute("name", "eric");
            context.setAttribute("student", new Student("jacky",20));
            System.out.println("保存成功");
        }
    
    }
    
    
    class Student{
        private String name;
        private int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString() {
            return "Student [age=" + age + ", name=" + name + "]";
        }
        
    }
    =============================================
    /**
     * 获取数据
     * 
     *
     */
    public class ContextDemo4 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1.得到域对象
            ServletContext context = this.getServletContext();
            
            //2.从域对象中取出数据
            //String name = (String)context.getAttribute("name");
            Student student = (Student)context.getAttribute("student");
            //System.out.println("name="+name);
            
            System.out.println(student);
        }
    
    }

     转发

     RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

    /**
     * 转发(效果:跳转页面)
     * 
     *
     */
    public class ForwardDemo1 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            /**
             * 保存数据到request域对象
             */
            request.setAttribute("name", "rose");
            
            
            //转发    
            /**
             * 注意:不能转发当前web应用以外的资源。getRequsertDispatcher后面的路径必须以“/“开头,目标servlet的访问路径
             */
            /*RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet");
            rd.forward(request, response);*/
            this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response);
        }
    
    }
    =================================
    public class GetDataServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            /**
             * 从request域对象中获取数据
             */
            String name = (String)request.getAttribute("name");
            System.out.println("name="+name);
        }
    
    }
    ===============================================================

    public class RedirectDemo1 extends HttpServlet {

    
    

     public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
      /**
       * 保存数据到request域对象
       */
      request.setAttribute("name", "rose");
      
      //重定向
      /**
       * 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。
       */
      //response.sendRedirect("/demo11/adv.html");
      response.sendRedirect("/demo/GetDataServlet");
     }

    
    

    }

     

    转发与重定向的区别:

      1)转发

           a)地址栏不会改变

           b)转发只能转发到当前web应用内的资源

           c)可以在转发过程中,可以把数据保存到request域对象中

     

          2)重定向                         

            a)地址栏会改变,变成重定向到地址。

            b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。

            c)不能再重定向的过程,把数据保存到request中。

     结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!

    得到web应用的资源文件

         java.lang.String getRealPath(java.lang.String path)    返回资源文件的绝对路径

              java.io.InputStream getResourceAsStream(java.lang.String path)  得到资源文件,返回的是输入流

    /**
     * 读取web应用下的资源文件(例如properties)
     * @author APPle
     */
    public class ResourceDemo extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /**
             *  . 代表java命令运行目录。java运行命令在哪里?? 在tomcat/bin目录下
             *   结论: 在web项目中, . 代表在tomcat/bin目录下开始,所以不能使用这种相对路径。
             */
            
            
            //读取文件。在web项目下不要这样读取。因为.表示在tomcat/bin目录下
            /*File file = new File("./src/db.properties");
            FileInputStream in = new FileInputStream(file);*/
            
            /**
             * 使用web应用下加载资源文件的方法
             */
            /**
             * 1. getRealPath读取,返回资源文件的绝对路径
             */
            /*String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
            System.out.println(path);
            File file = new File(path);
            FileInputStream in = new FileInputStream(file);*/
            
            /**
             * 2. getResourceAsStream() 得到资源文件,返回的是输入流
             */
            InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
            
            
            Properties prop = new Properties();
            //读取资源文件
            prop.load(in);
            
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");
            System.out.println("user="+user);
            System.out.println("password="+password);
            
        }
    
    }

    补充: web应用的路径问题

    /**
     * web应用中路径问题
     *
     *
     */
    public class PathDemo extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            //目标资源: target.html
            /**
             * 思考: 目标资源是给谁使用的。
             *         给服务器使用的:   / 表示在当前web应用的根目录(webRoot下)
             *         给浏览器使用的: /  表示在webapps的根目录下
             */
            /**
             * 1.转发
             */
            //request.getRequestDispatcher("/target.html").forward(request, response);
            
            
            /**
             * 2.请求重定向
             */
            //response.sendRedirect("/demo/target.html");
            
            /**
             * 3.html页面的超连接href
             */
            response.getWriter().write("<html><body><a href='/demo/target.html'>超链接</a></body></html>");
            
            /**
             * 4.html页面中的form提交地址
             */
            response.getWriter().write("<html><body><form action='/demo/target.html'><input type='submit'/></form></body></html>");
        }
    
    }
  • 相关阅读:
    CQUOJ 10819 MUH and House of Cards
    CQUOJ 9920 Ladder
    CQUOJ 9906 Little Girl and Maximum XOR
    CQUOJ 10672 Kolya and Tandem Repeat
    CQUOJ 9711 Primes on Interval
    指针试水
    Another test
    Test
    二分图匹配的重要概念以及匈牙利算法
    二分图最大匹配
  • 原文地址:https://www.cnblogs.com/flei/p/6642480.html
Copyright © 2011-2022 走看看