关于AJAX、B/S、C/S的几个思考
B/S为何难于提供好的用户交互体验?
最大问题有几个:
(1)无状态的HTTP协议
WINDOWS窗体间能够通过内存直接交换信息,但作为B/S架构通讯基础协议的HTTP是无状态的。
如果将浏览器看成是客人,Web服务器看成是旅馆,在HTTP协议的管理之下,会出现这种情况:不管某客人来访多少次,Web服务器都将其视为第一次的访客。这样一来,客人每次都得带齐身份证件供旅馆工作人员“验明正身”。
HTTP协议的无状态,导致Web服务器的“六亲不认”,这固然能添加Web服务器的吞吐量,却给应用系统的开发带来了麻烦。因为应用系统中常常有许多业务处理流程,天生就是信息流转的,即原始数据从一端进去,从另一端出来时应该已经过某些处理,怎可想象整个业务流程中的信息会流失?于是,在HTTP各请求间共享信息就成了件麻烦事,这就是HTTP请求的“状态保持”问题。每个B/S系统都必须解决这个问题。微软想了一些“歪招”,比如充分利用HTML网页的中隐藏域,再在Web服务器上做些手脚,于是ASP.NET拥有了一套在各个HTTP请求之间维持状态的技术:SESSION,COOKIE,VIEWSTATE,PROFILE,APPLICATION。
然而问题并没有完全解决。比如,C/S系统中常见的收集用户输入信息的对话框,主窗体与对话框之间有着信息的交换(又分为两种:模式的和非模式的,前者对话框不关掉,主窗体不能被激活),在B/S架构之下,由于浏览器的每个请求是独立的,要在两个独立的浏览器窗口间实现类似于模式对话框这种直接的信息交换,我还真不知道该怎样干。
AJAX使用以下这种的方法来“摸拟”出模式窗体:将主窗体与对话框“合二为一”,对话框在HTML中就是一个DIV元素,平时是隐藏的,需要时再显示它。微软的AJAX CONTROL TOOLKIT中甚至为这一功能设计了一个控件。诸如此类的小伎俩,在B/S开发中不胜枚举。
能够看到,许多在C/S轻而易举就可实现的功能,在B/S中要实现则大费周折。
(2) 特殊的运行环境——浏览器
B/S系统的前端运行环境是浏览器,这就带来了诸多的限制,不能干许多事,比如直接访问硬件(例如打印机),也无法充分利用硬件的资源。例如,现在的新电脑都是双核的,你能直接用JAVASCRIPT加HTML写出一个多线程程序以充分利用这两颗“奔腾的芯”?
而C/S系统则直接运行在OS(操作系统)之上,能够调用OS提供的所有功能,这种限制就不存在了。
相关文档:
当要交换两个数的值时,通常的做法是定义一个临时变量,然后再进行交换。那么能不能不用临时变量而交换两个数的值呢?可以的!C语言提供的异或运算就可以实现这样的操作。
异或运算符^也称XOR运算符,它的规则是若参加运算的两个二进位同号,则结果为0(假);异号为1(真)。即0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, ......
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd )
{
OPENFILENAME ofn;
//在内存中开辟一块空间,存放用户选取的文件名
char szFile[MAX_PATH];//MAX_PATH ......
#include <windows.h>
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd )
{
OPENFILENAME ofn;
//在内存中开辟一块空间,存放用户选取的文件名
char szFile[MAX_PATH];//MAX_PATH ......
just get a json
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<mce:script src="jquery-1.3.2.min.js" mce_src="jq ......