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

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

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

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

 
       实际上,浏览器是一个非常复杂的网络通信程序,它除了可以向服务报送请求,读取网络数据之外,最大的技术难点在于将HTML文本渲染成页面,建立HTML页面的DOM模型,支持JavaScript 脚本程序等.
     Web 服务器则负责接收客户端请求, 每当接收到客户端连接请求之后, Web 服务器应该使用单独的线程为该客户端提供服务:接收请求数据、送回响应数据。图1 显示了Web 服务器的运行机制。  
 

                                                 
                                                                    图 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");
//从配置参数中获取数据库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 的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 文件中配置,避免使用硬编码方式写在代码中,从而灵好地提高程序的移植性.  

B/S结构的流程简单概述的更多相关文章

  1. 034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述

    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述 本文知识点:Java中的流程控制相关概念的认识 三大流程控制语句结构的简介 顺序 ...

  2. SNMP学习笔记之SNMP简单概述

    0x00 SNMP简单概述 0.1.什么是Snmp SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理 ...

  3. SNMP简单概述

    一.SNMP简单概述 1.1.什么是Snmp SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议& ...

  4. Python分支结构与流程控制

    Python分支结构与流程控制 分支结构 if 语句 分支结构在任何编程语言中都是至关重要的一环,它最主要的目的是让计算机拥有像人一样的思想,能在不同的情况下做出不同的应对方案,所以if语句不管是在什 ...

  5. [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述

    Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...

  6. Activity的绘制流程简单分析(基于android 4.0源码进行分析)

    要明白这个流程,我们还得从第一部开始,大家都知道 在activity里面 setcontentview 调用结束以后 就可以看到程序加载好我们的布局文件了,从而让我们在手机上看到这个画面. 那么我们来 ...

  7. qt-qml移动开发之在ios上开发和部署app流程简单介绍

    qt5.3已经全面支持移动开发,除了mac,windows,linux.还支持ios,android,wp,meego等移动平台,本教程是作者依据自己的经验,从头讲怎么样在ios上公布自己的app.因 ...

  8. 053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结

    053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结 本文知识点: 流程控制知识总结 流程控制知识总结 选择结构语句 循环结构语句 ...

  9. 最简单的IdentityServer实现——项目基本结构与流程

    项目结构 共分为三个组成部分: IdentityServer:用于登录.身份认证与授权 Api:提供获得授权后调用的各接口 Client(客户端,控制台):访问IdentityServer授权,再访问 ...

随机推荐

  1. LINUX 下安装一些东西,PHP Apach SSL 等

    首先下载apache sourcecode:http://www.apache.org/dyn/closer.cgi configure: error: Cannot find ldap librar ...

  2. C#设计模式-代理模式

    在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替 ...

  3. JavaScript随笔1

    1.NaN不等于NaN 2.判断是不是NaN:isNaN; (强制类型转换) 3.parseInt(3.5) ->3  parseInt(3px)->3 4.pareFloat(3.7)- ...

  4. js高程读书笔记(第4章--变量、作用域和内存)

    JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何总数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 1. ...

  5. 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?

    今天群里有人聊图片上传,简单说下自己的经验(大牛勿喷) 0.如果你的方法里面是有指定路径的,记得一定要过滤../,比如你把 aa文件夹设置了权限,一些类似于exe,asp,php之类的文件不能执行,那 ...

  6. IOS下载查看PDF文件(有下载进度)

    IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...

  7. jQuery 2.0.3 源码分析 数据缓存

    历史背景: jQuery从1.2.3版本引入数据缓存系统,主要的原因就是早期的事件系统 Dean Edwards 的 ddEvent.js代码 带来的问题: 没有一个系统的缓存机制,它把事件的回调都放 ...

  8. MVVM框架下 WPF隐藏DataGrid一列

    最近的一个项目,需要在部分用户登录的时候,隐藏DataGrid中的一列,但是常规的绑定不好使,在下面举个例子. XAML部分代码 <Window x:Class="DataGridCo ...

  9. 谈谈基于OAuth 2.0的第三方认证 [上篇]

    对于目前大部分Web应用来说,用户认证基本上都由应用自身来完成.具体来说,Web应用利用自身存储的用户凭证(基本上是用户名/密码)与用户提供的凭证进行比较进而确认其真实身份.但是这种由Web应用全权负 ...

  10. YII 的源码分析(-)

    做为源码分析的首秀,我就挑了yii(读作歪依依而不是歪爱爱):它的赞美之词我就不多说了,直接入正题.先准备材料,建议直从官网下载yii的源码包(1.1.15). 在demos里边有一个最简单的应用—h ...