• JavaWeb之Servlet: ServletConfig 与 ServletContext


    ServletConfig对象

    什么是ServletConfig对象

      ServletConfig对象,Servlet配置对象。主要用于加载配置文件的初始化参数。

     

    创建时机

      ServletConfig对象在servlet对象创建之后,调用init方法之前创建,该Config对象随着init方法传入到servlet中。

     

    常用方法

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

        java.util.Enumeration getInitParameterNames()         得到所有参数

        ServletContext getServletContext()                   获取servlet上下文对象

        ava.lang.String getServletName()                    得到servlet名称

     

    问题:SevletConfig中的初始化参数不能被其他Servlet共享!!

     

    下面来演示一下这些方法的使用:

    我们先在servlet的配置文件web.xml配置servlet的初始化参数,然后运用上面的方法得到这些数据! 

    配置文件:  

     <servlet>
                <servlet-name>testpath</servlet-name>
                <servlet-class>com.vmaxtam.dotest.testpath</servlet-class>
          <init-param>                --这个标签写在要设置的servlet内
                   <param-name>color</param-name>  -属性名
                 <param-value>red</param-value>    -属性值
          </init-param>
      </servlet>    

    下面我们就在相应的servlet内得到配置好的数据吧!

    ServletConfig servletConfig = getServletConfig();
    String color = servletConfig.getInitParameter("color");

    这样就能得到配置好的数据了!还有更简单的方法:

    先说明一下:首先HttpServlet继承自GenericServlet类,而GenericServlet类又继承自Servlet接口,Servlet接口有方法getServletConfig() ,所以HttpServlet肯定有方法getServletConfig()。而GenericServlet类又实现了ServletConfig 接口,也就是他肯定实现了ServletConfig接口中的所有方法,所以以上代码我们还可以这样写:

    String color = getInitParameter("color");

    其它方法也差不多,这里不做示范~~~

    ServletContext对象

    什么是ServletContext对象

    我们知道一个Web应用里面可以有多个servlet,如果现在有一份数据需要传给所有的servlet使用,那么我们就可以使用ServletContext对象了。

    ServletContext对象叫servlet上下文对象。该对象在一个web应用中只会创建一个对象,代表当前web应用的环境。在当前的web应用中所有servlet都共享一个ServletContext对象

    ServletContext对象创建的时机

    由ServletContext对象的特性我们可以推断出它被创建的时机:每当一个web应用被加载,那么一个ServletContext对象就被创建了,然后web应用里的servlet就可以同使用它了!

    那么,我们如何在servlet里得到这个已经创建的对象呢?

    得到ServletContext对象

    开发者十分巧妙的将ServletContext对象放入在了该web应用里的每一个servlet中的ServletConfig对象里!

    在一个servlet被创建时,会调用它的构造方法,随后就会调用init()方法对它初始化,而在初始化的过程中,就把ServletContext对象放入到ServletConfig对象中了!那么这个servlet得到ServletContext对象对象就十分方便了,只需要用一句代码!

    ServletContext servletContext = this.getServletContext();

     

    ServletContext对象的常用方法

    得到了ServletContext对象,我们就要想:这个对象有什么用呢!?以下介绍一下它的常用的方法。

    主要有五种用法:

    一)得到web应用的上下文路径

        java.lang.String getContextPath()     

     

    二)获取web应用的全局参数 :         

         java.lang.String getInitParameter(java.lang.String name)  

        java.util.Enumeration getInitParameterNames()  

     

    三)域对象相关的方法:

        java.lang.Object getAttribute(java.lang.String name)     

        void setAttribute(java.lang.String name, java.lang.Object object)

        void removeAttribute(java.lang.String name)

     

    四)用于转发:

        RequestDispatcher getRequestDispatcher(java.lang.String path)  

     

    五)web应用加载资源文件方法

        java.lang.String getRealPath(java.lang.String path)   

        java.io.InputStream getResourceAsStream(java.lang.String path)

     

    下面示范一下使用这些方法:

     

    一)得到web应用的上下文路径

    通过request来调用该方法

    String path = request.getContextPath();
    System.out.println(path);

    输出结果:

    /TestArea

    web应用的路径 是 tomcat服务器中web应用的名称,而不是ecplise中的项目名称。

    request.getContextPath();  为了方便获取上下文路径。推荐使用该方法。

     

     

    二)获取web应用的全局参数

     

    先在web应用对应的web.xml中设置全局参数:  全局参数的标签写咋<web-app>标签内

    <web-app version="3.0"
        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_3_0.xsd">
    
            <!-- 全局参数 -->
        <context-param>
            <param-name>AAA</param-name>
            <param-value>AAA's value</param-value>
        </context-param>
        <context-param>
            <param-name>BBB</param-name>
            <param-value>BBB's value</param-value>
        </context-param>

    然后在servlet内得到这个参数:

    //1.得到ServletContext对象
            ServletContext context = this.getServletContext();
            
            //2.获取全局参数
            System.out.println(context.getInitParameter("AAA"));
            
            Enumeration<String> enums = context.getInitParameterNames();
            while(enums.hasMoreElements()){
                String paramName = enums.nextElement();
                String paramValue = context.getInitParameter(paramName);
                System.out.println(paramName+"="+paramValue);
            }

    注意: 所有的servlet都可以获取全局参数!!!

     

     

    三)域对象相关的方法

     什么是域对象?

        域对象:保存数据 和 获取数据,用于在不同资源之间共享数据。

    那么我们现在尝试把第一个servlet的数据传到 另一个servlet里吧!

    方法一:利用跳转,从servlet1跳转到servlet2时,把数据写在跳转uri里

    response.sendRedirect("/servlet2?id=867");

    方法二:利用域对象方法

        setAttribute(name,Object):  保存数据方法.name名称,object数据

        getAttribute(name)  获取数据。name是保存数据时的名称

        removeAtrributename): 清除数据。

    servlet1写上:

     

    ServletContext context = this.getServletContext();
    context.setAttribute("id", 123);

     

    然后servlet2获得它吧!

    ServletContext context = this.getServletContext();
    String id = context.getAttribute("id");

       

    四)用于转发

    RequestDispatcher getRequestDispatcher(java.lang.String path)  

     

    servlet中跳转资源:重定向  /  转发

     

    重定向:

        1)地址栏会发送改变,变成重定向到的地址

        2)重定向可以跳转到web应该内,其他web应用,甚至站外的应用。

        3)调用者和被调用者处于两次不同的请求。不能通过request域对象来共享数据。

     

    转发:

        1)地址栏不会发送改变。

        2)转发不能转发到应用外的资源,不能转发到站外资源;只能转发到当前web应用下的资源。

        3)调用者和被调用者处于同一次请求,可以通过request域对象共享数据。

     

    资源: 

        1)内部资源:web应用内的资源   

        2)应用外的资源: 其他web应用下的资源 

        3)其他站点的资源   

     

     

    web应用加载资源文件方法

    先了解一下web应用运行时的目录:

     

         相对路径是指java命令的运行目录。

     

         java项目:ecplise工具把java命令运行的目录设置到web应用的根目录。

     

         web项目: java命令运行的目录在tomcat/bin目录下。

     有时候我们需要web应用加载一些图片,音乐,视频等,就需要获得他们的路径然后使用,可以用以下方法获得:

     

        java.lang.String getRealPath(java.lang.String path)   --得到资源的绝对路径

     

        java.io.InputStream getResourceAsStream(java.lang.String path)--得到资源的的一个输入流

     

     

  • 相关阅读:
    MySQL 5.7.18 zip 文件安装过程
    Mysql 自定义随机字符串
    JAVA基本类型和引用类型
    初识JSP
    Java导出错误数据
    时序图的使用习惯
    Redis踩坑
    ES踩坑
    代码规范
    Git在公司的使用流程
  • 原文地址:https://www.cnblogs.com/vmax-tam/p/4127396.html
Copyright © 2020-2023  润新知