zoukankan      html  css  js  c++  java
  • JSP内置对象之application对象

    虽然常把Web应用称为B/S架构的应用,但其实Web应用一样是C/S结构的应用,只是这种应用的服务器是Web服务器,而客户端是浏览器。

    现在抛开Web应用直接看Web服务器和浏览器。

    Web服务器负责接收客户端请求,每当接收到客户端连接请求之后,Web服务器应该使用单独的线程为客户端提供服务。

    Web应用架构总是先由客户端发送请求,服务器接收到请求后送回响应的数据,所以将这种架构称做"请求/响应"架构。

    Web服务器大致需要以下几个步骤:

    1. 启动单独的线程;
    2. 使用I/O流读取用户的请求数据;
    3. 从请求数据中解析参数;
    4. 处理用户请求;
    5. 生成响应数据;
    6. 使用I/O流向客户端发送请求数据。

    上述中的,1、2和6步骤是通用的,可以由Web服务器来完成,但3、4和5步根据不同的请求,处理的方式也不一样。

    实际上,Web服务器会调用Servlet的_jspService()方法来完成第3、4和5步,当我们编写JSP页面时,页面里的静态内容、JSP脚本都会转换成_jspSercice()方法执行代码,这些执行代码负责完成解析参数、处理请求、生成响应等业务功能,而Web服务器则完成多线程、网络通信等底层功能。

    Web服务器在执行了第3步解析到用户的请求参数之后,将需要通过这些请求参数来创建HttpServletRequest、HttpServletResponse等对象,实际上一个Web服务器必须为ServletAPI中绝大多数接口提供实现类。

    Web应用里的JSP页面、Servlet等程序都将由Web服务器来调用,JSP、Servlet之间通常不会相互调用,这就产生了一个问题:JSP、Servlet之间如何交换数据?

    为了解决这个问题,几乎所有的Web服务器都会提供4个类似Map的结构,分别是application、session、request、page,并允许JSP、Servlet将数据放入这4个类似Map的结构中,并允许从这个4个Map结构中取出数据。这4个Map结构的区别是范围不同。

    • application:对于整个Web应用有效、一旦JSP、Servlet将数据放入application中,该数据将可以被该应用下其他所有的JSP、Servlet访问。
    • session:仅对一次会话有效,一旦JSP、Servlet将数据放入session中,该数据将可以被本次会话的其他所有的JSP、Servlet访问。
    • request:仅对本次请求有效,一旦JSP、Servlet将数据放入request中,该数据可以被该次请求的其他JSP、Servlet访问。
    • page:仅对当前页面有效,一旦JSP、Servlet将数据放入page中,该数据只可以被当前页面的JSP脚本、声明部分访问。

    就像现实中有两个人,他们需要交换金钱,却又不能直接接触,于是A将钱存入银行,B从银行中取钱。因此我们可以将application、session、request和page理解为类似银行的角色。

    将数据放入application、session、request和page之后,就相当于扩大了该数据的作用范围,所以我们也认为application、session、request和page中的数据分别处于application、session、request和page范围之中。

    JSP中的application、session、request和pageContext4个内置对象分别用于操作application、session、request和page范围中的数据。

    application对象代表Web应用本身,因此使用application来操作Web应用相关数据。application对象通常有如下两个作用:

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

    代码实例,以下页面声明了一个整型变量,每次刷新该页面时,该变量值加1,然后将值放入application内。

    put-application.jsp

    <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <title>application test</title>

    </head>

    <body>

    <!-- JSP 声明-->

    <%!

    int i;

    %>

    <!--i值自加后放入application的变量内-->

    <%

    application.setAttribute("counter",String.valueOf(i++));

    %>

    <!--输出i的值-->

    <%=i%>

    </body>

    </html>

     

    再看下面的JSP页面,该页面可以直接访问到application的counter属性值。

    get-application.jsp

    <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <title>application test</title>

    </head>

    <body>

    <!--输出i的值-->

    <%=application.getAttribute("counter")%>

    </body>

    </html>

    以上页面中的粗体字代码直接输出application的counter属性值,虽然这个页面和put-application.jsp没有任何关系,但它一样可以访问到application的属性,因为application的属性对于整个Web应用的JSP、Servlet都是共享的。

    下面代码示范了如何在Servlet中访问application里的变量。

    @WebServlet(name="get-application",urlPatterns={"/get-application"})

    public class GetApplication extends HttpServlet{

        /**

         *

         */

        private static final long serialVersionUID = 1L;

        public void service(HttpServletRequest request, HttpServletResponse response) throws IOException{

            response.setContentType("text/html;charset=gb2312");

            PrintWriter out = response.getWriter();

            out.println("<html><head><title>");

            out.println("测试application");

            out.println("</title></head></body>");

            ServletContext sc = getServletConfig().getServletContext();

            out.println("application中当前的Counter值为:");

            out.println(sc.getAttribute("counter"));

            out.println("</body></html>");

        }

    }

    由于在Servlet中并没有application内置对象,所以上面程序显式获取了该Web应用的ServletContext实例,每个Web应用只有一个ServletContext实例,在JSP页面中可通过application内置对象访问该实例,而Servlet则必须通过代码获取。

    application还有一个重要用处:可用于从Web应用的web.xml文件中获取配置参数。如下所示,访问该数据库所使用的驱动、URL、用户名和密码都位于web.xml中配置。

    <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <title>application test</title>

    </head>

    <body>

    <%

    //从配置参数中获取驱动

    String driver = application.getInitParameter("driver");

    //从配置参数中获取数据库url

    String url = application.getInitParameter("url");

    //从配置参数中获取用户名

    String user = application.getInitParameter("user");

    //从配置参数中获取密码

    String pass = application.getInitParameter("pass");

    //注册驱动

    Class.forName(driver);

    //获取数据库连接

    Connection conn = DriverManager.getConnection(url,user,pass);

    //创建Statement对象

    Statement stmt = conn.createStatement();

    //执行查询

    ResultSet rs = stmt.executeQuery("select * from news_inf");

    %>

    <table bgcolor="#9999dd" border="1" width="480">

    <%

    //遍历结果集

    while(rs.next()){

    %>

        <tr>

            <td><%=rs.getString(1)%></td>

            <td><%=rs.getString(2)%></td>

        </tr>

    <%

    }

    %>

    </table>    

    </body>

    </html>

    上面程序中,使用application的getInitParameter()方法来获取Web应用的配置参数,这些配置参数应该在web.xml文件中使用context-param元素配置,每个<context-param />配置一个参数,配置示例如下:

    <context-param>

        <param-name>driver</param-name>

        <param-value>com.mysql.jdbc.Driver</param-value>

    </context-param>

    <context-param>

        <param-name>url</param-name>

        <param-value>jdbc:mysql://localhost:3306/javaee</param-value>

    </context-param>

    <context-param>

        <param-name>user</param-name>

        <param-value>root</param-value>

    </context-param>

    ……

    param-name:配置Web参数名

    param-value:配置Web参数值

    通过这种方式,可以将一些配置信息放在web.xml文件中配置,避免使用硬编码方式写在代码中,从而更好的提高程序的移植性。

  • 相关阅读:
    介绍一种很好用的任务调度平台
    java中的进制与操作符
    类再生(合成、继承、final)
    初始化
    重新学习Spring2——IOC和AOP原理彻底搞懂
    重新学习Spring一--Spring在web项目中的启动过程
    JDK并发包
    java并行程序基础
    MVC模式
    访问者模式
  • 原文地址:https://www.cnblogs.com/freeabyss/p/3234896.html
Copyright © 2011-2022 走看看