zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
    复制代码
  • 相关阅读:
    Atitit s2018.6 s6 doc list on com pc.docx Atitit s2018.6 s6 doc list on com pc.docx  Aitit algo fix 算法系列补充.docx Atiitt 兼容性提示的艺术 attilax总结.docx Atitit 应用程序容器化总结 v2 s66.docx Atitit file cms api
    Atitit s2018.5 s5 doc list on com pc.docx  v2
    Atitit s2018.5 s5 doc list on com pc.docx  Acc 112237553.docx Acc baidu netdisk.docx Acc csdn 18821766710 attilax main num.docx Atiitt put post 工具 开发工具dev tool test.docx Atiitt 腾讯图像分类相册管家.docx
    Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx s2018 s4 doc compc dtS44 s2018 s4 doc dvcCompc dtS420 s2018 s4f doc homepc s2018 s4 doc compc dtS44(5 封私信 _ 44 条消息)WebSocket 有没有可能取代 AJAX
    Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compcAtitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compcAtitit 操作日
    Atitit s2018.2 s2 doc list on home ntpc.docx  Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx Atiitt 手写文字识别 讯飞科大 语音云.docx Atitit 代码托管与虚拟主机.docx Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx Atitit 几大研发体系对比 Stage-Gat
    Atitit 文员招募规范 attilax总结
    Atitit r2017 r6 doc list on home ntpc.docx
    atitit r9 doc on home ntpc .docx
    Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4
  • 原文地址:https://www.cnblogs.com/zhangyubao/p/6973772.html
Copyright © 2011-2022 走看看