zoukankan      html  css  js  c++  java
  • java四大域总结

    最近学完了web部分,发现有些地方总是单个容易理解,可是把所有的放在一起来大杂烩,总是有那么几个知识点容易混淆。其实网上的资料已经够多了,虽然也不乏辛劳的搬运工。可是最终的目的不就是要我们自身理解吗?自己理解了的东西才正真是我们的。作为额外的奖励,我们先来关注一下JSP的九大隐式对象。

    可以看看下图中关于JSP的九大隐式对象,它们可总是被老师们说是重点重点哦。

     

     

    作用域------顾名思义,起作用的大小范围也!如果是你自己去学习一个知识点,你要达到哪些目标才算是对一个知识点称得上是懂得,理解,掌握呢?从扁神医的望闻问切,到数据库的增删改查,所有的事物开始也不外乎:是什么?有什么用?怎么用?为什么可以这么用?故而,我觉得咱们应该把握以下问题,带着这些问题去学习,发现自己的不足,才是学习的上策。

    1)作用域的实际大小。(是什么?)

    2)  作用域的作用。(有什么用?)

    3)怎么使用这些作用域。(怎么用?)

    4)它这样使用实现的原理。(为什么可以这么用?)

     

    下面开始逐一分析:

    (一)servletcontext域(application域)

    1)作用域的实际大小。(是什么?)

      servletcontext域起作用的范围是:整个web应用程序。

      数据产生之后,不仅等会还要用 ,还要给别人用,则请使用servletcontext。

      它是四个域中范围最大的域。

    2)  作用域的作用。(有什么用?

      由于一个web应用中的所有servlet共享同一个servletcontext对象,所以多个servlet通过servletcontext对象实现了数据在不同servlet之间的共享。

    3)怎么使用这些作用域。(怎么用?)

      a)可以通过编程的方式绑定,也可以作为web应用的全局变量被所有Servlet和JSPs访问

    设置Context属性:
                  ServletContext application=this.getServletContext();
                  application.setAttribute("person1",new Person("Jim"));
                  application.setAttribute("person2",new Person("Green"));
     获取Context属性:
                  ServletContext application=this.getServletContext();
                  Enumberation persons=application.getAttributeNames();
                   while(persons.hasMoreElements()){
                          String name=(String)persons.nextElement();
                          Person p=(Person)persons.getAttribute(name);
                          application.removeAttribute(name);
                  }

     

      b)为整个web应用配置context域:

      修改web.xml配置文件,加入以下内容

      <context -param>

        <param-name>data</param-name>

        <param-value>Hello world !</param-value>

      </context - param>

      从Servlet中访问这些初始化参数:

                  ServletContext application=this.getServletContext();

                  out.println(application.getInitParameter("data"));

     

      c)读取资源文件

         使用ServletContext接口可以直接访问web应用中的静态内容文档结构.包括HTML,GIF和JPEG文件。如以下方法:
             .getResource()
             .getResourceAsStream()
       这两个方法的参数都是以"/"开头的字符串,表示资源相对于context根的相对路径.文档结构可以存在于服务器文件系统,或是war包中,或是在远程服务器上,抑或其他位置。不可以用来获得动态资源,比如,getResource("/index.jsp"),这个方法将返回该jsp文件的源码,而不是动态页面.可以用 "Dispatching Requests" 获得动态内容.列出web应用中可被访问的资源,可以使用getResourcePaths(String path)方法。

                 

    4)它这样使用实现的原理或优缺点。(为什么可以这么用?)

      servlet并不适合做数据输出,故需要将数据转发给JSP文件进行美化再输出给客户端。

      JSP中可嵌入java代码,这使得它接收java数据变得可能。同时,由于servletcontext域可使整个web应用共享该数据,因此而带来“线程安全”问题同样影响对转发的数据,故而需要使用request域。

     

    (二)Httpsession域(session域)

    1)作用域的实际大小。(是什么?)

      Httpsession的作用域是:一次会话。

      数据产生之后显示给用户了,等会还要使用的情况下使用Httpsession域。

      它是四个域中范围第二大的域。

    2)  作用域的作用。(有什么用?)

      (会话范围)在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session。如果没有,就在内存中创建一个session并返回。当一短时间内(默认30分钟)session没有被使用,则服务器会销毁该session。若服务器非正常关闭,未到期的session也会跟着销毁。若调用session提供的invalidate()方法,可以立即销毁session。

    3)怎么使用这些作用域。(怎么用?)

      a) jsp中操作session
        (String)request.getSession().getAttribute("username"); // 获取
        request.getSession().setAttribute("username", "xxx");  // 设置
    
       b) java中操作session
        //servlet中
        request.getSession();
        session.getAttribute("username");
        session.setAttribute("username", "xxx");
        session.setMaxInactiveInterval(30*60);
        session.invalidate();
     
        //struts中方法1
        ServletActionContext.getRequest().getSession().setAttribute("username", "xxx");
        ServletActionContext.getRequest().getSession().getAttribute("username");
        ServletActionContext.getRequest().getSession().setMaxInactiveInterval(30*60);
        ServletActionContext.getRequest().getSession().invalidate();
    
        //struts中方法2
        ActionContext.getContext().getSession().put("username", "xxx");
        ActionContext.getContext().getSession().get("username");
        ActionContext.getContext().getSession().clear();
    
       c) web.xml中操作session
        <session-config>  
            <session-timeout>30</session-timeout>  
        </session-config>
    
       d) tomcat-->conf-->conf/web.xml
        <session-config>
            <session-timeout>30</session-timeout>
        </session-config>

     

    4)它这样使用实现的原理。(为什么可以这么用?)

      HttpSession在服务器中,为浏览器创建独一无二的内存空间,在其中保存了会话相关的信息。服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都 会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。如果要问我为什么,我也不知道啊!

     

    (三)ServletRequest域(request域)

    1)作用域的实际大小。(是什么?)

      ServletRequset域是:整个请求链(请求转发也存在)。

      数据产生之后,只需要使用一次,这种情况下请使用ServletRequset域。

      它是四个域中范围排第三的域。

    2)  作用域的作用。(有什么用?)

      在整个请求链中共享数据。

      最常用到:在servlet中处理好的数据交给JSP显示,此时参数就可以放置在ServletRequset域中带过去。

    3)怎么使用这些作用域。(怎么用?)

      a) 获得客户机信息的方法
          getRequestURL方法返回客户端发出请求时的完整URL。
          getRequestURI方法返回请求行中的资源名部分。
          getQueryString 方法返回请求行中的参数部分。
          getRemoteAddr方法返回发出请求的客户机的IP地址
          getRemoteHost方法返回发出请求的客户机的完整主机名
          getRemotePort方法返回客户机所使用的网络端口号
          getLocalAddr方法返回WEB服务器的IP地址。
          getLocalName方法返回WEB服务器的主机名
          getMethod得到客户机请求方式
       b) 获得客户机请求头
          getHeader(string name)方法
          getHeaders(String name)方法
          getHeaderNames方法
       c) 获得客户机请求参数(客户端提交的数据)
          getParameter(name)方法
          getParameterValues(String name)方法
          getParameterNames方法
          getParameterMap方法

    4)它这样使用实现的原理。(为什么可以这么用?)

      在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。

     

    (四)PageContext域(page域)

    1)作用域的实际大小。(是什么?)

      PageContext域的作用范围是:整个JSP页面。

      它是四个域中范围最小的一个域。

    2)  作用域的作用。(有什么用?)  
      a) 它可以获取其它八大隐式对象,可以认为它是一个入口对象。

      b) 获取其它所有域中的数据。

      c) 跳转到其它资源。其身上提供了forword和sendRedirect方法,简化了转发和重定向的操作。 

    3)怎么使用这些作用域。(怎么用?)

      以下以一个简单的JSP页面程序为例:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html><head><title>pageContext对象_例1</title></head>
    <body><br>
    <%
    //使用pageContext设置属性,该属性默认在page范围内
    pageContext.setAttribute("name","地球");
    request.setAttribute("name","太阳系");
    session.setAttribute("name","银河系");
    //session.putValue("name","麦哲伦系");
    application.setAttribute("name","宇宙");
    %>
    page设定的值:<%=pageContext.getAttribute("name")%><br>
    request设定的值:<%=pageContext.getRequest().getAttribute("name")%><br>
    session设定的值:<%=pageContext.getSession().getAttribute("name")%><br>
    application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
    范围1内的值:<%=pageContext.getAttribute("name",1)%><br>
    范围2内的值:<%=pageContext.getAttribute("name",2)%><br>
    范围3内的值:<%=pageContext.getAttribute("name",3)%><br>
    范围4内的值:<%=pageContext.getAttribute("name",4)%><br>
    <!--从最小的范围page开始,然后是reques、session以及application-->
    <%pageContext.removeAttribute("name",3);%>
    pageContext修改后的session设定的值:<%=session.getValue("name")%><br>
    <%pageContext.setAttribute("name","宇宙",4);%>
    pageContext修改后的application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
    值的查找:<%=pageContext.findAttribute("name")%><br>
    属性name的范围:<%=pageContext.getAttributesScope("name")%><br>
    </body></html>

    显示结果:

    page设定的值:地球
    request设定的值:太阳系
    session设定的值:银河系
    application设定的值:宇宙
    范围1内的值:地球
    范围2内的值:太阳系
    范围3内的值:银河系
    范围4内的值:宇宙
    pageContext修改后的session设定的值:null
    pageContext修改后的application设定的值:宇宙
    值的查找:地球
    属性name的范围:1

     

    4)它这样使用实现的原理。(为什么可以这么用?)

       pageContext对象,这个对象代表页面上下文,该对象主要用于访问JSP之间的共享数据。当对JSP的请求时开始,当响应结束时销毁。

     

     

     



     

  • 相关阅读:
    Spring Boot从入门到精通(一)搭建第一个Spring Boot程序
    程序员未来的出路究竟在哪里?一位老码农的心声
    ​IntelliJ IDEA使用技巧—使用EasyCode插件一键生成代码04期
    浅谈Java后端开发工程师腾讯面试经历分享总结
    Java面试技巧—如何自我介绍
    互联网大厂Java面试题集—Spring boot常见面试题(二)
    互联网大厂Java面试题集—Spring boot面试题(一)
    ActiveMQ消息队列从入门到实践(4)—使用Spring JMS收发消息
    ActiveMQ消息队列从入门到实践(1)—JMS的概念和JMS消息模型
    有多少程序员干到35岁,那么其他人去干什么了?
  • 原文地址:https://www.cnblogs.com/understander/p/5716485.html
Copyright © 2011-2022 走看看