第5章 JSP内置对象_第1页
第5章 JSP内置对象_第2页
第5章 JSP内置对象_第3页
第5章 JSP内置对象_第4页
第5章 JSP内置对象_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章JSP内置对象第4章学习了页面组成元素和使用方法。本章学习JSP内置对象的使用。使用JSP内置对象,可以方便操作页面,访问页面环境,实现页面内、页面间、页面与环境之间的通讯。学习目标熟悉主要内置对象的概念理解主要内置对象的作用域和生命期理解主要内置对象的作用和关系熟悉主要内置对象的使用方法5.1request对象当客户访问服务器页面时,会提交一个HTTP请求。reauest对象就是对HTTP请求包的封装。因此,使用request对象的方法,可以获取客户端和服务器端信息。如客户端主机名、IP地址、传递参数名、参数值、服务器主机名和IP地址等等。1.HTTP请求包

一般说来,一个HTTP请求包括三个部分:一个请求行、多个请求头、信息体。请求行:规定了请求的方法(get、post、head、delete、put等)、请求的资源、使用的HTTP协议版本号。请求头:一个HTTP请求可以包括多个头。头主要说明请求客户的主机(IP)、信息体的附加信息。信息体:请求正文。如,表单数据被封装为信息体。下面是一个简单的HTTP请求包的组成:

get/hello.htmHTTP/1.1:请求行

Host:

:请求头

Name邓小平(数据组件接受的信息):信息体(表单中的数据信息)2.request对象的常用方法getProtocol()获取客户向服务器提交信息所使用的通讯协议。比如http/1.1等。getServletPath()获取客户请求的JSP页面文件的目录.getContentLength()获取客户提交的整个信息的长度.getMethod()获取客户提交信息的方式.比如post或get.getHeader(Strings)获取HTTP头文件中由参数S指定的头名字的值。一般来说s参数可取得头名有accept、referer、accept-language、content-type、accept-encoding、user-agent、host、content-length、connectiong、cookie等。比如,s取值user-agnet将获取客户的浏览器的版本号等信息。2.request对象的常用方法getHeaderNames()获取头名字的一个枚举。getHeaders(Strings)获取头文件中指定头名字的全部值的一个枚举。getRemoteAddr()获取客户的IP地址。getRemoteHost()获取客户机的名称(如果获取不到,就获取IP地址)。getServerName()获取服务器的名称。getServerPort()获取服务器的端口号。getParameterNames()获取客户提交的信息体部分的name参数值的一个枚举。

3.客户向服务器提交信息客户通常使用HTML表单向服务器的某个JSP页面提交信息。HTML表单的一般格式是:

<FORMmethod=get|postaction=”接受信的页面文件”>[接受数据的组件(0~n个)]

数据提交控件</FORM>5.1.1获取客户提交的信息[例子5.1]从客户端获取信息,并在另一窗口输出这些信息问题分析:在一个页面创建表单,提供信息输入窗口,在另一页面,使用request对象获取表单信息。程序结构:

ex5_1.jsp页面创建表单(信息输入窗口),用户提交信息后,页面定向到outInfo.jsp页面。页面交互关系如图5-1所示。

图5-1页面交互关系程序算法:

ex5_1.jsp:

创建一表单,包含一个文本控件和一个提交控件

outInfo.jsp1.获取文本框和提交控件的值

2.输出文本框和提交控件的值ex5_1.jsp页面outInfo.jsp页面提交

程序代码:

ex5_1.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><FORMaction="outInfo.jsp"method=postname=form><INPUTtype="text"name="boy"><INPUTTYPE="submit"value="提交"name="submit"></FORM></FONT></BODY></HTML>outInfo.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=4>

<!--获取客户端的表单信息--><%StringtextContent=request.getParameter("boy");bytec[]=textContent.getBytes("ISO-8859-1");

textContent=newString(c);StringbuttonName=request.getParameter("submit");byteb[]=buttonName.getBytes("ISO-8859-1");

buttonName=newString(b);%><!--将文本信息和按钮信息输出到客户端--><P><B>获取文本框提交的信息:</B><BR><%=textContent%><P><B>获取按钮的名字:</B><BR><%=buttonName%></FONT></BODY></HTML>5.1.2获取表单提交的数据

[例子5.2]网上单选问答题问题分析:由一个页面输出单选试题,由另一页面获取用户选择,统计考生得分。程序结构:

ex5_2.jsp页面将用户选择的答案提交给answer.jsp页面。页面交互关系如图5-2所示。ex5_2.jsp页面answer.jsp页面提交答案图5-2页面交互关系程序算法:

ex5_2.jsp:

创建一表单,包含两组单选按钮。

answer.jsp1.获取用户提交的答案2.与正确答案比较,统计得分3.输出考试结果

程序代码:

ex5_2.jsp:<HTML><%@pagecontentType="text/html;charset=GB2312"%><BODYbgcolor=cyan><FONTsize=4><FORMaction="answer.jsp"method=postname=form><P>诗人李白是中国历史上哪个朝代的人:<BR><INPUTtype="radio"name="r"value="a">宋朝

<INPUTtype="radio"name="r"value="b">唐朝

<INPUTtype="radio"name="r"value="c">明朝

<INPUTtype="radio"name="r"value="d"checked="ok">元朝

<P>小说红楼梦的作者是:<BR><INPUTtype="radio"name="P"value="a">曹雪芹

<INPUTtype="radio"name="P"value="b">罗贯中

<INPUTtype="radio"name="P"value="c">李白

<INPUTtype="radio"name="P"value="c"checked="">司马迁

<BR><INPUTTYPE="submit"value="提交答案"name="submit"></FORM></FONT></BODY></HTML>

answer.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><%

intn=0;Strings1=request.getParameter("r");Strings2=request.getParameter("P");if(s1==null){s1="";}if(s2==null){s2="";}if(s1.equals("b")){n++;}if(s2.equals("a")){n++;}%><P>您得了<%=n%>分</FONT></BODY></HTML>5.1.3用户注册[例子5.3]使用散列表,保存注册的用户名,实现用户注册问题分析:由一个页面创建一个接受用户名输入的窗口;另一页面获取用户名,实现用户注册。程序结构:本程序由两个JSP页面文件构成。ex5_3.jsp页面将用户名提交给login.jsp页面,login.jsp实现用户注册。两页面的交互关系如图5-3所示。ex5_3.jsp页面login.jsp页面注册图5-3页面交互关系程序算法:

ex5_3.jsp:

创建一表单,包含一个文本框,客户在此文本框中输入用户名。

login.jsp:1.创建一空的散列对象(hashtable)2.定义一方法putName(Strings),该方法以s为属性名和属性值,插入到散列对象(hashtable)中。3.从表单中获取用户名,若散列对象中没有注册过此用户名,则将(name,name)插入到散列对象中(表示实现了用户注册),否则,提示用户换个名字注册。

程序代码:ex5_3.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML> <BODY><fontsize=3><formaction="login.jsp"method=post><p>输入你的姓名:

<INPUTTYPE=TEXTNAME="name"value="abc"><br><inputtype="submit"name=submitvalue="注册"></form></font></body></html>5.1.4获取客户环境信息

[例子5.4]获取客户和服务器有关信息程序结构:本程序由两个页面构成,ex5_4.jsp页面提交客户信息给getInfo.jsp

页面。两页面的交互关系如图5-4所示。

程序算法:

ex5_4.jsp

创建一表单,包含一文本框。

getInfo.jsp1.输出环境信息2.输出表单信息ex5_4.jsp页面getInfo

.jsp页面提交图5-4页面交互关系程序代码:ex5_4.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3>

<FORMaction="getInfo.jsp"method=postname=form><INPUTtype="text"name="boy"><INPUTTYPE="submit"value="提交"name="submit"></FORM></FONT></BODY></HTML>5.2response对象客户访问服务器使用的是HTTP请求包,系统将HTTP请求包封装为request对象。服务器响应客户时,即向客户发送信息时,使用的是HTTP响应包

,系统将HTTP响应包封装为response对象。在JSP页面中,可以使用response对象的方法动态控制响应方式,向客户端发送数据。HTTP响应包与HTTP请求包结构类似。

1.HTTP响应包一般说来,一个HTTP响应包由三个部分组成:一个状态行、多个响应头、信息体。状态行:描述服务器处理HTTP请求的成功与否。比如,是否收到请求包、请求被拒绝、请求超时、服务器发生错误等等。响应头:HTTP响应包发送的目标地址(IP)信息体:发送到服务器端的正文。如,在客户端显示的信息。2.response对象常用的方法

addHeader(String

head,Stringvalue)向包里添加一个头(head)及对应值(value)

sendRedirect(URL

url)实现客户重定向

setStatus(intn)设置响应的状态代码。3.响应包的状态行服务器响应客户时,它发送到客户端的首行被称为状态行。状态行由3位数的状态代码和描述状态代码的文字组成。下面是对状态代码的分类描述:

1xx:1开头的3位数字,主要用于实验。

2xx:2开头的3位数字,表明客户端的请求已成功。

3xx:3开头的3位数字,表明处理客户的请求以前,应 做一些别的处理。

4xx:4开头的3位数字,表明浏览器请求是非法的或无 效的。

5xx:5开头的3位数字,表明服务器出现了问题。

我们一般不需要修改状态行,在出现问题时,服务器会自动响应,发送相应的状态代码到客户端。也可以使用setStatus(intn)方法来增加状态行的内容。4.状态代码表

下面是服务器响应客户时,发送到客户端的状态代码描述.状态代码代码说明101服务器正在升级协议100客户可以继续201请求成功且在服务器上创建了新的资源202请求已被接受但还没有处理完毕200请求成功203客户端给出的原信息不是发自服务器的204请求成功,但没有新信息状态代码代码说明205客户必须重置文档视图206服务器执行了部分get请求300请求的资源有多种表示301资源已经被永久移动到新位置302资源已经被临时移动到新位置303应答可以在另外一个URL中找到304Get方式请求不可用305请求必须通过代理来访问状态代码代码说明400请求由语法错误401请求需要HTTP认证403取得了请求但拒绝服务404请求的资源部可用405请求所用的方法是不允许的406请求的资源只能用请求不能接受的内容特性来响应407客户必须得到认证408请求超时状态代码代码说明409发生冲突,请求不能完成410请求的资源已经不可用411请求需要一个定义的内容长度才能处理413请求太大,被拒绝414请求的URL太大415请求的格式被拒绝状态代码代码说明500服务器发生内部错误,不能服务501不支持请求的部分功能502从代理和网关接受了不合法的字符503HTTP服务暂时不可用504服务器在等待代理服务器应答时发生超时505不支持请求的HTTP版本5.2.1不支持请求的HTTP版本[例子5.5]向客户端输出word类型的文件问题分析:

本题实际上要求设置page指令contentType属性的值为:application/msword程序结构:

程序代码:ex5_5.jsp程序算法:

1.创建表单

2.获取表单提交按钮的值

3.若提交按钮的值是”保存”,则将page指令的contentType属性的值设为:"application/msword;charset=GB2312",即改变文件输出类型为msword。5.2.2控制网页的刷新频率[例子5.6]在页面中,实时显示当前时间问题分析:要实时显示当前时间,必须每秒钟刷新一次页面,这就要求向客户输出的响应包中,必须含有响应头”Refresh”,其值为1,单位是秒。程序结构:程序名:ex5_6.jsp程序算法:

1.输出当前时间

2.添加响应头”Refresh”,其值是1。

程序代码:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODYbgcolor=cyan><center><FONTsize=3color=red><p>现在的时间是:<br><%

out.println(""+newDate());response.setHeader("Refresh","1");%></FONT></center></BODY></HTML>5.3.3网页重定向[例子5.7]实现从一个网页到另一个网页的重定向程序结构:本程序由两个JSP页面文件构成。ex5_7.jsp页面向redirect.jsp页面提供姓名信息。两个页面的交互关系如图5-5所示。ex5_7.jsp页面redirect.

.jsp页面网页重定向图5-5页面交互关系程序算法:

ex5_7.jsp:

创建一表单,包含用于输入姓名的文本框。

redirect.jsp1.获取表单的姓名信息

2.对姓名进行编码

3.如果姓名为空字符串,则重新定向到ex5_7.jsp页面,否则输出相应的信息。程序代码:ex5_7.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><P>填写姓名:<BR><FORMaction="redirect.jsp"method="get"name=form><INPUTTYPE="text"name="boy"><INPUTTYPE="submit"value="网页重定向"></FORM></BODY></HTML>5.2.4显示通讯状态[例子5.8]设置响应的状态行程序结构:本程序由三个JSP页面文件构成。页面ex5_8.jsp通过超级链接,分别链接到status1.jsp页面、staus2.jsp页面、staus3.jsp页面。

程序代码:

ex5_8.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><P>单击下面的超级链接:<BR><AHREF="staus1.jsp">状态行表示请求超时<BR><AHREF="staus2.jsp">状态行表示请求成功<BR><AHREF="staus3.jsp">状态行表示服务器内部错</FONT></BODY></HTML>

status1.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%response.setStatus(408);

out.print("不显示了");%></BODY></HTML>staus2.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%response.setStatus(200);out.println("ok");%></BODY></HTML>

staus3.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%response.setStatus(500);%></BODY></HTML>5.3session对象客户与服务器的通讯是通过HTTP协议完成的。但是,HTTP协议是一种无状态协议。即,一个客户向服务器发送请求(request),然后服务器返回响应(response),连接就关闭了。服务器端不保留客户与服务器每一次连接的信息,因此,服务器无法判断上下两次连接是否是同一客户。要想记住客户的连接信息,必须使用会话对象(session)。session对象记录了每个客户与服务器的连接信息。1.会话从一个客户打开浏览器连接到服务器的某个服务目录(这其间,客户访问的是同一web目录中的网页),到客户关闭浏览器,这一过程称为一个会话。这时,在服务器端,系统为该客户创建了一个session对象。在客户端,系统为该客户创建了Cookie对象。一个客户对同一服务目录中不同网页的访问属于同一会话。2.客户的session对象与服务目录当一个客户首次访问服务目录中的一个JSP页面时,JSP引擎为该客户创建一个session对象。同一客户访问的服务目录不同,JSP引擎为该客户创建不同的session对象。从时间上看,若客户离开先前的服务目录,连接到其它服务器或者服务目录,当再次回到先前服务目录时,JSP引擎不再给客户分配新的session对象,而是使用先前的session对象。只有当客户关闭浏览器或这个session对象达到了最大生存时间,该客户的session对象才被取消,这时服务器与客户的会话关系消失。3.Session对象与Cookie

当JSP引擎为客户创建一个session对象后,这个session对象被分配了一个String类型的ID号,JSP引擎同时将此ID号发送到客户端,存放在Cookie中.这样,代表同一客户会话的session对象和Cookie对象建立了一一对应关系.即,每一客户会话信息保存在session/Cokkie对中.4.Session对象与线程当多个客户点击同一页面时,JSP引擎为每个客户启动一个线程,这就是说,一个客户对应一个线程,每个线程对应一个session对象,每个线程的session对象不同。5.Session对象生命周期从一个客户会话开始到会话结束这段时间称为session对象的生命周期。具体上说,指客户访问某web目录下的页面到关闭浏览器,离开该web目录,这段时间成为session对象的生命周期。6.Session对象的常用方法publicvoidsetAttribute(String

key.Object

obj)

session对象类似于散列表,可以调用该方法将参数Object指定的对象obj添加到session对象中,并为添加的对象指定了一个索引关键字。如果添加的两个对象的关键字相同,则先前添加的对象被清除。publicObjectgetAttibue(Stringkey)

获取session对象中含有的关键字是key的对象。由于任何对象都可以添加到session对象中,因此用该方法取回对象是,应强制转化为原来的类型。publicEnumerationgetAttributeName()

session对象调用该方法产生一个枚举对象。该枚举对象使用nextElemets()方法遍历session对象所含有的全部对象。publiclonggetCreationTime()

session对象调用该方法可以获取该对象创建的时间。单位是毫秒(从1970年7月1日午夜起至该对象创建时刻所走过的毫秒数)。publiclonggetLastAccessedTime()

获取当前session对象最后一次被操作的时间,单位是毫秒publicint

getMaxInactiveInterval()

获取session对象的生存时间publicvoidsetMaxInactiveInterval(intn)

设置session对象的生存时间(单位是秒)publicvoidremoveAttribue(Stringkey)

从当前session对象中删除关键字是key的对象。publicStringgetId()

获取session对象的编号invalidate()

使session对象无效publicboolean

isNew()

判断是否是一个新的客户5.3.1显示客户会话ID[例子5.9]同一客户访问两个不同的web目录中的页面,查看该客户在不同web目录中的session对象的ID号。问题分析:创建两个web目录,并在其中部署JSP页面,然后通过表单或超连接,将两个web目录中的页面连接起来。程序结构:本程序由四个JSP页面文件构成。三个页面ex5_9.jsp、liu.jsp、wang.jsp部署在目录e:/test/5下面;file.jsp页面部署在目录e:/test/6下面。下面是四个页面的交互关系如图5-6所示。图5-6页面交互关系ex5_9.jsp页面liu.jsp页面网页重定向wang.jsp页面超链接file.jsp页面超链接超链接程序算法:

ex5_9.jsp:1.获取访问本页面的客户的session对象ID号

2.输出ID号

3.创建表单,该表单提交时,将信息提交给liu.jsp页面

4.在创建表单,该表单提交时,将信息提交给file.jsp页面

liu.jsp:1.获取访问本页面的客户的session对象ID号

2.输出ID号

3.设置超链接,链接到wang.jsp页面

wang.jsp:1.获取访问本页面的客户的session对象ID号

2.输出ID号

3.设置超链接,链接到ex5_9.jsp页面

file.jsp:1.获取访问本页面的客户的session对象ID号

2.输出ID号

3.设置超链接,链接到ex5_9.jsp页面程序代码:

ex5_9.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><P><%Strings=session.getId();Stringstr=response.encodeURL("liu.jsp");%><P>您在访问ex5_9.jsp页面<br><br>

你的session对象的ID是:<br><br><%=s%><BR><FORMaction="<%=str%>"method=postname=form><INPUTTYPE="submit"value="转向liu页面"name=submit></FORM><FORMaction="../6/file.jsp"method=postname=form><INPUTTYPE="submit"value="转向file页面"name=submit></FORM></BODY></HTML>

liu.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY>

<%Strings=session.getId();Stringstr=response.encodeURL("wang.jsp");%><P>你在访问liu页面<br><br>

您的session对象的ID是:<br><br><%=s%>

<p>单击超连接,连接到wang页面<BR><AHREF="<%=str%>">欢迎到wang页面来!</A>

</BODY></HTML>

wang.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY><%Strings=session.getId();Stringstr=response.encodeURL("ex5_9.jsp");%><P>你在访问wang页面<br><br>

您的session对象的ID是:<br><br><%=s%>

<p>单击超连接,连接到ex5_9页面<BR><AHREF="<%=str%>">欢迎到ex5_9页面来!</A></BODY></HTML>

file.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODY>

<%Strings=session.getId();%><P>你在访问file页面<br><br>

您的session对象的ID是:<br><br><%=s%><P>单击超链接,返回到ex5_9页面<BR><AHREF="../5/ex5_9.jsp">欢迎到ex5_9页面来!</A></BODY></HTML>5.3.2信息的保存和获取[例子5.10]将购买者的姓名、商品名保存在session对象中,实现同一web目录下的页面对session对象中的信息共享。问题分析:创建三个页面,第一个页面输入姓名,第二个页面输入商品名,第三个页面实现结帐处理。程序结构:本程序包含三个JSP页面文件,三个页面文件保存在同一web目录中。ex5_10.jsp页面接受姓名录入,并将姓名提交给first.jsp页面;first.jsp页面接受商品名的录入,并将商品名提交给account.jsp页面。三个页面的交互关系如图5-7所示。ex5_10.jsp页面first.

.jsp页面提交姓名account.jsp页面提交商品名图5-7页面交互关系程序算法:

ex5_10.jsp:

创建一个包含文本控件的表单,用此文本控件录入姓名

first.jsp:

1.获取客户端输入的姓名(xm)

2.将"属性名-值"对,即("name",xm)添加到session对象中

3.创建一个包含文本控件的表单,用此文本控件录入商品名

account.jsp:1.定义一个对字符串s进行编码的方法:publicStringgetString(Strings)

2.获取客户端录入的商品名(sp)

3.将"属性名-值"对,即("goods",sp)添加到session对象中4.从session对象中获取姓名和商品名5.将姓名和商品名输出到客户端程序代码:

ex5_10.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3>

<P>输入您的姓名连接到第一百货(first.jsp)<FORMaction="first.jsp"method=postname=form><INPUTtype="text"name="buy_name"><INPUTTYPE="submit"value="提交姓名"name=submit></FORM></BODY></HTML>

first.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTsize=3><%Stringxm=request.getParameter("buy_name");

session.setAttribute("name",xm);%><P>这里是第一百货

<P>输入您想购买的商品连接到结帐(account.jsp)<FORMaction="account.jsp"method=postname=form><INPUTtype="text"name="shangpin"><INPUTTYPE="submit"value="提交商品名"name=submit></FORM></BODY></HTML>

account.jsp:<%@pagecontentType="text/html;charset=GB2312"%><HTML><BODYbgcolor=cyan><FONTSize=3><%!//处理字符串的方法

publicStringgetString(Strings){

if(s==null){s="";}try{byteb[]=s.getBytes("ISO-8859-1");s=newString(b);}

catch(Exceptione){}returns;}%>

<%Stringsp=request.getParameter("shangpin");

session.setAttribute("goods",sp);%>

<%Stringxinming=(String)session.getAttribute("name");Stringshangpin=(String)session.getAttribute("goods");

xinming=getString(xinming);//对姓名进行编码

shangpin=getString(shangpin);//对商品名进行编码

%><P>这里是结帐处

<P>顾客的姓名是:<%=xinming%><P>您选择购买的商品是:<%=shangpin%></BODY></HTML>5.3.3计数器[例子5.11]统计访问页面的客户数。第4章的[例子4.2]讲述过这种例子,那个例子的缺陷是客户可以通过不断刷新页面增加计数器。在这个例子里,使用session对象的isNew()方法解决这一问题。问题分析:由于客户刷新页面时,session对象的ID号不会改变。当客户刷新页面时,让程序检查客户的session

对象是不是一个新的session对象,若是新的session对象,才增加计数器的值。程序结构:程序名:ex5_11.jsp程序算法:

1.定义计数器number,用于统计访问页面的客户数

2.定义同步方法synchronizedvoidcountPeople(),该方法使计数器number加1,并将number的值保存在文本文件count.txt中。

3.判断访问客户的session对象是否是新的,若是新的session对象,则调用方法countPeople(),计数器加1。4.输出计数器的值5.4application对象我们已经知道,不同的客户与服务器连接时有不同的session对象,同一客户浏览同一服务器的不同目录时,有不同的session对象。与session对象不同的是application对象。服务器启动后,就产生了application对象。所有客户的application对象是相同的一个,即,所有客户共享这个内置的application对象。application对象生命期

application对象随着服务器启动而创建,随着服务器关闭而消失。application对象的生命周期指从application对象创建到服务器关闭这段时间。application对象与线程当多个客户点击同一页面时,JSP引擎为每个客户启动一个线程,这些线程共享同一个application对象.由于所有客户共享同一个application对象,任何客户对application对象中数据的改变都会影响到其它的客户,因此,对该对象的操作需要实现同步处理。application对象的常用方法publicvoidsetAttribute(String

key,Object

obj)

application对象可以调用该方法将参数Object指定的对象obj添加到application对象中,并为添加的对象指定一个索引关键字。如果添加的两个对象的关键字相同,则先前添加的对象被清除。publicObjectgetAttibue(Stringkey)

获取application对象中含有的关键字key的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时,应强制转化为原来的类型。publicEnumerationgetAttributeNames()

application对象条用该方法产生一个枚举对象。该枚举对象使用nextElemets()方法遍历application对象所含有的全部对象。publicvoidremoveAttribue(Stringkey)

从当前application对象中删除关键字是key的对象。publicStringgetServletInfo()

获取Servlet编译器的当前版本信息。注意:有些服务器不直接支持使用application对象,必须先用ServletContext

类声明这个对象,再使用getServletContext()方法对这个application对象初始化5.4.1读取系统信息[例子5.12]输出本页面所在的实际路径、使用的JSP引擎、application对象对应的字符串。程序结构:

程序名:ex5_12.jsp

程序代码:<%@pagecontentType="text/html;charset=GB2312"%><html><body><center><h1>读取系统信息</h1><%Stringpath="/ex5_12.jsp";

out.print("context数据的内容:");

out.print(application.getContext(path)+"<p>");//读取path路径中的//ServletContext

out.print("文件的格式:");

out.print(application.getMimeType(path)+"<p>");

out.print("本页面文件的实际路径:");out.print(application.getRealPath(path)+"<p>");//通过相对路径//获得实际路径

out.print("jsp引擎:");

out.print(getServletInfo()+"<p>");//当前jsp引擎

out.print("application对象ID:"+getServletContext()+"<p>");%></center></body></html>5.4.2制作留言板[例子5.13]要求使用三个页面来实现留言的功能。一个页面提供留言输入窗口;一个页面获取当前留言,并将留言添加到向量中;一个页面将向量中的所有客户留言输出到客户端。问题分析:由于三个页面共享同一个session对象,这样,把客户的每次留言以字符串的方式添加到向量中,再把向量添加到session对象中。当客户查看留言时,首先把向量从session对象中取出,然后把向量中的所有留言输出到客户端。程序结构:本程序由三个JSP页面文件构成。ex5_13.jsp页面提供留言输入窗口;messagePane.jsp页面获取留言窗口的字符串,将字符串添加到向量中,再把向量添加到session对象中;showMessage.jsp页面把向量中的所有留言输出到客户端。三个页面的交互关系如图5-8所示。ex5_13.jsp页面MessagePane.jsp页面提交留言ShowMessage.jsp页面返回查看留言图5-7页面交互关系程序算法:

ex5_13.jsp:

创建一个表单,包含三个信息输入控件

messagePane.jsp:

1.定义并创建一个向量v

2.定义一个方法synchronizedvoidsendMessage(Strings),该方法把字符串添加到向量v中,然后把v添加到application对象中。

3.获取留言板信息,并构造成字符串:s4.调用方法sendMessage(s),把字符串添加到application对象中的向量v中。

showMessage.jsp:

1.从application对象中获取向量v2.将v中每一元素作为一条记录输出到客户端程序代码:

ex5_13.jsp:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODY><FORMaction="messagePane.jsp"method="post"name="form"><P>输入您的名字:

<INPUTtype="text"name="peopleName"><BR><P>输入您的留言标题:

<INPUTtype="text"name="Title"><BR><P>输入您的留言:<BR><TEXTAREAname="messages"ROWs="10"COLS=36WRAP="physical"></TEXTAREA><BR><INPUTtype="submit"value="提交留言"name="submit"></FORM><FORMaction="showMessage.jsp"method="post"name="forml"><INPUTtype="submit"value="查看留言"name="look"></FORM></BODY></HTML>messagePane.jsp:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODY><%!Vectorv=newVector();

ServletContextapplication;synchronizedvoidsendMessage(Strings){

v.add(s);application=getServletContext();

application.setAttribute("Mess",v);}%><%Stringname=request.getParameter("peopleName");Stringtitle=request.getParameter("Title");Stringmessages=request.getParameter("messages");

if(name==null){name="guest"+(int)(Math.random()*10000);}

if(title==null){title="无标题";}

if(messages==null){messages="无信息";}Stringtime=newDate().toString();Strings="#"+name+"#"+title+"#"+time+"#"+messages+"#";

sendMessage(s);

out.print("您的信息已经提交!");//字符串信息保存在application对象中

%><AHREF="ex5_13.jsp">返回</A><BODY></HTML>showMessage.jsp:<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.util.*"%><HTML><BODY><%Vectorv=(Vector)application.getAttribute("Mess");

out.print("<tableborder=2>");

out.print("<tr>");

out.print("<th

bgcol

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论