js中常用函数

更新时间:2024-05-19 17:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

window.close();关闭窗口

window.location=\ alert(\消息窗口 window.back();返回前一页; history.go(-1);

window.open(\ height=100 top=100 left=100\弹出窗口

click() 对象.click() 使对象被点击。

closed 对象.closed 对象窗口是否已关闭true/false clearTimeout(对象) 清除已设置的setTimeout对象 clearInterval(对象) 清除已设置的setInterval对象 confirm(\提示信息\ 弹出确认框,确定返回true取消返回false

cursor:

式 hand crosshair text wait help default auto e/s/w/n-resize

event.clientX 返回最后一次点击鼠标X坐标值; event.clientY 返回最后一次点击鼠标Y坐标值; event.offsetX 返回当前鼠标悬停X坐标值 event.offsetY 返回当前鼠标悬停Y坐标值

document.write(document.lastModified) 网页最后一次更新时间

document.ondblclick=x 当双击鼠标产生事件 document.onmousedown=x 单击鼠标键产生事件 document.body.scrollTop; 返回和设置当前竖向滚动条的坐标值,须与函数配合,

document.body.scrollLeft; 返回和设置当前横向滚动务的坐标值,须与函数配合,

document.title document.title=\ 当前窗口的标题栏文字

document.bgcolor document.bgcolor=\颜色值\ 改变窗口背景颜色

document.Fgcolor document.Fgcolor=\颜色值\ 改变正文颜色

document.linkcolor document.linkcolor=\颜色值\ 改变超联接颜色

document.alinkcolor document.alinkcolor=\颜色值\ 改变正点击联接的颜色

document.VlinkColor document.VlinkColor=\颜色值\ 改变已访问联接的颜色

document.forms.length 返回当前页form表单数 document.anchors.length 返回当前页锚的数量 document.links.length 返回当前页联接的数量 document.onmousedown=x 单击鼠标触发事件

document.ondblclick=x 双击鼠标触发事件

defaultStatus window.status=defaultStatus; 将状态栏设置默认显示

function function xx(){...} 定义函数 isNumeric 判断是否是数字

innerHTML xx=对象.innerHTML 输入某对象标签中的html源代码

innerText divid.innerText=xx 将以div定位以id命名的对象值设为XX

location.reload(); 使本页刷新,target可等于一个刷新的网页

Math.random() 随机涵数,只能是0到1之间的数,如果要得到其它数,可以为*10,再取整

Math.floor(number) 将对象number转为整数,舍取所有小数

Math.min(1,2) 返回1,2哪个小 Math.max(1,2) 返回1,2哪个大

navigator.appName 返回当前浏览器名称 navigator.appVersion 返回当前浏览器版本号 navigator.appCodeName 返回当前浏览器代码名字 navigator.userAgent 返回当前浏览器用户代标志 onsubmit onsubmit=\ 使用函数返回值

opener opener.document.对象 控制原打开窗体对象 prompt xx=window.prompt(\提示信息\预定值\ 输入语句

parent parent.框架名.对象 控制框架页面 return return false 返回值 random 随机参数(0至1之间)

reset() form.reset(); 使form表单内的数据重置 split(\ string.split(\ 将string对象字符以逗号隔开 submit() form对象.submit() 使form对象提交数据 String对象的 charAt(x)对象 反回指定对象的第多少位的字母

lastIndexOf(\ 从右到左询找指定字符,没有返回-1

indexOf(\ 从左到右询找指定字符,没有返回-1 LowerCase() 将对象全部转为小写 UpperCase() 将对象全部转为大写

substring(0,5) string.substring(x,x) 返回对象中从0到5的字符

setTimeout(\ 设置一个超时对象 setInterval(\ 设置一个超时对象 toLocaleString() x.toLocaleString() 从x时间对象中获取时间,以字符串型式存在

typeof(变量名) 检查变量的类型,值有:String,Boolean,Object,Function,Underfined

window.event.button==1/2/3 鼠标键左键等于1右键等于2两个键一起按为3

window.screen.availWidth 返回当前屏幕宽度(空白空间)

window.screen.availHeight 返回当前屏幕高度(空白空间)

window.screen.width 返回当前屏幕宽度(分辨率值) window.screen.height 返回当前屏幕高度(分辨率值) window.document.body.offsetHeight; 返回当前网页高度 window.document.body.offsetWidth; 返回当前网页宽度 window.resizeTo(0,0) 将窗口设置宽高 window.moveTo(0,0) 将窗口移到某位置 window.focus() 使当前窗口获得焦点

window.scroll(x,y) 窗口滚动条坐标,y控制上下移动,须与函数配合 window.open()

window.open(\地址\名称\属性\

属性:toolbar(工具栏),location(地址栏),directions,status(状态栏),

menubar(菜单栏),scrollbar(滚动条),resizable(改变大

小), width(宽),height(高),fullscreen(全

屏),scrollbars(全屏时无滚动条无参 数,channelmode(宽屏),left(打开窗口x坐标),top(打开窗口y坐标)

window.location = 'view-source:' + window.location.href 应用事件查看网页源代码;

a=new Date(); //创建a为一个新的时期对象 y=a.getYear(); //y的值为从对象a中获取年份值 两位数年份

y1=a.getFullYear(); //获取全年份数 四位数年份 m=a.getMonth(); //获取月份值 d=a.getDate(); //获取日期值 d1=a.getDay(); //获取当前星期值 h=a.getHours(); //获取当前小时数 m1=a.getMinutes(); //获取当前分钟数 s=a.getSeconds(); //获取当前秒钟数 对象.style.fontSize=\文字大小\

单位:mm/cm/in英寸/pc帕/pt点/px象素/em文字高 1in=1.25cm 1pc=12pt

1pt=1.2px(800*600分辩率下) 文本字体属性: fontSize大小

family字体 color颜色

fontStyle风格,取值为normal一般,italic斜体,oblique斜体且加粗

fontWeight加粗,取值为100到900不等,900最粗,light,normal,bold

letterSpacing间距,更改文字间距离,取值为,1pt,10px,1cm textDecoration:文字修饰;取值,none不修饰,underline下划线,overline上划线

background:文字背景颜色,

backgroundImage:背景图片,取值为图片的插入路径 点击网页正文函数调用触发器: 1.onClick 当对象被点击

2.onLoad 当网页打开,只能书写在body中

3.onUnload 当网页关闭或离开时,只能书写在body中 4.onmouseover 当鼠标悬于其上时 5.onmouseout 当鼠标离开对象时 6.onmouseup 当鼠标松开 7.onmousedown 当鼠标按下键 8.onFocus 当对象获取焦点时 9.onSelect 当对象的文本被选中时 10.onChange 当对象的内容被改变

11.onBlur 当对象失去焦点

onsubmit=return(ss())表单调用时返回的值 直线 border-bottom:1x solid black 虚线 border-bottom:1x dotted black 点划线 border-bottom:2x dashed black 双线 border-bottom:5x double black 槽状 border-bottom:1x groove black 脊状 border-bottom:1x ridge black 1.边缘高光glow(color=颜色,strength=亮光大小) Tags: javascript js 网页脚本

shunz – 周三, 2005 – 03 – 30 13:04 学习笔记

发表评论 – 更多 – 2476 reads 

网页自动设置为主页

在定义了前面的javascript的cookie函数的前题下: 在后面加上

onMouseOver=\om/') &&

window.external && !GetCookie('HomePage'))

{

this.setHomePage('http://www.mydomain.com/') ;

SetCookie('HomePage','true'); } return false;\

HTTP 请求头概述

HTTP客户程序 (例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并 不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。

下面是一些最常见的请求头:

Accept:浏览器可接受的MIME类型。

Accept-Charset:浏览器可接受的字符集。

Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

Connection: 表示是否需要持久连接。如果Servlet看到这里的值为

“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小。

Content-Length:表示请求消息正文的长度。

Cookie:这是最重要的请求头信息之一,参见后面《Cookie处理》一章中的讨论。

From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

Host:初始URL中的主机和端口。

If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。 User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

有关HTTP头完整、详细的说明,请参见http://www.w3.org/Protocols/的HTTP规范。

在Servlet 中读取请求头

在Servlet 中读取HTTP头是非常方便的,只需要调用一下HttpServletRequest的getHeader方法即可。如果客户请求中提供了指定的头信息, getHeader返回对应的字符串;否则,返回null。部分头信息经常要用到,它们有专用的访问方法:getCookies方法返回Cookie头的 内容,经解析后存放在Cookie对象的数组中,请参见后面有关Cookie章节的讨论;getAuthType和getRemoteUser方法分别读 取Authorization头中的一部分内容;getDateHeader和getIntHeader方法读取指定的头,然后返回日期值或整数值。

除了读取指定的头之外,利用getHeaderNames还可以得到请求中所有头名字的一个Enumeration对象。

最 后,除了查看请求头信息之外,我们还可以从请求主命令行获得一些信息。getMethod方法返回请求方法,请求方法通常是GET或者POST,但也有可 能是HEAD、PUT或者DELETE。getRequestURI方法返回URI(URI是URL的从主机和端口之后到表单数据之前的那一部分)。 getRequestProtocol返回请求命令的第三部分,一般是“HTTP/1.0”或者“HTTP/1.1”。

实例:输出所有的请求头

下面的Servlet实例把所有接收到的请求头和它的值以表格的形式输出。另外,该Servlet还会输出主请求命令的三个部分:请求方法,URI,协议/版本。

ShowRequestHeaders.java

package hall;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*; import java.util.*;

public class ShowRequestHeaders extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { response.setContentType(\PrintWriter out = response.getWriter(); String title = \显示所有请求头\

out.println(ServletUtilities.headWithTitle(title) + \<BODY BGCOLOR=\\\\>\n\

\<H1 ALIGN=CENTER>\</H1>\n\\<B>Request Method: </B>\

request.getMethod() + \<BR>\n\\<B>Request URI: </B>\

request.getRequestURI() + \<BR>\n\\<B>Request Protocol: </B>\

request.getProtocol() + \<BR><BR>\n\\<TABLE BORDER=1 ALIGN=CENTER>\n\\<TR BGCOLOR=\\\\>\n\

\<TH>Header Name<TH>Header Value\

Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) {

String headerName = (String)headerNames.nextElement(); out.println(\<TR><TD>\

out.println(\<TD>\}

out.println(\</TABLE>\n</BODY></HTML>\}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { doGet(request, response); } }

HTTP应答状态

作者:客服中心 文章来源:本站原创 点击数:1100 更新时间:

2006-2-24

状态代码概述

Web服务器响应浏览器或其他客户程序的请求时,其应答一般由以下几个部分组成:一个状态行,几个应答头,一个空行,内容文档。下面是一个最简单的应答: HTTP/1.1 200 OK

Content-Type: text/plain Hello World

状 态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。在大多数情况下,除了Content-Type之外的所有应答头都是可选的。但 Content-Type是必需的,它描述的是后面文档的MIME类型。虽然大多数应答都包含一个文档,但也有一些不包含,例如对HEAD请求的应答永远 不会附带文档。有许多状态代码实际上用来标识一次失败的请求,这些应答也不包含文档(或只包含一个简短的错误信息说明)。

Servlet可以利用状态代码来实现许多功能。例如,可以把用户重定向到另一个网站;可以指示出后面的文档是图片、PDF文件或HTML文件;可以告诉用户必须提供密码才能访问文档;等等。这一部分我们将具体讨论各种状态代码的含义以及利用这些代码可以做些什么。

设置状态代码

如前所述,HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相关,而HTTP版本又由服务器确定,因此需要Servlet设置的只有一个状态代码。

Servlet 设置状态代码一般使用HttpServletResponse的setStatus方法。setStatus方法的参数是一个整数(即状态代码),不过为 了使得代码具有更好的可读性,可以用HttpServletResponse中定义的常量来避免直接使用整数。这些常量根据HTTP 1.1中的标准状态信息命名,所有的名字都加上了SC前缀(Status Code的缩写)并大写,同时把空格转换成了下划线。也就是说,与状态代码404对应的状态信息是“Not Found”,则HttpServletResponse中的对应常量名字为SC_NOT_FOUND。但有两个例外:和状态代码302对应的常量根据 HTTP 1.0命名,而307没有对应的常量。

设置状态代码并非总是意味着不要再返回文档。例如,虽然大多数服务器返回404应答时 会输出简单的“File Not Found”信息,但Servlet也可以定制这个应答。不过,定制应答时应当在通过PrintWriter发送

任何内容之前先调用 response.setStatus。

虽然设置状态代码一般使用的是response.setStauts(int)方法,但为了简 单起见,HttpServletResponse为两种常见的情形提供了专用方法:sendError方法生成一个404应答,同时生成一个简短的 HTML错误信息文档;sendRedirect方法生成一个302应答,同时在Location头中指示新文档的URL。

HTTP 1.1状态代码及其含义

下表显示了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义。

应 当谨慎地使用那些只有HTTP 1.1支持的状态代码,因为许多浏览器还只能够支持HTTP 1.0。如果你使用了HTTP 1.1特有的状态代码,最好能够检查一下请求的HTTP版本号(通过HttpServletRequest的getProtocol方法)。 状态代码 状态信息 含义

? ? ?

? ? ?

?

? ? ?

? ?

100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)

101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)

200 OK 一切正常,对GET和POST请求的应答文档跟在后面。如果不用setStatus设置状态代码,Servlet默认使用202状态代码。

201 Created 服务器已经创建了文档,Location头给出了它的URL。

202 Accepted 已经接受请求,但处理尚未完成。

203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。

204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。 206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。

300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。 302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved

?

?

? ?

? ?

? ?

Temporatily”,而HttpServletResponse中相应的常量是SC_MOVED_TEMPORARILY,而不是 SC_FOUND。

出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。为此,Servlet提供了一个专用的方 法,即sendRedirect。使用response.sendRedirect(url)比使用response.setStatus (response.SC_MOVED_TEMPORARILY)和response.setHeader(\更好。这是因 为:

首先,代码更加简洁。

第二,使用sendRedirect,Servlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式浏览器)。

最后,sendRedirect能够处理相对URL,自动把它们转换成绝对URL。

注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。

严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。

304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。

307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向。 注意,HttpServletResponse中没有为该状态代码提供相应的常量。(HTTP 1.1新)

400 Bad Request 请求出现语法错误。 401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

404 Not Found 无法找到指定位置的资源。这也是一个常用的应答,HttpServletResponse专门提供了相应的方法:

? ? ? ? ? ?

? ? ?

? ? ? ? ? ?

? ?

sendError(message)。

405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)

406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。

407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)

408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新) 409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新) 410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)

411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)

412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。

413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。

414 Request URI Too Long URI太长(HTTP 1.1新)。

416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)

500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。

502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。

504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)

505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

实例:访问多个搜索引擎

下面这个例子用到了除200之外的另外两个常见状态代码:302和404。302通过sendRedirect方法设置,404通过sendError方法设置。

在 这个例子中,首先出现的HTML表单用来选择搜索引擎、搜索字符串、每页显示的搜索结果数量。表单提交后,Servlet提取这三个变量,按照所选择的搜 索引擎的要求构造出包含这些变量的URL,然后把用户重定向到这个URL。如果用户不能正确地选择搜索引擎,或者利用其他表单发送了一个不认识的搜索引擎 名字,则返回一个提示搜索引擎找不到的404页面。

SearchEngines.java

注意:这个Servlet要用到后面给出的SearchSpec类,SearchSpec的功能是构造适合不同搜索引擎的URL。 package hall;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*; import java.net.*;

public class SearchEngines extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// getParameter自动解码URL编码的查询字符串。由于我们 // 要把查询字符串发送给另一个服务器,因此再次使用 // URLEncoder进行URL编码 String searchString =

URLEncoder.encode(request.getParameter(\String numResults =

request.getParameter(\String searchEngine =

request.getParameter(\

SearchSpec[] commonSpecs = SearchSpec.getCommonSpecs(); for(int i=0; i<commonSpecs.length; i++) { SearchSpec searchSpec = commonSpecs[i];

if (searchSpec.getName().equals(searchEngine)) { String url =

response.encodeURL(searchSpec.makeURL(searchString, numResults));

response.sendRedirect(url); return; } }

response.sendError(response.SC_NOT_FOUND,

\}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { doGet(request, response); } }

SearchSpec.java

package hall;

class SearchSpec {

private String name, baseURL, numResultsSuffix;

private static SearchSpec[] commonSpecs = { new SearchSpec(\

\\

new SearchSpec(\

\\

new SearchSpec(\

\\

new SearchSpec(\

\\};

public SearchSpec(String name, String baseURL,

String numResultsSuffix) { this.name = name;

this.baseURL = baseURL;

this.numResultsSuffix = numResultsSuffix; }

public String makeURL(String searchString, String numResults) {

return(baseURL + searchString + numResultsSuffix + numResults); }

public String getName() { return(name); }

public static SearchSpec[] getCommonSpecs() { return(commonSpecs); } }

SearchEngines.html

下面是调用上述Servlet的HTML表单。

<!DOCTYPE HTML PUBLIC \Transitional//EN\> <HTML> <HEAD>

<TITLE>访问多个搜索引擎</TITLE> </HEAD>

<BODY BGCOLOR=\>

<FORM ACTION=\> <CENTER> 搜索关键字:

<INPUT TYPE=\><BR> 每页显示几个查询结果:

<INPUT TYPE=\VALUE=10 SIZE=3><BR>

<INPUT TYPE=\VALUE=\> Google |

<INPUT TYPE=\VALUE=\> Infoseek |

<INPUT TYPE=\VALUE=\> Lycos |

<INPUT TYPE=\VALUE=\> HotBot <BR>

<INPUT TYPE=\> </CENTER> </FORM>

</BODY> </HTML>

会话状态概述

HTTP协 议的“无状态”(Stateless)特点带来了一系列的问题。特别是通过在线商店购物时,服务器不能顺利地记住以前的事务就成了严重的问题。它使得“购 物篮”之类的应用很难实现:当我们把商品加入购物篮时,服务器如何才能知道篮子里原先有些什么?即使服务器保存了上下文信息,我们仍旧会在电子商务应用中 遇到问题。例如,当用户从选择商品的页面(由普通的服务器提供)转到输入信用卡号和送达地址的页面(由支持SSL的安全服务器提供),服务器如何才能记住 用户买了些什么?

这个问题一般有三种解决方法:

Cookie。利用HTTP Cookie来存储有关购物会话的信息,后继的各个连接可以查看当前会话,然后从服务器的某些地方提取有关该会话的完整信息。这是一种优秀的,也是应用最 广泛的方法。然而,即使Servlet提供了一个高级的、使用方便的Cookie接口,仍旧有一些繁琐的细节问题需要处理: 从其他Cookie中分别出保存会话标识的Cookie。

为Cookie设置合适的作废时间(例如,中断时间超过24小时的会话一般应重置)。

把会话标识和服务器端相应的信息关联起来。(实际保存的信息可能要远远超过保存到Cookie的信息,而且象信用卡号等敏感信息永远不应该用Cookie来保存。)

改 写URL。你可以把一些标识会话的数据附加到每个URL的后面,服务器能够把该会话标识和它所保存的会话数据关联起来。这也是一个很好的方法,而且还有当 浏览器不支持Cookie或用户已经禁用Cookie的情况下也有效这一优点。然而,大部分使用Cookie时所面临的问题同样存在,即服务器端的程序要 进行许多简单但单调冗长的处理。另外,还必须十分小心地保证每个URL后面都附加了必要的信息(包括非直接的,如通过Location给出的重定向 URL)。如果用户结束会话之后又通过书签返回,则会话信息会丢失。

隐藏表单域。HTML表单中可以包含下面这样的输入域:<INPUT TYPE=\

NAME=\VALUE=\>。这意味着,当表单被提交时,隐藏域的名字和数据也被包含到GET或POST数据里,我们可以利用这一机制来维持会话信息。然 而,这种方法有一个很大的缺点,它要求所有页面都是动态生成的,因为整个问题的核心就是每个会话都要有一个唯一标识符。

Servlet为我们提供了一种与众不同的方案:HttpSession API。

HttpSession API是一个基于Cookie或者URL改写机制的高级会话状态跟踪接口:如果浏览器支持Cookie,则使用Cookie;如果浏览器不支持 Cookie或者Cookie功能被关闭,则自动使用URL改写方法。Servlet开发者无需关心细节问题,也无需直接处理Cookie或附加到URL 后面的信息,API自动为Servlet开发者提供一个可以方便地存储会话信息的地方。

会话状态跟踪API

在Servlet中使用会话信息是相当简单的,主要的操作包括:查看和当前请求关联的会话对象,必要的时候创建新的会话对象,查看与某个会话相关的信息,在会话对象中保存信息,以及会话完成或中止时释放会话对象。

查看当前请求的会话对象

查 看当前请求的会话对象通过调用HttpServletRequest的getSession方法实现。如果getSession方法返回null,你可以 创建一个新的会话对象。但更经常地,我们通过指定参数使得不存在现成的会话时自动创建一个会话对象,即指定getSession的参数为true。因此, 访问当前请求会话对象的第一个步骤通常如下所示:

HttpSession session = request.getSession(true);

查看和会话有关的信息

HttpSession 对象生存在服务器上,通过Cookie或者URL这类后台机制自动关联到请求的发送者。会话对象提供一个内建的数据结构,在这个结构中可以保存任意数量的 键-值对。在2.1或者更早版本的Servlet API中,查看以前保存的数据使用的是getValue(\方法。getValue返回Object,因此你必须把它转换成更加具体的数据类 型。如果参数中指定的键不存在,getValue返回null。

API 2.2版推荐用getAttribute来代替getValue,这不仅是因为getAttribute和setAttribute的名字更加匹配(和 getValue匹配的是putValue,而不是setValue),同时也因为setAttribute允许使用一个附属的

HttpSessionBindingListener 来监视数值,而putValue则不能。

但是,由于目前还只有很少的商业Servlet引擎支持2.2,下面的例子中我们仍旧使用getValue。这是一个很典型的例子,假定ShoppingCart是一个保存已购买商品信息的类:

HttpSession session = request.getSession(true); ShoppingCart previousItems

= (ShoppingCart)session.getValue(\ if (previousItems != null) { doSomethingWith(previousItems); } else {

previousItems = new ShoppingCart(...); doSomethingElseWith(previousItems); }

大 多数时候我们都是根据特定的名字寻找与它关联的值,但也可以调用

getValueNames得到所有属性的名字。getValuesNames返回的是一 个String数组。API 2.2版推荐使用getAttributeNames,这不仅是因为其名字更好,而且因为它返回的是一个Enumeration,和其他方法(比如 HttpServletRequest的getHeaders和getParameterNames)更加一致。

虽然开发者最为关心的往往是保存到会话对象的数据,但还有其他一些信息有时也很有用。

getID:该方法返回会话的唯一标识。有时该标识被作为键-值对中的键使用,比如会话中只保存一个值时,或保存上一次会话信息时。

isNew:如果客户(浏览器)还没有绑定到会话则返回true,通常意味着该会话刚刚创建,而不是引用自客户端的请求。对于早就存在的会话,返回值为false。 getCreationTime:该方法返回建立会话的以毫秒计的时间,从1970.01.01(GMT)算起。要得到用于打印输出的时间值,可以把该值传递给Date构造函数,或者GregorianCalendar的setTimeInMillis方法。

getLastAccessedTime:该方法返回客户最后一次发送请求的以毫秒计的时间,从1970.01.01(GMT)算起。

getMaxInactiveInterval:返回以秒计的最大时间间隔,如果客户请求之间的间隔不超过该值,Servlet引擎将保持会话有效。负数表示会话永远不会超时。

在会话对象中保存数据

如 上节所述,读取保存在会话中的信息使用的是getValue方法(或,对于2.2版的Servlet规范,使用getAttribute)。保存数据使用 putValue(或

setAttribute)方法,并指定键和相应的值。注意putValue将替换任何已有的值。有时候这正是我们所需要的(如下例 中的referringPage),但有时我们却需要提取原来的值并扩充它(如下例 previousItems)。示例代码如下:

HttpSession session = request.getSession(true);

session.putValue(\ShoppingCart previousItems =

(ShoppingCart)session.getValue(\if (previousItems == null) {

previousItems = new ShoppingCart(...); }

String itemID = request.getParameter(\previousItems.addEntry(Catalog.getEntry(itemID));

session.putValue(\

实例:显示会话信息

下面这个例子生成一个Web页面,并在该页面中显示有关当前会话的信息。

package hall;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*; import java.net.*; import java.util.*;

public class ShowSession extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

HttpSession session = request.getSession(true); response.setContentType(\PrintWriter out = response.getWriter(); String title = \String heading;

Integer accessCount = new Integer(0);; if (session.isNew()) {

heading = \} else {

heading = \Integer oldAccessCount =

// 在Servlet API 2.2中使用getAttribute而不是getValue (Integer)session.getValue(\if (oldAccessCount != null) {

accessCount =

new Integer(oldAccessCount.intValue() + 1); } }

// 在Servlet API 2.2中使用putAttribute

session.putValue(\

out.println(ServletUtilities.headWithTitle(title) + \<BODY BGCOLOR=\\\\>\n\

\<H1 ALIGN=\\\\>\</H1>\n\\<H2>Information on Your Session:</H2>\n\\<TABLE BORDER=1 ALIGN=CENTER>\n\\<TR BGCOLOR=\\\\>\n\\<TH>Info Type<TH>Value\n\\<TR>\n\\<TD>ID\n\

\<TD>\\n\\<TR>\n\

\<TD>Creation Time\n\

\<TD>\\n\\<TR>\n\

\<TD>Time of Last Access\n\

\<TD>\\n\\<TR>\n\

\<TD>Number of Previous Accesses\n\\<TD>\\n\\</TABLE>\n\

\</BODY></HTML>\}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { doGet(request, response); } }

要很好地领会Ajax技术的关键是了解超文本传输协议(HTTP),该协议用来传输网页、图像以及因特网上在浏览器与服务器间传输的其他类型文件。 只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息。(大部分浏览器还支持其他一些不同的协议,其中FTP 就是一个典型例子。)

注意:本文中只涉及HTTP协议,这是Ajax开发人员关心的方面,它可作为HTTP的参考手册或指南。

HTTP由两部分组成:请求和响应。当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以 及一些与浏览器本身相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)的数据。直到浏览 器解析该响应并显示出网页(或其他资源)为止。 HTTP请求

HTTP请求的格式如下所示: <request-line> <headers> <blank line>

[<request-body>]

在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之 后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。

在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL,浏览器 就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。对于www.wrox.com的GET请求如下所示:

GET / HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive

请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)。那么请求发到哪里去呢?这就是第二行的内容。

第2行是请求的第一个首部,HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠(/),可以通知服务器请求的是 www.wrox.com/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)。第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是 浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他 值,但这已经超出了本书讨论的范围)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。

如果要获取一个诸如http://www.wrox.com/books的www.wrox.com域内的页面,那么该请求可能类似于:

GET /books/ HTTP/1.1 Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive

注意只有第一行的内容发生了变化,它只包含URL中www.wrox.com后面的部分。

要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面。其格式类似于:

URL ? name1=value1&name2=value2&..&nameN=valueN

该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:

GET /books/?name=Professional Ajax HTTP/1.1 Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive

注意,为了将文本“Professional Ajax”作为URL的参数,需要编码处理其内容,将空格替换成 ,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)。“名 称—值”(name—value)对用 & 隔开。绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式。当然,如何使用这些数据还是由服务器决定的。

浏览器发送的首部,通常比本文中所讨论的要多得多。为了简单起见,这里的例子尽可能简短。

另一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器。

以下就是一个典型的POST请求:

POST / HTTP/1.1 Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1

Content-Type: application/x-www-form-urlencoded Content-Length: 40

Connection: Keep-Alive

name=Professional Ajax&publisher=Wiley

从上面可以发现, POST请求和GET请求之间有一些区别。首先,请求行开始处的GET改为了POST,以表示不同的请求类型。你会发现首部Host和User- Agent仍然存在,在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。首部

Content-Length说明了请求主体的字节数。在首部 Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,这是以简单的“名称—值”对的形式给出的,其中name是 Professional Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。

正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。 HTTP响应

如下所示,HTTP响应的格式与请求的格式十分类似: <status-line> <headers> <blank line>

[<response-body>]

正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:

HTTP/1.1 200 OK

Date: Sat, 31 Dec 2005 23:59:59 GMT

Content-Type: text/html;charset=ISO-8859-1 Content-Length: 122

<html> <head>

<title>Wrox Homepage</title> </head> <body>

<!-- body goes here --> </body> </html>

在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有: ◆200 (OK): 找到了该资源,并且一切正常。

◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。

◆ 401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。

◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。

◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

在状态行之后是一些首部。通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信 息,尽管并非是必需的)。接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length。在本例 中,首部 Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响 应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。

一、连接至Web服务器

一个客户端应用(如Web浏览器)打开到Web服务器的HTTP端口的一个套接字(缺省为80)。

例如:http://www.myweb.com:8080/index.html 在Java中,这将等同于代码:

Soceet socket=new Socket(\

InputStream in=socket.getInputStream();

OutputStream out=socket.getOutputStream();

二、发送HTTP请求

通过连接,客户端写一个ASCII文本请求行,后跟0或多个HTTP头标,一个空行和实现请求的任意数据。

一个请求由四个部分组成:请求行、请求头标、空行和请求数据

1.请求行:请求行由三个标记组成:请求方法、请求URI和HTTP版本,它们用空格分隔。 例如:GET /index.html HTTP/1.1 HTTP规范定义了8种可能的请求方法: GET 检索URI中标识资源的一个简单请求

HEAD 与GET方法相同,服务器只返回状态行和头标,并不返回请求文档 POST 服务器接受被写入客户端输出流中的数据的请求 PUT 服务器保存请求数据作为指定URI新内容的请求 DELETE 服务器删除URI中命名的资源的请求 OPTIONS 关于服务器支持的请求方法信息的请求

TRACE Web服务器反馈Http请求和其头标的请求

CONNECT 已文档化但当前未实现的一个方法,预留做隧道处理

2.请求头标:由关键字/值对组成,每行一对,关键字和值用冒号(:)分隔。 请求头标通知服务器有关于客户端的功能和标识,典型的请求头标有: User-Agent 客户端厂家和版本

Accept 客户端可识别的内容类型列表 Content-Length 附加到请求的数据字节数

3.空行:最后一个请求头标之后是一个空行,发送回车符和退行,通知服务器以下不再有头标。

4.请求数据:使用POST传送数据,最常使用的是Content-Type和Content-Length头标。

三、服务端接受请求并返回HTTP响应

Web服务器解析请求,定位指定资源。服务器将资源副本写至套接字,在此处由客户端读取。

一个响应由四个部分组成;状态行、响应头标、空行、响应数据

1.状态行:状态行由三个标记组成:HTTP版本、响应代码和响应描述。 HTTP版本:向客户端指明其可理解的最高版本。

响应代码:3位的数字代码,指出请求的成功或失败,如果失败则指出原因。 响应描述:为响应代码的可读性解释。 例如:HTTP/1.1 200 OK HTTP响应码:

1xx:信息,请求收到,继续处理

2xx:成功,行为被成功地接受、理解和采纳

3xx:重定向,为了完成请求,必须进一步执行的动作 4xx:客户端错误:

2.响应头标:像请求头标一样,它们指出服务器的功能,标识出响应数据的细节。

3.空行:最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不再有头标。

4.响应数据:HTML文档和图像等,也就是HTML本身。

四、服务器关闭连接,浏览器解析响应

1.浏览器首先解析状态行,查看表明请求是否成功的状态代码。 2.然后解析每一个响应头标,头标告知以下为若干字节的HTML。

3.读取响应数据HTML,根据HTML的语法和语义对其进行格式化,并在浏览器窗口中显示它。

4.一个HTML文档可能包含其它需要被载入的资源引用,浏览器识别这些引用,对其它的资源再进行额外的请求,此过程循环多次。

五、无状态连接

HTTP模型是无状态的,表明在处理一个请求时,Web服务器并不记住来自同一客户端的请求。

六、实例

1.浏览器发出请求 GET /index.html HTTP/1.1 服务器返回响应 HTTP /1.1 200 OK

Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Content-Length: 119 Content-Type: text/html

2.浏览器发出请求 GET /index.css HTTP/1.1 服务器返回响应 HTTP /1.1 200 OK

Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 70 Content-Type: text/plane h3{

font-size:20px; font-weight:bold; color:#005A9C; }

3.浏览器发出请求

GET image/logo.png HTTP/1.1 服务器返回响应 HTTP /1.1 200 OK

Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 1280 Content-Type: text/plane

{Binary image data follows}

(附录)

1.HTTP规范:Internet工程制定组织(IETF)发布的RFC指定Internet标准,这些RFC被Internet研究发展机构广泛接受。因为它们是标准文档,故一般用正规语言编写,如立法文标一样。

2.RFC:RFC一旦被提出,就被编号且不会再改变,当一个标准被修改时,则给出一个新的RFC。作为标准,RFC在Internet上被广泛采用。 3.HTTP的几个重要RFC: RFC1945 HTTP 1.0 描述

RFC2068 HTTP 1.1 初步描述

RFC2616 HTTP 1.1 标准

4.资源标识符URI(Uniform Resource Identifter,URI)

本文来源:https://www.bwwdw.com/article/umj7.html

Top