Servlet 之 ServletContext

package cn.jiemoxiaodi.servlet_servletcontext;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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 FServlet extends HttpServlet {

    /**
     * The doGet method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to get.
     *
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username=context.getInitParameter("username");
        Enumeration enu=context.getInitParameterNames();
        while(enu.hasMoreElements()){
            String key=(String)enu.nextElement();
            String value=context.getInitParameter(key);
            System.out.println(key+"-========>"+value);
        }
    }

}

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name></display-name>
    <context-param>
        <param-name>username</param-name>
        <param-value>tomcate</param-value>
    </context-param>
    <context-param>
        <param-name>pwd</param-name>
        <param-value>123456</param-value>
    </context-param>
    <!-- 配置servlet到项目中 -->
    <servlet>
        <!-- 可以随便填只需要注意不要和其他servlet的名字重复即可(建议使用简单类名) -->
        <servlet-name>AServlet</servlet-name>
        <!-- 配置servlet的完整类名 -->
        <servlet-class>cn.jiemoxiaodi.servlet.AServlet</servlet-class>
        <init-param>
            <param-name>aa</param-name>
            <param-value>sdfds</param-value>
        </init-param>
    </servlet>

    <!-- 配置上面这个servlet使用那个路径能被访问 -->
    <servlet-mapping>
        <!-- 此处不能随便写了,必须与上面的servlet对应,表示在为那个servlet配置路径 -->
        <servlet-name>AServlet</servlet-name>
        <!-- 配置访问这个servlet的路径 (相对路径) /==>http://localhost:8080/day10_servlet/ http://localhost:8080/day10_servlet/AServlet -->
        <url-pattern>/AServlet</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>BServlet</servlet-name>
        <servlet-class>cn.jiemoxiaodi.servlet_config.BServlet</servlet-class>
        <init-param>
            <param-name>a</param-name>
            <param-value>123456sdfd</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>BServlet</servlet-name>
        <url-pattern>/BServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>CServlet</servlet-name>
        <servlet-class>cn.jiemoxiaodi.mygenericservlet.CServlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>需哦啊</param-value>
        </init-param>
    </servlet>
    <servlet>
        <servlet-name>DServlet</servlet-name>
        <servlet-class>cn.jiemoxiaodi.http.DServlet</servlet-class>
    </servlet>
  <servlet>
    <servlet-name>FServlet</servlet-name>
    <servlet-class>cn.jiemoxiaodi.servlet_servletcontext.FServlet</servlet-class>
  </servlet>

    <servlet-mapping>
        <servlet-name>CServlet</servlet-name>
        <url-pattern>/CServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>DServlet</servlet-name>
        <url-pattern>/DServlet</url-pattern>
    </servlet-mapping>
  <servlet-mapping>
    <servlet-name>FServlet</servlet-name>
    <url-pattern>/FServlet</url-pattern>
  </servlet-mapping>
</web-app>

 

 

http://localhost:8080/projectname/FServlet

 

package cn.jiemoxiaodi.servlet_servletcontext;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HServlet extends HttpServlet {

    /**
     * The doGet method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to get.
     *
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    this.getServletContext().setAttribute("aa", "dsfd");
        this.getServletContext().setAttribute("adfa", "dsfd");

this.getServletContext().removeAttribute("aa");

this.getServletContext().removeAttribute("adfa");

        System.out.println(this.getServletContext().getAttribute("aa") + "===>"
                + this.getServletContext().getAttribute("adfa"));

    }

}
ServletContext对象
    介绍
        1.这个对象代表着咱们的整个项目.==> 这个对象在一个项目中只存在一个实例.
        2.启动项目的时候会自动创建. 关闭服务器的时候会销毁该实例.
        3.该对象如何获取呢? ==>  servletConfig 中 有一个方法叫做 getServletContext方法 来获得.
    功能
        一:可以获得项目中的一些配置(web.xml)
            getInitParameter(String name) 根据键获得值
            getInitParameterNames()   获得所有键
        上面这两个方法名字与servletConfig中的一模一样.但是获得的配置信息是
            <context-param>
                     <param-name>userName</param-name>
                     <param-value>tom</param-value>
            </context-param>
            <context-param>
                     <param-name>password</param-name>
                     <param-value>1234</param-value>
            </context-param>
        二:作为我们servlet技术中 三大域对象之一.  如果包含jsp的话,其实有4大域 page域.
                        application ==> servletContext
                        session
                        request
                    域对象涉及到4个方法
                        getAttribute(key)  根据键获得值
                        setAttribute(key,value) 往application域中的map 存放一个键值对
                        removeAttribute(key) 从application域中的map 删除一个键值对
                        getAttributeNames(); 从application域中的map 获得所有的键

//获取资源的相关方法
    //this.getServletContext().getRealPath(path)
        //this.getServletContext().getResourceAsStream(path)
        System.out.println(this.getServletContext().getRealPath("/WEB-INF/demo.xml"));
        InputStream input= this.getServletContext().getResourceAsStream("/WEB-INF/demo.xml");
        System.out.println(input);
三:可以获取项目中的资源.(例如获得项目中存放学生的stu.xml)
                //想对WEB-INF/Demo.xml进行操作.我们要先读取出该文件
                //如何来读取呢?
                    //File file = new File("E:/代码/Workspaces0808/Day10-servlet/WebRoot/WEB-INF/demo.xml");
                //上面获得demo.xml填写的路径显然是不对的.获得的是工程下的而我们要获得最终部署到服务器上的.
                    //File file = new File("E:/apache-tomcat-6.0.35/webapps/Day10-servlet/WEB-INF/demo.xml");
                //上面这种获得方式就对了.但是 如果把项目再部署到其他地方,那上面这个写死的路径就无效了.
                //这样类似获得外部资源的例子很多,所以servletContext对象给出了解决办法.
                        //getRealPath("/")  ==> 获得绝对路径 ,根据参数中的相对路径获得. "/"相对于WebRoot
                        //getResourceAsStream("/"); ==>直接获得 想要找的资源的流 . 参数还是填相对路径,同上
                例子:
                    String path = getServletContext().getRealPath("/WEB-INF/demo.xml");
                    System.out.println(path);
                    InputStream is =  getServletContext().getResourceAsStream("/WEB-INF/demo.xml");
                    System.out.println(is);

使用Class和ClassLoader 获得项目中的资源路径   
    //web-inf下的

            String path1 = getServletContext().getRealPath("/WEB-INF/demo.xml");

        //lib下的

            String path2 = getServletContext().getRealPath("/WEB-INF/lib/demo.xml");

        //src下的

            String path3 = getServletContext().getRealPath("/WEB-INF/classes/demo.xml");

        //cn.itcast.servlet.servlet_context包下的

            String path4 = getServletContext().getRealPath("/WEB-INF/classes/cn/itcast/servlet/servlet_context/demo.xml");

        //其实上面例子中path3 和 path4 这两种方式 有些麻烦

            //在介绍一种获得资源的方式,是对.class ==> Class 和 classLoader的应用

            InputStream is = this.getClass().getResourceAsStream("demo.xml"); // 如果不加"/"==> 相对的是类的当前(包)目录

            InputStream is2 = this.getClass().getResourceAsStream("/demo.xml");//如果加了"/" ==> "/"就代表classes目录(src)

            //在说下classLoader 下也有方法  classLoader 就是类的加载器. ==> 专门来读取class文件的输入流

            //也提供了读取其他文件的方法.(使用classLoader不要读取较大的文件)

            // this.getClass().getClassLoader() ==> 获得类的加载器

            InputStream is3 = this.getClass().getClassLoader().getResourceAsStream("/demo.xml");// 不论加不加"/",都相对于 classes目录,跟class中加"/" 的相对路径是一样的.

            //使用class或classLoader 也可以获得文件的绝对路径

            URL url =    this.getClass().getResource("demo.xml");

            System.out.println(url.getPath());

时间: 2024-12-11 00:55:43

Servlet 之 ServletContext的相关文章

[Servlet]研究ServletContext对象

ServletContext概述 ServletContext对象是Servlet三大域对象之一,每个Web应用程序都拥有一个ServletContext对象,该对象是Web应用程序的全局对象或者上下文.Tomcat服务器在启动时,会自动创建一个ServletContext对象,在关闭时,会自动销毁这个ServletContext对象.每个Web应用程序只拥有一个ServletContext对象,ServletContext对象可以在整个Web应用中共享数据资源. 下列是ServletConte

Servlet和servletContext

2018-08-09   22:34 * Servlet(好好学)  * 动态WEB的资源.   * 什么是Servlet    * 实现Servlet接口,重写5个方法.           * Servlet是一个小的java程序,运行在服务器中,接收和响应从客户端(浏览器)发送过来的请求.     * 快速入门    * 编写一个类,实现Servlet接口,重写5个方法.       * 编写一个类,继承GenericServlet类,重写一个方法.    * 配置文件,配置Servlet

JavaWeb之Servlet: ServletConfig 与 ServletContext

读取的html路径问题 有这样的一种情况,myeclipse有一个工作区域,我们在上面编写自己的web应用,编写完后,要把这个应用部署在服务器上,然后通过浏览器访问服务器上的那个应用. 假如这个web应用读取了某个html文件,这个html文件我在myeclipse的文件列表直接创建的,创建目录如图: 这个html文件位于WebRoot目录下.然后我们观看一下它的属性里的绝对路径: 可以看到,这个路径是位于我们myeclipse工作区域里的.那么问题来了,当我们的web应用部署到服务器上去了,这

JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用

[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html 联系方式:[email protected] [正文] 一.ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多) String getServletName()  -- 获取当前Servlet在web.xml中配置的名字 String getInitParameter(String name) -- 获取当前S

重温Servlet学习笔记--servletContext对象

一个项目中只有一个ServletContext对象,我们可以在多个servlet中获取这个唯一的对象,使用它可以给多个servlet传递数据,我们通常成servletContext为上下文对象.这个对象在tomcat启动时就创建,在tomcat关闭时才被销毁.有时候我们也把这个对象叫做application. ServletContext对象的作用就是在整个web应用的动态资源之间共享数据,比如在AServlet中向ServletContext中保存一个数据,然后在Bservelt中获取这个数据

servlet基础,如何实现一个servlet,servletConfig,HTTPServlet,ServletContext

1.什么是servlet? *servlet 服务器端的小程序. *干什么用的?处理客户端请求的小程序 *JavaEE三大组件之一 *Servlet *Filter 过滤器 *listener 监听器 servlet流程 1.请求服务器 2.创建req,resp两个对象 3.去web.xml中寻找servlet 4.找到之后返回servlet信息 5.服务器去判断当前servlet实例是否已经被创建过呢? 6.没有创建过(服务器会创建一个实例(init)) 7.服务器拿着req,resp 去调用

Servlet——ServletContext 对象

ServletContext 提两个问题: 1.大家在访问某个网站的时候,往往都会看到网站的首页面显示您是第几位浏览者(网站计数器),这是怎么实现的? 2.我们在访问某个bbs网站的时候,往往会显示有多少人在线,这是怎么实现的? 可能我们会想到的常规实现思路:数据库或者文件.这种做法比较简单,但是却会对数据库或者文件访问过于频繁,开销比较大. 解决之道是用ServletContext 什么是ServletContext 要理解ServletContext就必须和Cookie.Session做一个

JavaWeb学习之Servlet(四)----ServletConfig获取配置信息、ServletContext的应用(转)

JavaWeb学习之Servlet(四)----ServletConfig获取配置信息.ServletContext的应用 [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多) String getServletName()  -- 获取当前Servlet在web.xml中配置的名字 String

javaweb学习之Servlet开发(二)

javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: 1 <servlet> 2 <servlet-name>ServletConfigDemo1</servlet-name> 3 <servlet-class>gacl.servlet