• 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>");
        }
    
    }
  • 相关阅读:
    两个数据库比较 对比视图存储过程及表结构差异
    导入/导出Excel
    比较两个数据库的表结构差异
    根据当月数据库自动生成下个月数据库--3
    根据当月数据库自动生成下个月数据库--2
    根据当月数据库自动生成下个月数据库--1
    ubuntu 分屏工具
    ubuntu 分屏工具
    中英文对照 —— 色彩的描述
    中英文对照 —— 色彩的描述
  • 原文地址:https://www.cnblogs.com/flei/p/6642480.html
Copyright © 2020-2023  润新知