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

    JSP内置对象——application对象

    果冻想发表于 2015-11-09 14:49:27
    love 0

    简述JSP内置对象

    在总结《JSP基础知识》和《JSP指令总结》这两篇文章时,在示例代码中经常会使用out.println这样的写法,当时很好奇,这个out是个什么对象?看着也不像个类名啊,怎么不用实例化就可以直接用了?后来才知道out是JSP中的一个内置对象。

    在JSP脚本中包含九个内置对象,这九个内置对象都是Servlet API接口的实例,只是在你访问页面的时候,由对应Servlet的_jspService方法来创建了这些实例。说白了,在你的JSP脚本中,已经有了以下九个可以直接使用的实例对象:

    • application对象:javax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身;
    • config对象:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息;
    • exception对象:java.lang.Throwable的实例,该实例代表其它页面中的异常和错误;
    • out对象:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流;
    • page对象:代表当前页面本身,也就是Servlet中的this;
    • pageContext对象:javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文;
    • request对象:javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都封装在该对象里;
    • response对象:javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应;
    • session对象:javax.servlet.http.HttpSession的实例,该对象代表一次会话。

    我们知道JSP最终会被翻译成Servlet,在对应的Servlet源码方法中,我们会发现这样的代码:

      public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {
    
        final javax.servlet.jsp.PageContext pageContext;
        javax.servlet.http.HttpSession session = null;
        final javax.servlet.ServletContext application;
        final javax.servlet.ServletConfig config;
        javax.servlet.jsp.JspWriter out = null;
        final java.lang.Object page = this;
        javax.servlet.jsp.JspWriter _jspx_out = null;
        javax.servlet.jsp.PageContext _jspx_page_context = null;
    
        ......
    }
    

    通过上面的代码我们就会发现JSP内置对象的本质,对于request和response两个内置对象是_jspService方法的形参,当Tomcat调用该方法时会初始化这两个对象;而pageContext、session、application、config、out和page都是_jspService方法的局部参数,由该方法完成初始化。

    接下来的文章将对这九个内置对象分别展开分析与总结,这篇文章主要对application对象进行总结。

    application对象的作用

    application对象一般有如下两个作用:

    • 在整个Web应用的多个JSP、Servlet之间共享数据;
    • 访问Web应用的全局配置参数。

    由于application对象代表Web应用本身,具有全局操作性,可以用于Web应用全局范围内的数据传递和共享;同时,application可以从web.xml中读取全局配置;总之,application可以作为一个Web应用全局的数据设置与访问点。

    全局共享数据

    application对象通过以下两个函数来设置属性和取属性值:

    • setAttribute(String attrName, Object value); 设置全局属性值
    • getAttribute(String attrName); 取全局属性值

    下面通过一个简单的例子进行说明,页面一(page1.jsp)和页面二(page2.jsp)是同一个Web应用下的两个没有任何关系的页面;在页面一中通过application对象设置全局属性,在页面二中通过application对象获取页面一中设置的全局属性值。

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

    <%
    application.setAttribute("defaultWebsite", "http://www.jellythink.com");
    application.setAttribute("websiteInfo", "果冻想 - 一个原创技术文章分享网站");
    %>
    

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

    <body>
        <%= application.getAttribute("defaultWebsite") %>
        <%= application.getAttribute("websiteInfo") %>
    </body>
    

    如果不访问页面一,而直接访问页面二,此时只会输出null;只有访问完页面一,设置了全局的属性defaultWebsite和websiteInfo两个属性以后,再访问页面二就可以获得在页面一种设置的全局属性值了。

    application不仅可以用于两个JSP页面之间共享数据,还可以用于Servlet和JSP之间共享数据。我们可以把application当做一个容器,任何JSP、Servlet都可以把某个变量放入application中保存,并为之指定一个属性名;而该Web应用里的其它JSP、Servlet就可以根据该属性名来得到这个变量。

    下面通过一个Servlet来获取application对象中的属性值:

    PrintWriter out = response.getWriter();
    ServletContext sc = getServletConfig().getServletContext();
    out.println(sc.getAttribute("defaultWebsite"));
    out.println(sc.getAttribute("websiteInfo"));
    

    在Servlet中并没有application对象,但是每个Web应用只有一个ServletContext实例,在Servlet中则必须通过代码获取application对象,具体参见上述代码。

    访问全局配置

    通过在web.xml文件中,我们可以配置全局的配置参数。我们可以通过application对象获取Web应用的配置参数。现在通过一个简单的例子来说明:

    在web.xml中配置全局参数:

    <context-param>
        <param-name>defaultWebsite</param-name>
        <param-value>http://www.jellythink.com</param-value>
    </context-param>
    
    <context-param>
        <param-name>websiteInfo</param-name>
        <param-value>果冻想 - 一个原创技术文章分享网站</param-value>
    </context-param>
    

    在JSP中可以通过如下代码获取全局配置参数:

    <%= application.getInitParameter("defaultWebsite") %>
    <%= application.getInitParameter("websiteInfo") %>
    

    在整个Web应用中,在JSP中都可以使用application对象调用getInitParameter方法获取全局配置参数;在Servlet同样可以通过如下代码来获得全局配置参数:

    // 获取上下文
    ServletContext servletContext = getServletConfig().getServletContext();
    
    // 获得参数
    String defaultWebsite = servletContext.getInitParameter("defaultWebsite");
    String websiteInfo = servletContext.getInitParameter("websiteInfo");
    

    总结

    总归于此,在application对象的主要用法大抵上就以上两种,涉及application对象的主要方法有以下几个:

    • setAttribute
    • getAttribute
    • getInitParameter

    用用心,多练练,多熟悉熟悉,好好学习吧,学习的路还长着呢。

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

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

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



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