zoukankan      html  css  js  c++  java
  • JavaWeb学习笔记——开发动态WEB资源(六)ServletConfig和ServletContext

    1.只有在第一次请求服务器产生实例的时候才会调用init()方法,有一种办法能在服务器一启动的时候就加载init()方法。

    即服务器启动即加载Servlet,且按数字大小顺序实例化Servlet。

    方法:

      创建一个TestObject.java

      在web.xml中的<servlet></servlet>写<load-on-startup>1</load-on-startup>,数字小的Servlet将先启动。

      再创建一个TestObject2.java,然后在web.xml中写<load-on-startup>2</load-on-startup>

      

        1>在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。(配置在某个servlet标签或者整个web-app下)

            2>当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,

          并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

    2.ServletConfig:

        1>在init(ServletConfig config)中的ServletConfig参数是一个接口,这个ServletConfig对象代表一个Servlet

        一个WebApp可以有多个Servlet每个Servlet对应一个ServletConfig对象,从而每个Servlet的实例是不一样的,即this是不一样的,this指的就是当前这个Servlet

        一个WebApp只有一个ServletContext对象,所以所有ServletConfig对象共享一个ServletContext对象

          总而言之:一个Servlet有一个对应的Config对象,这个对象也是由容器创建给我们的,代表每个Servlet的信息对象(Config就是信息的意思)

               每个Servlet  <1>可以获取初始化参数ServletContext对象

                       <2>不能获取其他Servlet里面定义的init-param的值(因为跨出了范围)

                       <3>不能获取Context里面定义的init-param的值(因为跨出了范围)

        方法:在web.xml中的<servlet></servlet>写

        <!-- 设置参数 -->
        <init-param>
            <param-name>coursename</param-name>
            <param-value>JAVAWEB</param-value>
        </init-param>   

           再建一个TestObject.hava后,在web.xml中加入

    <!-- 设置参数 -->
        <init-param>
            <param-name>filename</param-name>
            <param-value>CONFIG</param-value>
        </init-param>
        
        <load-on-startup>2</load-on-startup>

    3.ServletContext:    

        每一个webapp有且只有一个对应的Context对象(也是一个接口),这个对象也是容器创建给我们的,代表每个web应用的上下文环境

        1>可以用来获取context-param初始化参数

        2>不能获取config里面定义的初始化参数

        3>每个Servlet共享同一个context对象(在context里面定义的参数所有Servlet都可以通过context对象去获取)

        4>Context是一个重量级的对象,是Servlet里面最大的缓存,存储在里面的信息可以被所有的Servlet共享

          我们可以在Context看成一个很大的缓存(内存)

          其实可以把Context看成一个容器(集合)

          重要的方法:

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

            2.getAttribute(java.lang.String name)

            3.removeAttribute(java.lang.String name)

            可以通过上面方法存储对象,使得多有Servlet共享,但是如果不是所有Servlet都需要使用的不要放在Context缓存里面,浪费资源。

    4.页面导航(跳转)

      //步骤一.获取转发对象,参数就是调整的url,示例:成功就跳转到success.do
      RequestDispatcher rd = request.getRequestDispatcher("success.do");

      问题:

        1>跳转是使用get方式还是post方式?

          从doGet跳转过来就是doGet,从doPost跳转过来就是doPost

        2>如果想在下一个页面获取前面页面传递的数据?

          a>可以通过ServletContext对象传递数据,

          弊端:所有Servlet里面都有username这个属性值了,因为Context对象对所有Servlet都是共享的。类似于静态共享

          b>String username = pro.getProperty("username");

          可以保存到request对象当中,request属于请求对象,只在请求访问内有效

          request属于请求对象,只在请求访问内有效,比Context小多了

        3>rd.forward(request, response);

          forward的时候请求链没有断开,可以从请求中获取request对象里面存储的数据

          forward可以使用“/”,也可以使用相对路径

            

          RequestDispatcher rd = this.getServletContext().getRequestDispatcher("success.do");

          RequestDispatcher对象也可以从ServletContext对象当中获取

          而从ServletContext当中获取RequestDispatcher只可以使用“/”,建议从request中取,而不从context中取

       

          RequestDispatcher rd = this.getServletContext().getRequestDispatcher("login/success.do");      

          RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/user/test.do");从根目录开始找

          成功,从根目录开始找可以找到

          RequestDispatcher rd = this.getServletContext().getRequestDispatcher("login/success.do");      

          RequestDispatcher rd = this.getServletContext().getRequestDispatcher("user/test.do");从login目录开始找user找不到

          失败

          

          response.sendRedirect("fail.do"); 跳转的时候请求链会断开,不可以从请求中获取request对象里面存储的数据

          如果是超链接的话则请求链断开,不可以从请求中获取request对象里面存储的数据

          forward的时候地址栏显示的是不确定的地址;sendRedirect的时候地址栏显示的是实际跳转的地址

          sendRedirect有一个功能是forward完成不了的,forward只能在本webapp内跳转,但是sendRedirect实现的是和在地址栏里面输入地址一样的操作

        可以将重定向到任一的url上,而不是同一应用程序的url(可以实现单点登陆功能:财务系统、OA系统、仓储系统,即不同的web应用互相访问的时候,只有这一种方式)

        4>rd.include(request, response);

          将下一个页面的结果包含到当前页面,用的少

          

  • 相关阅读:
    宋词:一剪梅,雨打梨花深闭门。唐寅
    算法整理之动态规划
    与君相恋100次
    死循环之----恐怖游轮
    IOS 霓虹灯效果
    IOS 在viewController上添加视频
    iOS UIImagePickerController拍照与摄像
    socket开发基础
    RunLoop 原理和核心机制
    Objective-C的Runtime System
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/4624588.html
Copyright © 2011-2022 走看看