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

ServletContext和ServletConfig的更多相关文章

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

    原文链接http://blog.csdn.net/saygoodbyetoyou/article/details/9006001   Parameter与Attribute的区别   request. ...

  2. Servlet、ServletContext与ServletConfig的详解及区别

    Servlet.ServletContext与ServletConfig的详解及区别 一.Servlet详解 Servlet是一个interface,全局限定名:javax.servlet.Servl ...

  3. ServletContext与ServletConfig的详解及区别

    转自http://hi.baidu.com/huaxuelili/item/1704a03dbb5cd7f22784f4c6 一.ServletContext详解ServletContext是serv ...

  4. 一、HttpServletRequest接口 二、HttpServletReponse接口 三、POST和GET请求方式及其乱码处理 四、ServletContext对象和ServletConfig对象

    一.HttpServletRequest接口 内部封装了客户端请求的数据信息 接收客户端的请求参数.HTTP请求数据包中配置参数 ###<1>常用方法 getContextPath()重要 ...

  5. JavaWeb学习笔记:ServletConfig()和ServletContext()

    ServletConfig()和ServletContext() 1.ServletConfig() ServletConfig是一个接口,它由server提供商来实现. ServletConfig封 ...

  6. 谈谈 ServletConfig 和 ServletContext

    目录 一.ServletConfig 和 ServletContext 的概念 二.ServletConfig 和 SerlvetContext 代码表示 一.ServletConfig 和 Serv ...

  7. servletConfig和ServletContext 以及servletContextListener介绍

    <servlet>     <servlet-name>BeerParamTests</servlet-name>     <servlet-class> ...

  8. ServletContext获取的方法

    ServletContext  代表当前web应用 如何获取ServletContext对象 ServletConfig对象中维护了ServletContext对象的引用,可以通过以下方式获得 Ser ...

  9. JavaWeb基础: ServletContext

    基本概念 Web容器在启动时,会为每个Web应用程序都创建一个对应的ServletContext对象,它代表当前Web应用. ServletContext(javax.servlet.http.Ser ...

随机推荐

  1. 基于ARM-LINUX的温度传感器驱动(DS18B20) .

    DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等.主要根据应用场合的不同而改变其外观.封装 ...

  2. C++语言十进制数,CDecimal(未完成)

    在C#和Java中都有存在decimal类似的十进制数字,C++中尚未发现,春节假期忙里抽闲写了一个玩玩,时间紧迫没有测试,只能保证编译通过.抛砖引玉,欢迎大家多提建议 当前缺陷: 1. 除法功能没有 ...

  3. 第十二周项目一 教师兼干部类】 共建虚基类person

    项目1 - 教师兼干部类]分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部).要求: (1)在两个基类中都包含姓名.年 ...

  4. python面向对象编程实例解析

    1. 类和函数 面向对象编程的例子: #!/usr/bin/env python # -*- coding: utf-8 -*- class Person(object): #在属性和变量的前面增加“ ...

  5. hdu 4445

    今天模拟了一场去年金华的现场赛: 我和小珺两人出了5个题,感觉还可以: 不过这次的题目确实比较简单: 这个题目感觉不错,不难,以前见过用这种方法的,但一直没写过: 这次写下练练手: 思路,将角度分成1 ...

  6. 创建支持CRUD(增删改查)操作的Web API(二)

    一:准备工作 你可以直接下载源码查看 Download the completed project.     下载完整的项目 CRUD是指“创建(C).读取(R).更新(U)和删除(D)”,它们是四个 ...

  7. No modifications are allowed to a locked ParameterMap

    错误:java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap at org.apa ...

  8. flexPaper +swftools实现文档在线阅读

    网上已有很多FlexPaper仿百度文库的一些文章,园子里也有很多大牛的详细教程. 结合这次做的例子,在这里详细记录一下使用Flexpaper实现仿百度文库的效果,及自己在跟着园子里的教程做的时候,遇 ...

  9. WordPress WooCommerce ‘hide-wc-extensions-message’参数跨站脚本漏洞

    漏洞名称: WordPress WooCommerce ‘hide-wc-extensions-message’参数跨站脚本漏洞 CNNVD编号: CNNVD-201310-501 发布时间: 201 ...

  10. 【转】android获取屏幕宽度和高度

    原文网址:http://www.cnblogs.com/howlaa/p/4123186.html 1. WindowManager wm = (WindowManager) getContext() ...