ServletContext和ServletConfig

来源:互联网 发布:手机防盗警报器软件 编辑:程序博客网 时间:2024/06/05 08:35

一、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);    }}
复制代码

 

原创粉丝点击