Download presentation
Presentation is loading. Please wait.
Published by辛 韩 Modified 7年之前
1
第五章 JSP内置对象 第4章学习了页面组成元素和使用方法。本章学习JSP内置对象的使用。使用JSP内置对象,可以方便操作页面,访问页面环境,实现页面内、页面间、页面与环境之间的通讯。 学习目标 熟悉主要内置对象的概念 理解主要内置对象的作用域和生命期 理解主要内置对象的作用和关系 熟悉主要内置对象的使用方法
2
5.1 request对象 当客户访问服务器页面时,会提交一个HTTP请求。reauest对象就是对HTTP请求包的封装。因此,使用request对象的方法,可以获取客户端和服务器端信息。如客户端主机名、IP地址、传递参数名、参数值、服务器主机名和IP地址等等。
3
1.HTTP请求包 请求行:规定了请求的方法(get、post、head、delete、put等)、请求的资源、使用的HTTP协议版本号。
一般说来,一个HTTP请求包括三个部分:一个请求行、多个请求头、信息体。 请求行:规定了请求的方法(get、post、head、delete、put等)、请求的资源、使用的HTTP协议版本号。 请求头:一个HTTP请求可以包括多个头。头主要说明请求客户的主机(IP)、信息体的附加信息。 信息体:请求正文。如,表单数据被封装为信息体。 下面是一个简单的HTTP请求包的组成: get/hello.htm HTTP/ :请求行 Host: :请求头 Name 邓小平 (数据组件接受的信息) :信息体(表单中的数据信息)
4
2.request对象的常用方法 getProtocol() 获取客户向服务器提交信息所使用的通讯协议。比如http/1.1等。 getServletPath() 获取客户请求的JSP页面文件的目录. getContentLength() 获取客户提交的整个信息的长度. getMethod() 获取客户提交信息的方式.比如post或get. getHeader(String s) 获取HTTP头文件中由参数S指定的头名字的值。一般来说s参数可取得头名有accept、referer、accept-language、content-type、accept-encoding、user-agent、host、content-length、connectiong、cookie等。比如,s取值user-agnet将获取客户的浏览器的版本号等信息。
5
2.request对象的常用方法 getHeaderNames() 获取头名字的一个枚举。 getHeaders(String s) 获取头文件中指定头名字的全部值的一个枚举。 getRemoteAddr() 获取客户的IP地址。 getRemoteHost() 获取客户机的名称(如果获取不到,就获取IP地址)。 getServerName() 获取服务器的名称。 getServerPort() 获取服务器的端口号。 getParameterNames() 获取客户提交的信息体部分的name参数值的一个枚举。
6
客户通常使用HTML表单向服务器的某个JSP页面提交信息。HTML表单的一般格式是:
3.客户向服务器提交信息 客户通常使用HTML表单向服务器的某个JSP页面提交信息。HTML表单的一般格式是: <FORM method=get |post action=” 接受信的页面文件” > [接受数据的组件(0~n个)] 数据提交控件 </FORM>
7
5.1.1获取客户提交的信息 [例子5.1]从客户端获取信息,并在另一窗口输出这些信息
问题分析: 在一个页面创建表单,提供信息输入窗口,在另一页面,使用request对象获取表单信息。 程序结构: ex5_1.jsp页面创建表单(信息输入窗口),用户提交信息后,页面定向到outInfo.jsp页面。页面交互关系如图5-1所示。
8
创建一表单,包含一个文本控件和一个提交控件 outInfo.jsp 1.获取文本框和提交控件的值 2.输出文本框和提交控件的值
ex5_1.jsp 页面 outInfo.jsp 提交 图5-1 页面交互关系 程序算法: ex5_1.jsp: 创建一表单,包含一个文本控件和一个提交控件 outInfo.jsp 1.获取文本框和提交控件的值 2.输出文本框和提交控件的值
9
程序代码: ex5_1.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan> <FONT size=3> <FORM action="outInfo.jsp" method=post name=form> <INPUT type="text" name="boy"> <INPUT TYPE="submit" value="提交" name="submit"> </FORM> </FONT> </BODY> </HTML>
10
outInfo.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan> <FONT size=4> <!--获取客户端的表单信息--> <% String textContent=request.getParameter("boy"); byte c[]=textContent.getBytes("ISO "); textContent=new String(c); String buttonName=request.getParameter("submit"); byte b[]=buttonName.getBytes("ISO "); buttonName=new String(b); %>
11
<!--将文本信息和按钮信息输出到客户端-->
<P><B>获取文本框提交的信息:</B><BR> <%=textContent%> <P><B>获取按钮的名字:</B> <BR> <%=buttonName %> </FONT> </BODY> </HTML>
12
5.1.2获取表单提交的数据 [例子5.2]网上单选问答题 由一个页面输出单选试题,由另一页面获取用户选择,统计考生得分。
问题分析: 由一个页面输出单选试题,由另一页面获取用户选择,统计考生得分。 程序结构: ex5_2.jsp页面将用户选择的答案提交给answer.jsp页面。页面交互关系如图5-2所示。 ex5_2.jsp 页面 answer.jsp 提交答案 图5-2 页面交互关系
13
ex5_2.jsp: 创建一表单,包含两组单选按钮。 answer.jsp 1.获取用户提交的答案 2.与正确答案比较,统计得分
程序算法: ex5_2.jsp: 创建一表单,包含两组单选按钮。 answer.jsp 1.获取用户提交的答案 2.与正确答案比较,统计得分 3.输出考试结果
14
程序代码: ex5_2.jsp: <HTML> page contentType="text/html;charset=GB2312" %> <BODY bgcolor=cyan> <FONT size=4> <FORM action="answer.jsp"method=post name=form> <P>诗人李白是中国历史上哪个朝代的人: <BR> <INPUT type="radio" name="r" value="a">宋朝 <INPUT type="radio" name="r" value="b">唐朝 <INPUT type="radio" name="r" value="c">明朝 <INPUT type="radio" name="r" value="d" checked="ok">元朝 <P>小说红楼梦的作者是: <BR> <INPUT type="radio" name="P" value="a">曹雪芹 <INPUT type="radio" name="P" value="b">罗贯中 <INPUT type="radio" name="P" value="c">李白 <INPUT type="radio" name="P" value="c" checked="" >司马迁 <BR> <INPUT TYPE="submit" value="提交答案" name="submit"> </FORM> </FONT> </BODY> </HTML>
15
answer.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan><FONT size=3> <% int n=0; String s1=request.getParameter("r"); String s2=request.getParameter("P"); if(s1==null) {s1="";} if(s2==null) {s2="";} if(s1.equals("b")) { n++;} if(s2.equals("a")) %> <P>您得了<%=n%>分 </FONT> </BODY> </HTML>
16
5.1.3 用户注册 [例子5.3]使用散列表,保存注册的用户名,实现用户注册
用户注册 [例子5.3]使用散列表,保存注册的用户名,实现用户注册 问题分析: 由一个页面创建一个接受用户名输入的窗口;另一页面获取用户名,实现用户注册。 程序结构: 本程序由两个JSP页面文件构成。ex5_3.jsp页面将用户名提交给login.jsp页面,login.jsp实现用户注册。两页面的交互关系如图5-3所示。 注册 ex5_3.jsp 页面 login.jsp 图5-3 页面交互关系
17
创建一表单,包含一个文本框,客户在此文本框中输入用户名。 login.jsp: 1.创建一空的散列对象(hashtable)
程序算法: ex5_3.jsp: 创建一表单,包含一个文本框,客户在此文本框中输入用户名。 login.jsp: 1.创建一空的散列对象(hashtable) 2.定义一方法putName(String s),该方法以s 为属性名和属性值,插入到散列对象(hashtable)中。 3.从表单中获取用户名,若散列对象中没有注册过此用户名,则将(name,name)插入到散列对象中(表示实现了用户注册),否则,提示用户换个名字注册。
18
程序代码: ex5_3.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <font size=3> <form action="login.jsp" method=post> <p> 输入你的姓名: <INPUT TYPE=TEXT NAME="name" value="abc"> <br> <input type="submit" name=submit value="注册"> </form> </font> </body> </html>
19
5.1.4获取客户环境信息 程序结构: 程序算法: [例子5.4]获取客户和服务器有关信息
本程序由两个页面构成,ex5_4.jsp页面提交客户信息给getInfo.jsp 页面。两页面的交互关系如图5-4所示。 程序算法: ex5_4.jsp 创建一表单,包含一文本框。 getInfo.jsp 1.输出环境信息 2.输出表单信息 ex5_4.jsp 页面 getInfo .jsp 提交 图5-4 页面交互关系
20
程序代码: ex5_4.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan><FONT size=3> <FORM action="getInfo.jsp" method=post name=form> <INPUT type="text" name="boy"> <INPUT TYPE="submit" value="提交" name="submit"> </FORM> </FONT> </BODY> </HTML>
21
5.2 response对象 客户访问服务器使用的是HTTP请求包,系统将HTTP请求包封装为request对象。服务器响应客户时,即向客户发送信息时,使用的是HTTP响应包 ,系统将HTTP响应包封装为response对象。在JSP页面中,可以使用response对象的方法动态控制响应方式,向客户端发送数据。HTTP响应包与HTTP请求包结构类似。
22
1.HTTP响应包 一般说来,一个HTTP响应包由三个部分组成:一个状态行、多个响应头、信息体。 状态行:描述服务器处理HTTP请求的成功与否。比如,是否收到请求包、请求被拒绝、请求超时、服务器发生错误等等。 响应头:HTTP响应包发送的目标地址(IP) 信息体:发送到服务器端的正文。如,在客户端显示的信息。
23
2.response对象常用的方法 addHeader(String head,String value) 向包里添加一个头(head)及对应值(value) sendRedirect(URL url) 实现客户重定向 setStatus(int n) 设置响应的状态代码。
24
3.响应包的状态行 服务器响应客户时,它发送到客户端的首行被称为状态行。状态行由3位数的状态代码和描述状态代码的文字组成。下面是对状态代码的分类描述: 1xx :1开头的3位数字,主要用于实验。 2xx :2开头的3位数字,表明客户端的请求已成功。 3xx :3开头的3位数字,表明处理客户的请求以前,应 做一些别的处理。 4xx :4开头的3位数字,表明浏览器请求是非法的或无 效的。 5xx :5开头的3位数字,表明服务器出现了问题。 我们一般不需要修改状态行,在出现问题时,服务器会自动响应,发送相应的状态代码到客户端。也可以使用setStatus(int n)方法来增加状态行的内容。
25
4.状态代码表 下面是服务器响应客户时,发送到客户端的状态代码描述.
代码说明 101 服务器正在升级协议 100 客户可以继续 201 请求成功且在服务器上创建了新的资源 202 请求已被接受但还没有处理完毕 200 请求成功 203 客户端给出的原信息不是发自服务器的 204 请求成功,但没有新信息
26
状态代码 代码说明 205 客户必须重置文档视图 206 服务器执行了部分get请求 300 请求的资源有多种表示 301 资源已经被永久移动到新位置 302 资源已经被临时移动到新位置 303 应答可以在另外一个URL中找到 304 Get方式请求不可用 305 请求必须通过代理来访问
27
状态代码 代码说明 400 请求由语法错误 401 请求需要HTTP认证 403 取得了请求但拒绝服务 404 请求的资源部可用 405 请求所用的方法是不允许的 406 请求的资源只能用请求不能接受的内容特性来响应 407 客户必须得到认证 408 请求超时
28
状态代码 代码说明 409 发生冲突,请求不能完成 410 请求的资源已经不可用 411 请求需要一个定义的内容长度才能处理 413 请求太大,被拒绝 414 请求的URL太大 415 请求的格式被拒绝
29
状态代码 代码说明 500 服务器发生内部错误,不能服务 501 不支持请求的部分功能 502 从代理和网关接受了不合法的字符 503 HTTP服务暂时不可用 504 服务器在等待代理服务器应答时发生超时 505 不支持请求的HTTP版本
30
5.2.1 不支持请求的HTTP版本 [例子5.5]向客户端输出word类型的文件
问题分析: 本题实际上要求设置page指令contentType属性的值为:application/msword 程序结构: 程序代码:ex5_5.jsp 程序算法: 1.创建表单 2.获取表单提交按钮的值 3.若提交按钮的值是”保存”,则将page指令的 contentType属性的值设为:"application/msword;charset=GB2312",即改变文件输出类型为msword。
31
5.2.2 控制网页的刷新频率 [例子5.6]在页面中,实时显示当前时间
控制网页的刷新频率 [例子5.6]在页面中,实时显示当前时间 问题分析: 要实时显示当前时间,必须每秒钟刷新一次页面,这就要求向客户输出的响应包中,必须含有响应头”Refresh”,其值为1,单位是秒。 程序结构: 程序名:ex5_6.jsp 程序算法: 1.输出当前时间 2.添加响应头”Refresh”,其值是1。
32
程序代码: page contentType="text/html;charset=GB2312" %> page import="java.util.*"%> <HTML> <BODY bgcolor=cyan> <center> <FONT size=3 color=red> <p>现在的时间是:<br> <% out.println(" "+new Date()); response.setHeader("Refresh","1"); %> </FONT> </center> </BODY> </HTML>
33
5.3.3 网页重定向 [例子5.7]实现从一个网页到另一个网页的重定向
程序结构: 本程序由两个JSP页面文件构成。ex5_7.jsp页面向redirect.jsp页面提供姓名信息。两个页面的交互关系如图5-5所示。 ex5_7.jsp 页面 redirect. .jsp 网页重定向 图5-5 页面交互关系
34
3.如果姓名为空字符串,则重新定向到 ex5_7.jsp页面,否则输出相应的信息。
程序算法: ex5_7.jsp: 创建一表单,包含用于输入姓名的文本框。 redirect.jsp 1.获取表单的姓名信息 2.对姓名进行编码 3.如果姓名为空字符串,则重新定向到 ex5_7.jsp页面,否则输出相应的信息。
35
程序代码: ex5_7.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY > <P>填写姓名:<BR> <FORM action="redirect.jsp" method="get" name=form> <INPUT TYPE="text" name="boy"> <INPUT TYPE="submit" value="网页重定向"> </FORM> </BODY> </HTML>
36
显示通讯状态 [例子5.8]设置响应的状态行 程序结构: 本程序由三个JSP页面文件构成。页面ex5_8.jsp通过超级链接,分别链接到status1.jsp页面、staus2.jsp页面、staus3.jsp页面。
37
<%@ page contentType="text/html;charset=GB2312" %> <HTML>
程序代码: ex5_8.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan><FONT size=3> <P>单击下面的超级链接:<BR> <A HREF="staus1.jsp"> 状态行表示请求超时 <BR> <A HREF="staus2.jsp"> 状态行表示请求成功 <A HREF="staus3.jsp"> 状态行表示服务器内部错 </FONT> </BODY> </HTML>
38
status1.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <% response.setStatus(408); out.print("不显示了"); %> </BODY> </HTML>
39
staus2.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <% response.setStatus(200); out.println("ok"); %> </BODY> </HTML>
40
staus3.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <% response.setStatus(500); %> </BODY> </HTML>
41
5.3 session对象 客户与服务器的通讯是通过HTTP协议完成的。但是,HTTP协议是一种无状态协议。即,一个客户向服务器发送请求(request),然后服务器返回响应(response),连接就关闭了。服务器端不保留客户与服务器每一次连接的信息,因此,服务器无法判断上下两次连接是否是同一客户。要想记住客户的连接信息,必须使用会话对象(session)。session对象记录了每个客户与服务器的连接信息。
42
1.会话 从一个客户打开浏览器连接到服务器的某个服务目录(这其间,客户访问的是同一web目录中的网页),到客户关闭浏览器,这一过程称为一个会话。这时,在服务器端,系统为该客户创建了一个session对象。在客户端,系统为该客户创建了Cookie对象。一个客户对同一服务目录中不同网页的访问属于同一会话。 2.客户的session对象与服务目录 当一个客户首次访问服务目录中的一个JSP页面时,JSP引擎为该客户创建一个session对象。同一客户访问的服务目录不同,JSP引擎为该客户创建不同的session对象。从时间上看,若客户离开先前的服务目录,连接到其它服务器或者服务目录,当再次回到先前服务目录时,JSP引擎不再给客户分配新的session对象,而是使用先前的session对象。只有当客户关闭浏览器或这个session对象达到了最大生存时间,该客户的session 对象才被取消,这时服务器与客户的会话关系消失。
43
3.Session对象与Cookie 4.Session对象与线程 5.Session对象生命周期
当JSP引擎为客户创建一个session对象后,这个session对象被分配了一个String类型的ID号,JSP引擎同时将此ID号发送到客户端,存放在Cookie中.这样,代表同一客户会话的session对象和Cookie对象建立了一一对应关系.即,每一客户会话信息保存在session/Cokkie对中. 4.Session对象与线程 当多个客户点击同一页面时,JSP引擎为每个客户启动一个线程,这就是说,一个客户对应一个线程,每个线程对应一个session对象,每个线程的session对象不同。 5.Session对象生命周期 从一个客户会话开始到会话结束这段时间称为session对象的生命周期。具体上说,指客户访问某web目录下的页面到关闭浏览器,离开该web目录,这段时间成为session对象的生命周期。
44
6.Session对象的常用方法 public void setAttribute(String key.Object obj) session 对象类似于散列表,可以调用该方法将参数Object指定的对象obj添加到session对象中,并为添加的对象指定了一个索引关键字。如果添加的两个对象的关键字相同,则先前添加的对象被清除。 public Object getAttibue(String key) 获取session对象中含有的关键字是key的对象。由于任何对象都可以添加到session对象中,因此用该方法取回对象是,应强制转化为原来的类型。
45
public Enumeration getAttributeName()
public Enumeration getAttributeName() session 对象调用该方法产生一个枚举对象。该枚举对象使用nextElemets()方法遍历session对象所含有的全部对象。 public long getCreationTime() session对象调用该方法可以获取该对象创建的时间。单位是毫秒(从1970年7月1日午夜起至该对象创建时刻所走过的毫秒数)。 public long getLastAccessedTime() 获取当前session对象最后一次被操作的时间,单位是毫秒
46
public int getMaxInactiveInterval() 获取session对象的生存时间
public void setMaxInactiveInterval(int n) 设置session对象的生存时间(单位是秒) public void removeAttribue(String key) 从当前session对象中删除关键字是key的对象。 public String getId() 获取session对象的编号 invalidate() 使session对象无效 public boolean isNew() 判断是否是一个新的客户
47
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所示。
48
ex5_9.jsp 页面 liu.jsp 页面 wang.jsp 页面 file.jsp 页面
网页重定向 ex5_9.jsp 页面 超链接 liu.jsp 页面 wang.jsp 页面 超链接 超链接 file.jsp 页面 图5-6 页面交互关系
49
程序算法: ex5_9.jsp: 1.获取访问本页面的客户的session对象ID号 2.输出ID号
3.创建表单,该表单提交时,将信息提交给liu.jsp页面 4.在创建表单,该表单提交时,将信息提交给file.jsp页面 liu.jsp: 3.设置超链接,链接到wang.jsp页面 wang.jsp: 1.获取访问本页面的客户的session对象ID号 2.输出ID号 3.设置超链接,链接到ex5_9.jsp页面 file.jsp:
50
程序代码: <%@ page contentType="text/html;charset=GB2312" %>
ex5_9.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <P> <% String s=session.getId(); String str=response.encodeURL("liu.jsp"); %> <P>您在访问ex5_9.jsp页面<br><br> 你的session对象的ID是:<br><br> <%=s%> <BR> <FORM action="<%=str%>" method=post name=form> <INPUT TYPE="submit" value="转向liu页面" name=submit > </FORM> <FORM action="../6/file.jsp" method=post name=form> <INPUT TYPE="submit" value="转向file页面"name=submit> </BODY> </HTML>
51
liu.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <% String s=session.getId(); String str=response.encodeURL("wang.jsp"); %> <P>你在访问liu页面 <br><br> 您的session对象的ID是:<br><br> <%=s%> <p>单击超连接,连接到wang页面 <BR> <A HREF="<%=str%>" > 欢迎到wang页面来!</A> </BODY> </HTML>
52
wang.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <% String s=session.getId(); String str=response.encodeURL("ex5_9.jsp"); %> <P>你在访问wang页面 <br><br> 您的session对象的ID是:<br><br> <%=s%> <p>单击超连接,连接到ex5_9页面<BR> <A HREF="<%=str%>" > 欢迎到ex5_9页面来! </A> </BODY> </HTML>
53
file.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <% String s=session.getId(); %> <P>你在访问file页面 <br><br> 您的session对象的ID是:<br><br> <%=s%> <P>单击超链接,返回到ex5_9页面<BR> <A HREF="../5/ex5_9.jsp"> 欢迎到ex5_9页面来! </A> </BODY> </HTML>
54
5.3.2 信息的保存和获取 [例子5.10]将购买者的姓名、商品名保存在session对象中,实现同一web目录下的页面对session对象中的信息共享。 问题分析: 创建三个页面,第一个页面输入姓名,第二个页面输入商品名,第三个页面实现结帐处理。 程序结构: 本程序包含三个JSP页面文件,三个页面文件保存在同一web目录中。 ex5_10.jsp页面接受姓名录入,并将姓名提交给first.jsp页面;first.jsp页面接受商品名的录入,并将商品名提交给account.jsp页面。三个页面的交互关系如图5-7所示。
55
程序算法: ex5_10.jsp 页面 first. .jsp account.jsp 创建一个包含文本控件的表单,用此文本控件录入姓名
提交姓名 account.jsp 提交商品名 图5-7 页面交互关系 程序算法: ex5_10.jsp: 创建一个包含文本控件的表单,用此文本控件录入姓名 first.jsp: 1.获取客户端输入的姓名(xm) 2.将"属性名-值"对,即("name",xm)添加到session对象中 3.创建一个包含文本控件的表单,用此文本控件录入商品名 account.jsp: 1.定义一个对字符串s进行编码的方法: public String getString(String s) 2.获取客户端录入的商品名(sp) 3.将"属性名-值"对,即("goods",sp)添加到session对象中 4.从session对象中获取姓名和商品名 5.将姓名和商品名输出到客户端
56
程序代码: ex5_10.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan><FONT size=3> <P>输入您的姓名连接到第一百货(first.jsp) <FORM action="first.jsp" method=post name=form> <INPUT type="text" name="buy_name"> <INPUT TYPE="submit" value="提交姓名" name=submit> </FORM> </BODY> </HTML>
57
first.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan><FONT size=3> <% String xm=request.getParameter("buy_name"); session.setAttribute("name",xm); %> <P>这里是第一百货 <P>输入您想购买的商品连接到结帐(account.jsp) <FORM action="account.jsp" method=post name=form> <INPUT type="text" name="shangpin"> <INPUT TYPE="submit" value="提交商品名" name=submit> </FORM> </BODY> </HTML>
58
account.jsp: page contentType="text/html;charset=GB2312" %> <HTML> <BODY bgcolor=cyan><FONT Size=3> <%! //处理字符串的方法 public String getString(String s) { if(s==null) s=""; } try{ byte b[]=s.getBytes("ISO "); s=new String(b); catch(Exception e) return s; %>
59
<% String sp=request.getParameter("shangpin"); session.setAttribute("goods",sp); %> String xinming=(String)session.getAttribute("name"); String shangpin=(String)session.getAttribute("goods"); xinming=getString(xinming); //对姓名进行编码 shangpin=getString(shangpin);//对商品名进行编码 <P>这里是结帐处 <P>顾客的姓名是: <%=xinming%> <P>您选择购买的商品是: <%=shangpin%> </BODY> </HTML>
60
5.3.3 计数器 [例子5.11]统计访问页面的客户数。第4章的[例子 4.2]讲述过这种例子,那个例子的缺陷是客户可以通过不断刷新页面增加计数器。在这个例子里,使用session对象的isNew()方法解决这一问题。 问题分析: 由于客户刷新页面时,session对象的ID号不会改变。当客户刷新页面时,让程序检查客户的session 对象是不是一个新的session对象,若是新的session对象,才增加计数器的值。 程序结构: 程序名:ex5_11.jsp
61
1.定义计数器number,用于统计访问页面的客户数
程序算法: 1.定义计数器number,用于统计访问页面的客户数 2.定义同步方法synchronized void countPeople(),该方法使计数器number加1 ,并将number的值保存在文本文件count.txt中。 3.判断访问客户的session对象是否是新的,若是新的session对象,则调用方法countPeople(),计数器加1。 4.输出计数器的值
62
5.4 application对象 我们已经知道,不同的客户与服务器连接时有不同的session对象,同一客户浏览同一服务器的不同目录时,有不同的session对象。 与session对象不同的是application对象。服务器启动后,就产生了application对象。所有客户的application对象是相同的一个,即,所有客户共享这个内置的application对象。
63
application对象生命期 application对象随着服务器启动而创建,随着服务器关闭而消失。application对象的生命周期指从application对象创建到服务器关闭这段时间。 application对象与线程 当多个客户点击同一页面时,JSP引擎为每个客户启动一个线程,这些线程共享同一个application对象.由于所有客户共享同一个application 对象,任何客户对application对象中数据的改变都会影响到其它的客户,因此,对该对象的操作需要实现同步处理。
64
application对象的常用方法 public void setAttribute(String key,Object obj) application对象可以调用该方法将参数Object指定的对象obj添加到application对象中,并为添加的对象指定一个索引关键字。如果添加的两个对象的关键字相同,则先前添加的对象被清除。 public Object getAttibue(String key) 获取application对象中含有的关键字key的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时,应强制转化为原来的类型。 public Enumeration getAttributeNames() application对象条用该方法产生一个枚举对象。该枚举对象使用nextElemets()方法遍历application对象所含有的全部对象。
65
public void removeAttribue(String key) 从当前application对象中删除关键字是key的对象。
public String getServletInfo() 获取Servlet编译器的当前版本信息。 注意: 有些服务器不直接支持使用application对象,必须先用ServletContext 类声明这个对象,再使用getServletContext()方法对这个application对象初始化
66
[例子5.12]输出本页面所在的实际路径、使用的JSP引擎、application对象对应的字符串。
5.4.1 读取系统信息 [例子5.12]输出本页面所在的实际路径、使用的JSP引擎、application对象对应的字符串。 程序结构: 程序名:ex5_12.jsp
67
程序代码: <%@ page contentType="text/html;charset=GB2312" %>
<body> <center> <h1> 读取系统信息</h1> <% String path="/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>
68
5.4.2制作留言板 [例子5.13]要求使用三个页面来实现留言的功能。一个页面提供留言输入窗口;一个页面获取当前留言,并将留言添加到向量中;一个页面将向量中的所有客户留言输出到客户端。 问题分析: 由于三个页面共享同一个session对象,这样,把客户的每次留言以字符串的方式添加到向量中,再把向量添加到session对象中。当客户查看留言时,首先把向量从session对象中取出,然后把向量中的所有留言输出到客户端。 程序结构: 本程序由三个JSP页面文件构成。ex5_13.jsp页面提供留言输入窗口;messagePane.jsp页面获取留言窗口的字符串,将字符串添加到向量中,再把向量添加到session对象中;showMessage.jsp页面把向量中的所有留言输出到客户端。三个页面的交互关系如图5-8所示。
69
ex5_13.jsp 页面 MessagePane.jsp 页面 ShowMessage.jsp 页面
提交留言 ex5_13.jsp 页面 MessagePane.jsp 页面 返回 查看留言 ShowMessage.jsp 页面 图5-7 页面交互关系
70
程序算法: 创建一个表单,包含三个信息输入控件 messagePane.jsp: 1.定义并创建一个向量v
ex5_13.jsp: 创建一个表单,包含三个信息输入控件 messagePane.jsp: 1.定义并创建一个向量v 2. 定义一个方法synchronized void sendMessage(String s),该方法把字符串添加到向量v中,然后把v添加到application对象中。 3.获取留言板信息,并构造成字符串:s 4.调用方法sendMessage(s),把字符串添加到 application对象 中的向量v中。 showMessage.jsp: 1.从application对象中获取向量v 2.将v中每一元素作为一条记录输出到客户端
71
程序代码: <%@ page contentType="text/html;charset=GB2312" %>
ex5_13.jsp: page contentType="text/html;charset=GB2312" %> page import="java.util.*" %> <HTML> <BODY> <FORM action="messagePane.jsp" method="post" name="form"> <P>输入您的名字: <INPUT type="text" name="peopleName"><BR> <P>输入您的留言标题: <INPUT type="text" name="Title"><BR> <P>输入您的留言:<BR> <TEXTAREA name="messages" ROWs="10" COLS=36 WRAP="physical"> </TEXTAREA><BR> <INPUT type="submit" value="提交留言" name="submit"> </FORM> <FORM action="showMessage.jsp" method="post" name="forml"> <INPUT type="submit" value="查看留言" name="look"> </BODY> </HTML>
72
messagePane.jsp: page contentType="text/html;charset=GB2312" %> page import="java.util.*" %> <HTML> <BODY> <%! Vector v=new Vector(); ServletContext application; synchronized void sendMessage(String s) { v.add(s); application=getServletContext(); application.setAttribute("Mess",v); } %>
73
<% String name=request.getParameter("peopleName"); String title=request.getParameter("Title"); String messages=request.getParameter("messages"); if(name==null) { name="guest"+(int)(Math.random()*10000); } if(title==null) title="无标题"; if(messages==null) messages=" 无信息"; String time=new Date().toString(); String s="#"+name+"#"+title+"#"+time+"#"+messages+"#"; sendMessage(s); out.print("您的信息已经提交!"); //字符串信息保存在application对象中 %> <A HREF="ex5_13.jsp"> 返回 </A> <BODY> </HTML>
74
showMessage.jsp: page contentType="text/html;charset=GB2312" %> page import="java.util.*" %> <HTML> <BODY> <% Vector v=(Vector)application.getAttribute("Mess"); out.print("<table border=2>"); out.print("<tr>"); out.print("<th bgcolor=cyan>"+"留言者姓名"+"</th>"); out.print("<th bgcolor=cyan>"+"留言标题"+"</th>"); out.print("<th bgcolor=cyan>"+"留言时间"+"</th>"); out.print("<th bgcolor=cyan>"+"留言内容"+"</th>"); out.print("</tr>"); for(int i=0;i<v.size();i++) { String message=(String)v.elementAt(i); StringTokenizer fenxi=new StringTokenizer(message,"#"); int number=fenxi.countTokens(); out.print("<tr>"); //记录行开始.每一次留言,用一行数据表示
75
for(int k=0;k<number;k++)
{ String str=fenxi.nextToken(); byte a[]=str.getBytes("ISO "); str=new String(a); if(k<number-1) out.print("<td bgcolor=yellow >"+str+"</td>");//输出每一//列单元数据 } else out.print("<td><TextArea rows=3 cols=30 >"+str+"</TextArea></td>"); out.print("</tr>");//记录行结束 out.print("</table>"); %> <BODY> </HTML>
76
5.5 page对象 page 对象代表JSP页面本身,更确切地说,它代表JSP被转译后的Servlet。其作用相当于java中的this。 [例子5.14] 输出JSP页面对象的ID号和哈稀代码值。 问题分析: 调用page对象的hashCode()方法和toString()方法,分别获取page对象的哈稀代码值和ID号。 程序结构: 程序名:ex5_14.jsp
77
程序代码: page contentType="text/html;charset=GB2312" %> <html> <body> <% int hashCode=page.hashCode(); String thisStr=page.toString(); out.println("page对象的ID值: "+ thisStr+"<br>"); out.println("page对象的hash代码: "+ hashCode+"<br>"); %> </body> </html>
78
5.6 out对象 out对象是一个输出流,用来向客户端输出数据。 [例子5.15]在客户端输出一个表格 程序名:ex5_15.jsp
程序结构: 程序名:ex5_15.jsp
79
本章小结 本章介绍了JSP内置对象的概念、生命周期、作用范围和对象方法的实际应用。使用JSP内置对象,可以方便操作页面属性和行为,访问页面运行环境,实现页面内、页面间、页面与环境之间的通信和相互操作。
80
心得体会 (1)用内置对象request的getParameter()方法获取url的参数和表单的信息。经过测试,在相同name的情况下,url的参数会优先于表单的参数。 (2)汉字处理问题,有的时候在<%=“欢迎”%>或out.print(“欢迎”)时会出现乱码。其解决的办法就是要对字符串进行编码。以下代码就可以得到正确的输出: <% String title=“欢迎”; byte[] a=title.getBytes(“ISO "); title=new String(a); out.print(title); %> 或者<%=title%> (3)Session对象生命周期,例如一个论坛,从你成功登陆到这个论坛,Session对象就产生;一直到你跟服务器断开,比方说关闭浏览器,断网等Session对象就结束。 (4)Application对象与Session对象不同,是多个用户共享此对象,即使用户与服务器断开,Application对象依然存在。直到服务器关闭,才会结束。例如用Application对象可以实现储存网站的访问人数。
Similar presentations