IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    JSP内置对象——pageContext对象

    果冻想发表于 2015-11-23 16:17:02
    love 0

    简述pageContext对象

    在学习编程的时候,我们经常会碰到context这个词,什么process context,thread context等等。现在的技术书籍中都把这个词叫做“上下文”,有的时候,“上下文”这个概念还是蛮难理解的,说白了“上下文”就是一个环境,这个环境中可能会包含很多的信息,例如变量、数据等信息。

    在JSP的内置对象中,也有一个pageContext对象,这个对象代表着页面上下文,也就是当前页面所在的环境。pageContext对象是javax.servlet.jsp.PageContext类实例,我们可以通过这个对象来访问page、request、session和application作用域下的变量。

    常用API讲解

    pageContext对象通过以下四个API来设置和获取页面上下文中的属性值(具体来说只有两个):

    名称 描述
    Object getAttribute(String name) 取得page范围内的name属性
    Object getAttribute(String name, int scope) 取得指定范围内的name属性
    void setAttribute(String name, Object value) 设置page范围内的name属性
    void setAttribute(String name, Object value, int scope) 设置指定范围内的name属性

    对于上述API中的参数scope可以取以下值:

    public static final int PAGE_SCOPE          = 1; // 对应于page范围
    public static final int REQUEST_SCOPE       = 2; // 对应于request范围
    public static final int SESSION_SCOPE       = 3; // 对应于session范围
    public static final int APPLICATION_SCOPE   = 4; // 对应于application范围
    

    下面就分别通过四段简单的代码来说明上述四个函数在四个不同的作用域范围下的使用方法。

    PAGE_SCOPE测试

    在页面一(page1.jsp)中设置属性defaultWebsite的值为http://www.jellythink.com;然后获取defaultWebsite的属性值;接着在页面二(page2.jsp)中获取defaultWebsite的属性值。

    页面一(page1.jsp)主要代码:

    <!-- 默认scope为page,可以不用指定scope -->
    <% pageContext.setAttribute("defaultWebsite", "http://www.jellythink.com"); %>
    <%=pageContext.getAttribute("defaultWebsite") %>
    

    页面二(page2.jsp)主要代码:

    <!-- 由于设置的scope为page,所以跨page是无法获取属性值的 -->
    <%= pageContext.getAttribute("defaultWebsite") %>
    

    REQUEST_SCOPE测试

    在页面一(page1.jsp)中将REQUEST_SCOPE范围的属性defaultWebsite的值设置为http://www.jellythink.com;然后将页面通过<jsp:forward />动作转发到页面二(page2.jsp),在页面二中获取defaultWebsite的属性值。

    页面一(page1.jsp)主要代码:

    <% pageContext.setAttribute("defaultWebsite", "http://www.jellythink.com", PageContext.REQUEST_SCOPE); %>
    <jsp:forward page="/page2.jsp" />
    

    页面二(page2.jsp)主要代码:

    <%= pageContext.getAttribute("defaultWebsite", PageContext.REQUEST_SCOPE) %>
    

    当使用<jsp:forward />动作将请求转发到另一个页面时,请求对应的属性和参数都会一起转发过去,所以在页面二(page2.jsp)中可以获取defaultWebsite的属性值。关于<jsp:forward />动作可以参见《JSP动作总结》这篇文章。

    SESSION_SCOPE测试

    在页面一(page1.jsp)中将SESSION_SCOPE范围的属性defaultWebsite的值设置为http://www.jellythink.com;在页面二(page2.jsp)中获取SESSION_SCOPE范围下属性defaultWebsite的值。

    页面一(page1.jsp)主要代码:

    <%="页面一" %>
    <% pageContext.setAttribute("defaultWebsite", "http://www.jellythink.com", PageContext.SESSION_SCOPE); %>
    <%=pageContext.getAttribute("defaultWebsite", PageContext.SESSION_SCOPE) %>
    

    页面二(page2.jsp)主要代码:

    <%="页面二" %>
    <%= pageContext.getAttribute("defaultWebsite", PageContext.SESSION_SCOPE) %>
    

    由于page指令中的session属性默认值为true,当我们在不关闭测试浏览器的情况下,访问完页面一,再去访问页面二就可以成功的获取到SESSION_SCOPE范围下defaultWebsite的值。

    APPLICATION_SCOPE测试

    在页面一(page1.jsp)中将APPLICATION_SCOPE范围的属性defaultWebsite的值设置为http://www.jellythink.com,同时为了防止session的干扰,并设置page指令的session属性值为false;在页面二(page2.jsp)中获取APPLICATION_SCOPE范围下属性defaultWebsite的值。

    页面一(page1.jsp)主要代码:

    <%="页面一" %>
    <% pageContext.setAttribute("defaultWebsite", "http://www.jellythink.com", PageContext.APPLICATION_SCOPE); %>
    <%=pageContext.getAttribute("defaultWebsite", PageContext.APPLICATION_SCOPE) %>
    

    页面二(page2.jsp)主要代码:

    <%="页面二" %>
    <%= pageContext.getAttribute("defaultWebsite", PageContext.APPLICATION_SCOPE) %>
    

    由于关闭了session的干扰,页面一和页面二就是同一个Web应用下两个完全不相干的页面。由于设置的是APPLICATION_SCOPE作用域,所以在同一个Web应用的任意一个页面下都可以获取该属性的值。

    总结

    这篇文章对JSP中的内置pageContext对象进行全面的总结,从最基本的概念出发,结合实际开发中经常用到的四个API函数,并通过四个不同作用域下的测试代码对这四个API函数进行了非常全面的剖析和总结;让大家能够一眼就能明白如何使用内置的pageContext对象,希望我的这篇文章能对大家有所帮助。

    果冻想-一个原创技术文章分享网站。

    2015年11月08日 于呼和浩特。

    未经允许不得转载:果冻想 » JSP内置对象——pageContext对象



沪ICP备19023445号-2号
友情链接