• ServletContext和ServletConfig


    一、ServletConfig对象

    1 、作用

      ServletConfig对象: 主要是用于加载servlet的初始化参数。

    在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象);

    2、ServletConfig对象的创建和获取

      创建时机: 在创建完servlet对象之后,在调用init方法之前创建。

       得到对象: 直接从有参数的init方法中得到!!!

    ServletConfig config=this.getServletConfig();

    3、 servlet的初始化参数配置

    复制代码
     <servlet>
        <servlet-name>ConfigDemo</servlet-name>
        <servlet-class>com.gqx.servlet.ConfigDemo</servlet-class>
        <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
          <init-param>
            <param-name>user</param-name>
            <param-value>gqxing</param-value>
        </init-param>
      </servlet>
    复制代码

    Servlet的程序如下

    复制代码
    public class ConfigDemo extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //获取当前ServletConfig对象
            ServletConfig config=this.getServletConfig();
            String user=config.getInitParameter("user");
            System.out.println(user);
        }
    }
    复制代码

     注意: servlet的参数只能由当前的这个sevlet获取!!!!

    ServletConfig的API:

               java.lang.String getInitParameter(java.lang.String name)  根据参数名获取参数值

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

             ServletContext getServletContext()     得到servlet上下文对象

              java.lang.String getServletName()       得到servlet的名称

    复制代码
    //查询当前servlet的所有初始化参数
            Enumeration<String> enums = this.getServletConfig().getInitParameterNames();
            while(enums.hasMoreElements()){
                String paramName = enums.nextElement();
                String paramValue = this.getServletConfig().getInitParameter(paramName);
                System.out.println(paramName+"="+paramValue);
            }
            
            //得到servlet的名称
            String servletName = this.getServletConfig().getServletName();
            System.out.println(servletName);
    复制代码

    二、ServletContext对象

    (注意,当你部署一个webapp的时候,想重新换一个名字,在myeclipse中重命名,去访问的时候会无效的,这个时候还要改在tomcat部署webapp下的名称)

    1、引入

            ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。

    2、对象创建和得到

    Sun公司设计(直接在Config类中去得到Context对象,然后将其封装成方法返回,这样可以使得Init方法的参数简化,同时使得每一个servlet不易越界,)

    复制代码
    1)创建ServletContext对象   ServletContext  context = new ServletContext()                
    
    2)创建ServletConfig对象   ServetConfig config = new ServletConfig();
                    config.setServletContxt(context);
      class  ServletConfig{
          ServletContext context;
           public ServletContext getServletContxt(){
                  return contxt;
                   }
                }
    
     
    
          public void init( ServletConfig config ){
    
              得到ServletConfig对象 从ServletConfig对象中得到ServletContext对象
    
              SerlvetContext context = config.getServletContext();
    
               }
    复制代码

    最终可以写成如下形式

    //获取当前web应用环境下的ServletContext对象
    ServletContext context=this.getServletContext();

    三、ServletContext对象的核心API(作用)

    复制代码
           java.lang.String getContextPath()   --得到当前web应用的路径
    
                                java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
    
                                java.util.Enumeration getInitParameterNames()
    
                                void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
    
                                java.lang.Object getAttribute(java.lang.String name) 
    
                                void removeAttribute(java.lang.String name) 
    
                                RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)
    
                                java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件
    
                                java.io.InputStream getResourceAsStream(java.lang.String path)  
    复制代码

    示例如下:

    1、

    复制代码
    public class ServletDemo1 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //获取当前web应用环境下的ServletContext对象
            ServletContext context=this.getServletContext();
            
            //得到web应用的路径,用在请求重定向的资源名称中
            String path=context.getContextPath();
            System.out.println(path);
            
            //请求重定向 (一般与上面的路径一起用)
            response.sendRedirect(path+"/index.html");
        }
    }
    复制代码

    2、

    复制代码
    <!--在servlet中配置初始化参数-->
    <context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    
    <context-param>
        <param-name>jdbcUrl</param-name>
        <param-value>jdbc:mysql:///atguigu</param-value>
    </context-param>
    复制代码

    获取初始化参数

    复制代码
    public class ContextDemo extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //获取当前web应用环境下的ServletContext对象
            ServletContext context=this.getServletContext();
            String string=context.getInitParameter("driver");
            System.out.println("参数driver的值为:"+string);
            System.err.println("--------------");
            //获取全部的参数及其值
            Enumeration<String> enus=context.getInitParameterNames();
            while (enus.hasMoreElements()) {
                String str = (String) enus.nextElement();
                String value=context.getInitParameter(str);
                System.out.println(str+":"+value);
            }
        }
    }
    复制代码

    效果如下

    web应用参数可以让当前web应用的所有servlet获取!!!

    3、域对象有关的方法

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

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

    相关api

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

         获取数据: java.lang.Object getAttribute(java.lang.String name)  

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

    问题:当我们想把数据从一个servlet发送到另一个servlet时,该怎么办?

    方案一:

     可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。

    response.sendRedirect("/Servlet2?name=gqxing")    //发送数据  
    
    
     String request.getParameter("name");      //接受数据

    这个时候可以用到域对象

    复制代码
    package com.gqx.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * 发送端
     * @author Administrator
     *
     */
    public class ContextDemo2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //得到域对象
            ServletContext context=this.getServletContext();
            //把保存的数据放到域对象中
            context.setAttribute("student", new Student("gqx",21));
            System.out.println("保存成功!");
            
            //context.setAttribute("user", "gqxing");
        }
    
    }
    
    class Student{
        private String nameString;
        private int age;
        public String getNameString() {
            return nameString;
        }
        public void setNameString(String nameString) {
            this.nameString = nameString;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public Student(String nameString,int age){
            this.nameString=nameString;
            this.age=age;
        }
        @Override
        public String toString() {
            return "Student [nameString=" + nameString + ", age=" + age + "]";
        }
        
    }
    复制代码
    复制代码
    package com.gqx.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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 ContextDemo3 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("user="+name);
                    
                    System.out.println(student);
        }
    
    }
    复制代码

    转发

    RequestDispatcher getRequestDispatcher(java.lang.String path)

      1)转发

                   a)地址栏不会改变

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

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

     2)重定向                         

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

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

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

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

    复制代码
    /**
     * 转发(效果:跳转页面)
     *
     */
    public class ForwardDemo1 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            /**
             * 保存数据到request域对象
             */
            request.setAttribute("name", "gqxing");
            
            
            //转发    
            /**
             * 注意:不能转发当前web应用以外的资源。
             */
            this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response);
        }
    
    }
    复制代码
    复制代码
    public class RedirectDemo1 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /**
             * 保存数据到request域对象
             */
            request.setAttribute("name", "rose");
            
            //重定向
            /**
             * 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。
             */
            //response.sendRedirect("/day09/adv.html");
            response.sendRedirect("/day10/GetDataServlet");
        }
    
    }
    复制代码
    复制代码
    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);
        }
    
    }
    复制代码
  • 相关阅读:
    撕衣服
    寒假作业1编程总结。
    C Traps and Pitfallss
    《彻底搞定C指针》文档整理
    C语言中内存分配 (转)
    ASCII
    ipad
    tour
    Diet
    第7章 输入与输出
  • 原文地址:https://www.cnblogs.com/zhangyubao/p/6973772.html
Copyright © 2020-2023  润新知