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);
    }

}

时间: 2024-10-31 06:40:55

ServletContext和ServletConfig的相关文章

学习笔记--【转】Parameter与Attribute的区别&amp;servletContext与ServletConfig区别

原文链接http://blog.csdn.net/saygoodbyetoyou/article/details/9006001 Parameter与Attribute的区别 request.getParameter取得Web客户端到web服务端的http请求数据(get/post),只能是string类型的,而且HttpServletRequest没有对应的setParameter()方法. 如利用href(url)和form请求服务器时,表单数据通过parameter传递到服务器,且只能为字

【Web】ServletContext与ServletConfig

在Servlet相关的对象中还有一个ServletContext对象,很多时候我们分不清楚一些长得像的东东,是因为我们不了解它们的来历.解除疑惑,我们先来看看这个对象是什么时候产生的. 先来看个简单的图: 容器启动一个Web应用时为之创建ServletContext对象,每个Web应用都有唯一的ServletContext对象,它相当于Servlet们与容器通信的接口,管理访问容器的各种资源.如,在Web应用范围内共享数据,访问当前Web应用的资源,访问容器中的其它应用,访问服务器端的文件系统资

Servlet基础知识,ServletContext,ServletConfig对象详解

Servlet的执行过程: 通过一个简单的Servlet程序开发,来说明Servlet程序的开发步骤和执行流程 开发Servlet的步骤: 1.1 步骤: 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行 3.1 servlet程序的class码拷贝到WEB-INF/classes目录 3.2 在web.xml文件中进行配置 Web.xml的配置一个Servlet的写法 <!-- 配置一个servlet --

ServletContext与ServletConfig

ServletContext -运行在JVM.上的每一个web应用程序都有一 个与之对应的Servlet 上下文(Servlet运行环境)Servlet API提供ServletContext接口用来表示Servlet上下文 ServletCo-ntext对象可以被web应用程序中的所有servlet访问 ServletContext对象是web服务器中的一个已知路径的根 原理: ServletContext对象由服务器进行创建,一个项目只有一个对象. 不管在项目的任意位置进行获取得到的都是同一

servlet - seesion、servletcontext、servletconfig对象

servlet对象: 原文地址:https://www.cnblogs.com/pengranxindong/p/10070739.html

JavaWeb:ServletConfig()和ServletContext()

ServletConfig()和ServletContext() 1.ServletConfig() ServletConfig是一个接口,它由服务器提供商来实现. ServletConfig封装了Servlet的配置信息,并且可以获取ServletContext对象. Servlet容器在初始化servlet的时候会初始化一个servletConfig对象,这个对象在任何可访问的客户端都是有效的,但是,需注意的是,该对象只能在本servlet中应用,不能在其他servlet中访问. 主要的方法

ServletConfig和ServletContext对象

1由于一个WEB应用程序中的所有Servlet都共享同一个对应的ServletContext对象,所以ServletContext对象被称为application对象.是当前web应用的大管家,可以获取到web应用的各个信息 package servlet; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import javax.servlet.ServletConfig

ServletConfig,ServletContext

ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. web容器在创建servlet实例对象时,会自动将该servlet对象的初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象作为参数传给init方法.GenericServlet已经用类变量的方式保存ServletConfig对象,自定义的Servlet使用this.getServ

servletConfig和ServletContext 以及servletContextListener介绍

<servlet> <servlet-name>BeerParamTests</servlet-name> <servlet-class>TestInitParams</servlet-class> <init-param> <param-name>addEmail</param-name> <param-value>[email protected]</param-name> <