一、ServletConfig对象

1 、作用

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

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

2、ServletConfig对象的创建和获取

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

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

  1. ServletConfig config=this.getServletConfig();

3、 servlet的初始化参数配置

  1. <servlet>
  2. <servlet-name>ConfigDemo</servlet-name>
  3. <servlet-class>com.gqx.servlet.ConfigDemo</servlet-class>
  4. <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
  5. <init-param>
  6. <param-name>user</param-name>
  7. <param-value>gqxing</param-value>
  8. </init-param>
  9. </servlet>

Servlet的程序如下

  1. public class ConfigDemo extends HttpServlet {
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. //获取当前ServletConfig对象
  5. ServletConfig config=this.getServletConfig();
  6. String user=config.getInitParameter("user");
  7. System.out.println(user);
  8. }
  9. }

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

ServletConfig的API:

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

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

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

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

  1. //查询当前servlet的所有初始化参数
  2. Enumeration<String> enums = this.getServletConfig().getInitParameterNames();
  3. while(enums.hasMoreElements()){
  4. String paramName = enums.nextElement();
  5. String paramValue = this.getServletConfig().getInitParameter(paramName);
  6. System.out.println(paramName+"="+paramValue);
  7. }
  8.  
  9. //得到servlet的名称
  10. String servletName = this.getServletConfig().getServletName();
  11. System.out.println(servletName);

二、ServletContext对象

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

1、引入

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

2、对象创建和得到

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

  1. 1)创建ServletContext对象 ServletContext context = new ServletContext()
  2.  
  3. 2)创建ServletConfig对象 ServetConfig config = new ServletConfig();
  4.                 config.setServletContxt(context);
  5.   class ServletConfig{
  6.       ServletContext context;
  7.       public ServletContext getServletContxt(){
  8.              return contxt;
  9.                }
  10.            }
  11.  
  12. public void init( ServletConfig config ){
  13.  
  14. 得到ServletConfig对象 ServletConfig对象中得到ServletContext对象
  15.  
  16. SerlvetContext context = config.getServletContext();
  17.  
  18. }

最终可以写成如下形式

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

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

  1. java.lang.String getContextPath() --得到当前web应用的路径
  2.  
  3. java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
  4.  
  5. java.util.Enumeration getInitParameterNames()
  6.  
  7. void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
  8.  
  9. java.lang.Object getAttribute(java.lang.String name)
  10.  
  11. void removeAttribute(java.lang.String name)
  12.  
  13. RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
  14.  
  15. java.lang.String getRealPath(java.lang.String path) --得到web应用的资源文件
  16.  
  17. java.io.InputStream getResourceAsStream(java.lang.String path)

示例如下:

1、

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

2、

  1. <!--在servlet中配置初始化参数-->
  2. <context-param>
  3. <param-name>driver</param-name>
  4. <param-value>com.mysql.jdbc.Driver</param-value>
  5. </context-param>
  6.  
  7. <context-param>
  8. <param-name>jdbcUrl</param-name>
  9. <param-value>jdbc:mysql:///atguigu</param-value>
  10. </context-param>

获取初始化参数

  1. public class ContextDemo extends HttpServlet {
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. //获取当前web应用环境下的ServletContext对象
  5. ServletContext context=this.getServletContext();
  6. String string=context.getInitParameter("driver");
  7. System.out.println("参数driver的值为:"+string);
  8. System.err.println("--------------");
  9. //获取全部的参数及其值
  10. Enumeration<String> enus=context.getInitParameterNames();
  11. while (enus.hasMoreElements()) {
  12. String str = (String) enus.nextElement();
  13. String value=context.getInitParameter(str);
  14. System.out.println(str+":"+value);
  15. }
  16. }
  17. }

效果如下

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时,该怎么办?

方案一:

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

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

这个时候可以用到域对象

  1. package com.gqx.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5.  
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. /**
  12. * 发送端
  13. * @author Administrator
  14. *
  15. */
  16. public class ContextDemo2 extends HttpServlet {
  17.  
  18. public void doGet(HttpServletRequest request, HttpServletResponse response)
  19. throws ServletException, IOException {
  20. //得到域对象
  21. ServletContext context=this.getServletContext();
  22. //把保存的数据放到域对象中
  23. context.setAttribute("student", new Student("gqx",21));
  24. System.out.println("保存成功!");
  25.  
  26. //context.setAttribute("user", "gqxing");
  27. }
  28.  
  29. }
  30.  
  31. class Student{
  32. private String nameString;
  33. private int age;
  34. public String getNameString() {
  35. return nameString;
  36. }
  37. public void setNameString(String nameString) {
  38. this.nameString = nameString;
  39. }
  40. public int getAge() {
  41. return age;
  42. }
  43. public void setAge(int age) {
  44. this.age = age;
  45. }
  46. public Student(String nameString,int age){
  47. this.nameString=nameString;
  48. this.age=age;
  49. }
  50. @Override
  51. public String toString() {
  52. return "Student [nameString=" + nameString + ", age=" + age + "]";
  53. }
  54.  
  55. }
  1. package com.gqx.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5.  
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. public class ContextDemo3 extends HttpServlet {
  13.  
  14. public void doGet(HttpServletRequest request, HttpServletResponse response)
  15. throws ServletException, IOException {
  16. //1.得到域对象
  17. ServletContext context = this.getServletContext();
  18.  
  19. //2.从域对象中取出数据
  20. //String name = (String)context.getAttribute("name");
  21. Student student = (Student)context.getAttribute("student");
  22. //System.out.println("user="+name);
  23.  
  24. System.out.println(student);
  25. }
  26.  
  27. }

转发

RequestDispatcher getRequestDispatcher(java.lang.String path)

1)转发

a)地址栏不会改变

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

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

2)重定向

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

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

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

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

  1. /**
  2. * 转发(效果:跳转页面)
  3. *
  4. */
  5. public class ForwardDemo1 extends HttpServlet {
  6.  
  7. public void doGet(HttpServletRequest request, HttpServletResponse response)
  8. throws ServletException, IOException {
  9.  
  10. /**
  11. * 保存数据到request域对象
  12. */
  13. request.setAttribute("name", "gqxing");
  14.  
  15. //转发
  16. /**
  17. * 注意:不能转发当前web应用以外的资源。
  18. */
  19. this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response);
  20. }
  21.  
  22. }
  1. public class RedirectDemo1 extends HttpServlet {
  2.  
  3. public void doGet(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5. /**
  6. * 保存数据到request域对象
  7. */
  8. request.setAttribute("name", "rose");
  9.  
  10. //重定向
  11. /**
  12. * 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。
  13. */
  14. //response.sendRedirect("/day09/adv.html");
  15. response.sendRedirect("/day10/GetDataServlet");
  16. }
  17.  
  18. }
  1. public class GetDataServlet extends HttpServlet {
  2.  
  3. public void doGet(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5.  
  6. /**
  7. * 从request域对象中获取数据
  8. */
  9. String name = (String)request.getAttribute("name");
  10. System.out.println("name="+name);
  11. }
  12.  
  13. }

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. MySQL下Limit使用及性能分析

    对于一直用Oracle的我,今天可是非常诧异,MySQL中同一个函数在不同数量级上的性能居然差距如此之大. 先看表ibmng(id,title,info)  唯一  id key 索引title 先看 ...

  2. Mvc学习笔记(2)

    Razor模板的具体语法使用 因为Razor模板的可以自动识别<>,大大减少了代码量,本节我们一起来探究Razor模板的语法的简单应用: MVC知识点: 1.ASP.NET Mvc框架 是 ...

  3. NET SqlClient

    NET SqlClient的使用与常见问题 阅读目录 一.简介 二.使用ADO.NET 三.常见问题 回到目录 一.简介 在很多要求性能的项目中,我们都要使用传统的ADO.NET的方式来完成我们日常的 ...

  4. JavaScript学习代码整理(二)--函数

    //JavaScript函数 //简单的求和函数 function sum(a,b) { return a + b; } //函数可以存储在变量中,也可以通过变量调用函数 x = sum(a,b); ...

  5. bzoj 3527: [Zjoi2014]力 快速傅里叶变换

    题意: 给出n个数qi,给出Fj的定义如下:  令Ei=Fi/qi,求Ei. fft的那一堆东西还是背不到啊...这次写虽说完全自己写的,但是还是在参见了以前fft程序的情况下调了很久,主要在如下几点 ...

  6. 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)

    3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...

  7. BOM的来源是不可能出现的字符,GB2312双字节高位都是1,Unicode理论的根本缺陷导致UTF8的诞生

    Unicode字符编码规范   http://www.aoxiang.org 2006-4-2 10:48:02Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的 ...

  8. 【Xamarin开发 Android 系列 2】VS2015跨平台开发的几种方式

    原文:[Xamarin开发 Android 系列 2]VS2015跨平台开发的几种方式 在微软Build大会上,微软宣布在VS2015中支持三种方式进行跨平台的开发. 1. Xamarin 2. Co ...

  9. redis的图形界面管理工具:phpredisadmin

    大部分人都知道redis是一款用在缓存服务器上的软件,它与memcache类似,都可以存储海量的数据,用在大访问量的web网站.聊天记录存放等方面,但是又与memcache不同: 1.缓存数据可以持久 ...

  10. USACO3.43Electric Fence(pick定理)

    忘记pick定理是什么了 想枚举来着 ..没枚出来 有篇pick定理的证明 貌似挺好 也没太看懂 /* ID: shangca2 LANG: C++ TASK: fence9 */ #include ...