首页 技术 正文
技术 2022年11月16日
0 收藏 945 点赞 4,933 浏览 4261 个字

在介绍appl ication 对象之前,先简单介绍一些Web 服务器的实现原理。

        对于大部分浏览器而言,它通常负责完成三件事情:

(1)向远程服务器发送请求。(2)读取远程服务器返回的字符串数据。

(3)负责根据字符串数据渲染出一个丰富多彩的页面。

        实际上,浏览器是一个非常复杂的网络通信程序,它除了可以向服务报送请求,读取网络数据之外,最大的技术难点在于将HTML文本渲染成页面,建立HTML页面的DOM模型,支持JavaScript 脚本程序等.     Web 服务器则负责接收客户端请求, 每当接收到客户端连接请求之后, Web 服务器应该使用单独的线程为该客户端提供服务:接收请求数据、送回响应数据。图1 显示了Web 服务器的运行机制。   
                                               B/S结构的流程简单概述B/S结构的流程简单概述
                                               
                                                                      图 1 Web服务器运行机制 这种架构称做“请求/响应”架构。根据如图1所示的机制进行归纳,对于每次客户端请求而言, Web 服务器大致需要完成如下几个步骤:1 启动单独的线程。2 使用I/O流读取用户的请求数据。3 从请求数据中解析参数。4 处理用户请求。5 生成响应数据。

6 使用IO流向客户端发送请求数据。

          其中1、2、6是通用的,可以由Web 服务器来完成,但3、4、5则存在差异:因为不同请求里包含的请求参数不同,处理用户请求的方式也不同,所生成的响应自然也不同。那么Web 服务器到底如何执行第3 、4 和5 步呢?         实际上, Web 服务器会调用Servlet方法来完成第3 、4 和5 步, 当我们编写JSP页面时,页面里的静态内容、JSP 脚本都会转换成Servlet方法的执行代码,这些执行代码负责完成解析参数、处理请求、生成响应等业务功能,而Web 服务器则负责完成多线程、网络通信等底层功能。         Web 应用里的JSP 页面、Servlet 等程序都将由Web 服务器来调用, JSP 、Servlet 之间通常不会相互调用,这就产生了一个问题: JSP、Servlet 之间如何交换数据?几乎所有Web 服务器(包括Java、ASP、PHP 、Ruby 等〉都会提供4 个类似Map 的结构,分别是application、session 、request、page , 并允许JSP 、Servlet 将数据放入这个类似Map 的结构中,并允许从这 个Map 结构中取出数据。这 个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 脚本、声明部分访问。

         JSP中的application 、session、request 和pageContext 4 个内置对象分别用于操作application 、session 、request 和page 范围中的数据。application 对象代表Web 应用本身, 因此使用application 来操作Web 应用相关数据。application对象通常有如下两个作用: 

1 在整个Web 应用的多个JSP 、Servlet 之间共享数据。

         看下面的页面, 该页面仅仅声明了一个整型变量, 每次刷新该页面时,该变量值加1,然后将该变量的值放入application 内。下面是页面的代码。 <%@ 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测试</title><meta name="website" content="http://www.crazyit.org" /></head><body><!-- JSP声明 --><%!int i;%><!-- 将i值自加后放入application的变量内 --><%application.setAttribute("counter",String.valueOf(++i));%><!-- 输出i值 --><%=i%></body></html>         虽然使用application (即ServletContext 实例〉可以方便多个JSP 、Servlet 共享数据,但不要仅为了JSP、Servlet 共享数据就将数据放入application 中!由于application 代表整个Web 应用,所以通常只应该把Web应用的状态数据放入application 里。   

2 访问Web 应用的配置参数。

application 还有一个重要用处:可用于获得Web 应用的配置参数。看如下JSP 页面,该页面访问数据库,但访问数据库所使用的驱动、URL、用户名及密码都在web.xml 中给出。

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %><%@ page import="java.sql.*" %><!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测试</title><meta name="website" content="http://www.crazyit.org" /></head><body><%//从配置参数中获取驱动String driver = application.getInitParameter("driver");//从配置参数中获取数据库urlString 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 的getlnitParameter(String paramName)来获取Web 应用的配置参数,这些配置参数应该在web.xml 文件中使用context-param 元素配置,每个<context-param… />元素配置一个参数,该元素下有如下两个子元素。

  • param-name ,配置Web 参数名。
  • param-value:配置Web 参数值。

        web.xml 文件,中使用<context-param.. ./>元素配置的参数对整个Web 应用有效,所以也被称为Web应用的配置参数。与整个Web 应用有关的数据,应该通过application 对象来操作。为了给Web 应用配置参数,应在web.xml 文件中增加如下片段。  <!-- 配置第一个参数:driver --><context-param><param-name>driver</param-name><param-value>com.mysql.jdbc.Driver</param-value></context-param><!-- 配置第二个参数:url --><context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306/javaee</param-value></context-param><!-- 配置第三个参数:user --><context-param><param-name>user</param-name><param-value>root</param-value></context-param><!-- 配置第四个参数:pass --><context-param><param-name>pass</param-name><param-value>32147</param-value></context-param>        通过这种方式,可以将一些配置信息放在web.xml 文件中配置,避免使用硬编码方式写在代码中,从而灵好地提高程序的移植性.  

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,964
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,486
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,331
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,114
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,747
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,781