1、Java Web开发技术开发技术第第3章章 JSP隐含对象隐含对象10/13/20221第3章 JSP隐含对象l为简化为简化Web页面的开发过程,页面的开发过程,JSP提供了一些提供了一些由容器实现和管理的隐含对象,这些对象在由容器实现和管理的隐含对象,这些对象在JSP页面中可以直接使用,不需要页面中可以直接使用,不需要JSP页面编页面编写者实例化。在写者实例化。在JSP页面中,可以通过存取这页面中,可以通过存取这些隐含对象实现与些隐含对象实现与JSP页面和页面和Servlet环境的环境的相互访问。相互访问。l本章主要内容包括:本章主要内容包括:JSP隐含对象概述和各类隐含对象概述和各类隐含对
2、象的具体说明。隐含对象的具体说明。10/13/202223.1 JSP隐含对象概述lJSP页面的隐含对象就是在JSP页面中不用声明就可以使用的对象。隐含对象是JSP引擎自动创建的Java类实例,它们能与Servlet环境交互。隐含对象可以实现很多功能,如从客户端获得数据、向客户端发回数据、控制传输数据的有效域和异常处理等。如:10/13/20223隐含对象功能l不必使用表达式,直接存取out对象来打印一些东西到客户端:l不必直接传送参数,可以借助请求对象来取得客户端输入的参数值:l完成页面的重定向:l在错误页面中显示出错信息:l等等10/13/20224JSP中的中的9种隐含对象种隐含对象与输
3、入/输出有关 与属性作用域有关 与Servlet 相关 与错误处理有关 10/13/202253.2与输入/输出有关的隐含对象l 3.2.1 request对象l 3.2.2 response对象l 3.2.3 out对象10/13/202263.2.1 request对象l在JSP页面中,隐含对象request代表的是来自客户端的请求,通过它可以查看请求参数、请求类型(GET,POST,HEAD等)以及请求的HTTP头(Cookie,Referer等)客户端信息,它是实现 javax.servlet.HttpServletRequest 接口的类的一个实例。lrequest 对象的方法有很多
4、,从功能角度可以将这些方法分为4类:10/13/202271取得请求参数的方法取得请求参数的方法 10/13/202282.取得请求取得请求HTTP 头的方法头的方法 10/13/202293储存和取得属性方法储存和取得属性方法 10/13/2022104其他的方法其他的方法 10/13/2022114其他的方法(续)其他的方法(续)10/13/202212request比较重要的方法比较重要的方法 l getParameter()l getParameterNames()l getParameterValues()l getHeader()记住噢10/13/2022133.2.1.1.获得客
5、户端提交的信息获得客户端提交的信息l例exa3_1.jsp:一个html文档exa3_1.jsp提交一个表单给tree.jsp页面,tree.jsp通过request.getParameter()接收表单中的客户输入,并将有关信息送回客户端。10/13/202214获得客户端提交的信息(续)获得客户端提交的信息(续)文本框提交的用户名为:客户端提交的按钮的名字为:exa3_1.jsp tree.jsp 1.运行2.调用3.结果10/13/2022153.2.1.2.处理中文信息l在例exa3_1.jsp中输入中文时将不能正确显示,如图所示:这就引发如何处理客户端提交的中文问题。JSP页面的汉字
6、问题主要指两方面:JSP页面中的汉字问题和表单提交的汉字问题。10/13/202216(1)JSP页面的汉字问题页面的汉字问题l对于JSP页面的汉字问题,需要在JSP中使用page指令告诉客户端汉字的编码方式:。在没有特别指示下,浏览器无法正确显示汉字,每个要显示汉字的JSP页面都应该包含该语句。10/13/202217(2)表单提交的汉字问题)表单提交的汉字问题l客户端和服务器交互过程中,在客户端和服务器用的是GB2312对汉字编码,而HTTP传输用ISO_8859_1编码,因此,不仅服务器端必须用指令指示客户端汉字的显示编码,同时在服务器端接收到客户端数据时需要将编码转换为GB2312后进
7、行处理,方法是:或 其中tt为表单提交的含有中文的变量10/13/202218改进后的改进后的tree.jsp l我们只须在tree.jsp中加入中文处理的相关语句,中文就能正确显示了,代码如下:文本框提交的用户名为:%String extContent=request.getParameter(boy);10/13/2022193.2.1.3.避免空指针异常l例如一表单向JSP页面提交一个正数,然后计算这个正数的平方根,JSP中有这么一个语句:String textContent=request.getParameter(“num”),其中num代表表单提交的正数,要注意由于JSP引擎在运行
8、这个JSP页面时,客户端还没有提交数据,textContent也还没有创建,而JSP页面中的number=Double.parseDouble(textContent)语句需要使用textContent,此时textContent对象为null,Java解释器会提示出现空指针异常NullPointerException。为了避免使用空对象,在JSP页面中使用了如下代码:if(textContent=null)textContent=100;10/13/2022203.2.1.4.其它常用方法lgetServletPath()lgetContentLength()lgetMethod()lget
9、Header()lgetProtocol()10/13/2022213.2.1.5.获取HTML表单中的各种数据l由于客户端经常使用表单提交数据,本节通过例子来说明表单中各种提交手段的用法。l表单的一般格式为:表单中的标记(数据提交的手段)10/13/202222表单中各种提交手段表单中各种提交手段(1)l下面例text.jsp表单的输入方式是文本框和口令,,运行结果如图3-8所示。text.jsp关键代码:表单 用户登录 用户名:图3-8密码:10/13/202223表单中各种提交手段表单中各种提交手段(2)l下面例子用单选按钮实现网上测试 radio.jsp关键代码:answer.jsp关
10、键代码:p诗人李清照是中国历史上哪个朝代的人?宋朝唐朝明朝清朝史记的作者是谁?曹雪芹罗贯中李白司马迁您的了分图3-9 radio.jsp的输出结果10/13/202224表单中各种提交手段表单中各种提交手段(3)l下面例子说明滚动列表使用方式:select.jsp关键代码:选择计算和的方式 计算1到n的和 计算1到n的平方和 计算1到n的立方和请选择n的值 n=10 n=20 n=30 n=40 n=50 n=100sum.jsp关键代码:%int sum=0;String s1=request.getParameter(girl);String s2=request.getParameter
11、(boy);int n=Integer.parseInt(s2);if(s1.equals(1)for(int i=1;i=n;i+)sum+=i;else if(s1.equals(2)for(int i=1;i=n;i+)sum+=i*i;else for(int i=1;i您的求和结果是10/13/2022253.2.1.6.表格l表格由和标记定义。一般格式为:单元格中的数据 单元格中的数据 10/13/202226表格应用举例l下面例tableform.jsp是表单使用,运行结果如图所示。tableform.jsp关键代码:杜甫是哪个朝代的人?:宋朝 唐朝 请在右边表格中输入数据:图
12、3-12 tableform.jsp 运行结果 10/13/2022273.2.2 response对象l当客户访问一个服务器的页面时,会提交一个HTTP请求,服务器接到请求时会返回HTTP响应。响应是实现 javax.servlet.HttpServletResponse接口的类的一个实例。response对象代表的是对客户端的响应,可以通过response对象来组织发送到客户端的数据。response对象的方法也有很多,下面的几个表列出了response对象的主要方法 :10/13/202228设定表头的方法设定表头的方法 10/13/202229设定响应状态码的方法设定响应状态码的方法
13、10/13/202230用来用来URL 重写的方法重写的方法 10/13/202231其它方法其它方法 10/13/202232重要!重要!lresponse对象中使用较多的方法是:lsetContentType()lsendRedirect()lsetHeader()记住噢10/13/2022333.2.2.1.动态设置MIME类型l在page指令中的contentType属性用来指定response对象响应客户端请求的MIME(Multipurpose Internet Mail Extension protocol,多用途网际邮件扩充协议)类型。ContentType属性值和MIME类型
14、的主要对应关系如下表所示:10/13/202234contentType属性和属性和MIME类型的对应关系类型的对应关系 page指令只能为contentType指定一个值,如果想动态地改变这个属性的值来以各种不同的方式做出响应,就要使用response对象的setContentType()方法改变contentType的值。一旦这个属性值被改变,服务器就将按照新的MIME类型做出响应。参考example3-11.jsp。10/13/2022353.2.2.2.response对象的http头lresponse对象可以使用addHeader()和setHeader()方法动态添加和修改相应头的
15、值,并将这些头发送给客户端。下面例example3_12.jsp中,response对象添加一个头refresh,使客户端在显示该页面时,每5秒钟刷新一次。运行结果如图:example3_12.jsp关键代码:现在的时间是:图 3-15 example3_12.jsp 运 行 结 果 10/13/2022363.2.2.3.response重定向l下面例中,客户填写表单,并提交给tree4.jsp页面。如果表单填写不完整,tree4.jsp会重新定向到填写页面,否则显示欢迎字样,运行结果如图:tree4.jsp关键代码:10/13/2022373.2.2.4.response的状态行l当服务器
16、响应客户端请求时,它发送的首行被称为状态行。状态行包括3位数字的状态码和对状态码的简单描述。其中,1xx主要是试验性质的;2xx表示请求成功;3xx表示在请求在满足之前应进一步采取的行动;4xx表示服务器无法满足要求;5xx服务器出现错误。具体可参考书中表3-11状态码表。10/13/2022383.2.3 out对象lout对象代表了向客户端发送数据的对象,通过out对象发送的内容将是浏览器需要显示的内容,是文本一级的。可以通过out对象直接向客户端写一个由程序动态生成HTML文件。它是javax.servlet.jsp.JspWriter类的一个实例。JSP允许通过page指令的buffe
17、r属性调整out对象缓存的大小,甚至允许关闭缓存。10/13/202239out对象重要方法对象重要方法 10/13/202240Out对象举例对象举例 Out.jsp关键代码:BufferSize:Available:Used:因为在每个页面中都用到out对象,因此在这儿仅举一个例子再展示一下out对象的主要方法。Out.jsp显示目前缓冲区的大小。运行结果如图所示 10/13/2022413.3与属性作用域有关的对象l3.3.1 session对象对象l3.3.2 application对象对象l3.3.3 pageContext对象对象 10/13/2022423.3.1 session
18、对象lHTTP是无状态(stateless)协议。客户端向服务器发送一次请求(request),服务器给与响应(response)后连接就关闭了。因此,当下一次连接时,服务器已经没有以前的连接信息了。服务器对每一个客户端请求都没有历史记忆的特点带来了一系列的问题。如在线商店购物时,当我们把商品加入购物车时,服务器如何才能知道车里原先有些什么?当用户从选择商品的页面转到输入信用卡号和送达地址的页面,服务器如何才能记住用户买了些什么?这个问题一般有三种解决方法:10/13/202243解决方法:解决方法:lCookie:利用Cookie对象来存储有关购物会话的信息,后继的各个连接可以查看当前Coo
19、kie,提取有关该会话的完整信息。l重写URL:把一些标识会话的数据附加到每个URL的后面,服务器能够把该会话标识和它所保存的会话数据关联起来。l隐藏表单域:通过表单的隐藏域维持会话lHttpSession API:Servlet提供的一种与众不同的方案。10/13/202244HttpSession API lHttpSession API是一个基于Cookie或者URL重写机制的高级会话状态跟踪接口。如果浏览器支持Cookie,则使用Cookie;如果浏览器不支持Cookie或者Cookie功能被关闭,则自动使用URL重写方法。Servlet开发者无需关心细节问题,也无需直接处理Cooki
20、e或附加到URL后面的信息。10/13/202245什么是会话(什么是会话(session)lsession对象是javax.servlet.http.HttpSession类的一个实例,session对象使同一用户在访问Web站点时多个页面间共享信息。一个客户访问服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面或不断向一个页面提交信息等。服务器完全可以通过session对象知道这是同一个客户。l从一个客户打开浏览器连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。10/13/202246session对象的主要方法对象的主要方法 10/13/20224
21、73.3.1.1.session对象的ID标识l客户首次访问服务器上的JSP页面时,JSP引擎产生session对象,并分配给它一个String类型的ID,并将其发送到客户端存入Cookie中,这样session对象和客户端之间建立了一一对应关系,客户在该服务器不同网页间转换或从其他服务器回到该服务器时,不分配给客户新的session,直到客户关闭浏览器,分配给客户的session对象被取消。10/13/202248Session与与ID的一一对应关系的一一对应关系l下面例中,客户在三个页面id1.jsp、id2.jsp和id3.jsp之间进行链接,只要不关闭浏览器,三个页面的session对
22、象完全相同,这可以从三个页面中得到的session ID看到。代码如下,运行结果单击如图 id1.jsp关键代码:您在id1页面的session对象的ID是:单击超连接,可到id2页面欢迎到id2页面来。id2.jsp关键代码:您在id2页面中的id号为:单击超连接,可到id3页面欢迎到id3页面来。id3.jsp关键代码:您在id3页面中的session对象的ID是:点击超链接,连接到id1页面。欢迎到id1页面来。10/13/2022493.3.1.2.session对象和URL重写l上面例子是在客户端支持Cookie基础上的。如果客户端不支持Cookie,服务器无法将session ID
23、写到客户端。服务器无法识别同一个客户端。解决该问题的有效方法是URL重写技术。改进后id1_1.jsp关键代码:在id1页面中的id号为:单击超连接,可到id2页面a href=欢迎到id2_1页面来。id2_1.jsp 和id3_1.jsp在相同位置做相应更改即可。10/13/2022503.3.1.3.在会话对象中保存数据l保存和获得session对象中的数据是JSP页面常做的工作,需要使用getAttribute()和setAttribute()方法。例子simplesession.jsp在session对象中保存数据numVisits,这样服务器可以告诉客户他访问该页面一共多少次,只要
24、客户不关闭浏览器。刷新6次后运行结果如图3-20所示。图3-20例:example3_17.jsp,Login.jsp,Member.jsp 10/13/2022513.3.1.4.session对象的生存时间l例example3_18.jsp是一个猜数字游戏 图 3-24 example3_18.jsp 运行结果 10/13/2022523.3.1.5.session对象的新与旧l前面已经讲到,会话有生存期,一般来说,下列情况会使会话结束:由于网络故障套接字删除、关闭浏览器、服务器关闭重起、会话超时和主动撤销会话。l在第二章已经实现了计数器功能,显示客户是访问本网站的第多少位客户。但那时客户
25、不断刷新页面时,计数器的数目在增加,这是不正确的。下面的例example3_19.jsp解决了这个问题,对第二章的例子进行改进。10/13/2022533.3.2 application对象lpplication对象负责提供应用程序在服务器中运行时的一些全局信息。服务器启动时就创建一个application对象,客户在该服务器的各个页面之间链接时,application对象都是同一个,直到服务器关闭。l表3-14 列出了application对象的主要方法10/13/2022543.3.2.1.application对象的常用方法例:application.jsp,setAttribute.j
26、sp,getAttribute.jsp,example3_20.jsp 10/13/2022553.3.2.2.用application对象制作留言板l在下例中,客户在submit.jsp中输入姓名、留言标题和留言内容。这些信息提交给messagePane.jsp。该页面将客户信息存入向量,并将向量存放在application对象中。当查看留言板时,showMessage.jsp负责从application对象中取出向量,并遍历向量显示其中的所有留言。l代码详见:submit.jsp,messagePane.jsp,showMessage.jsp 10/13/2022563.3.3 pageC
27、ontext对象lpageContext对象主要用来管理页面的属性,描述JSP文档的运行环境。它是页面中对象功能的最大集成者,提供对所有其他隐含对象及其属性的访问。lpageContext对象的方法详见表3-15 和表3-16 l例scopeexample1.jsp 和scopeexample2.jsp 10/13/2022573.4 与Servlet 有关的隐含对象l与Servlet 有关的隐含对象有两个:page和config。lpage对象表示Servlet本身;lconfig对象则是存放Servlet的初始参数值。10/13/2022583.4.1 page 对象l它是this的同义词
28、,表示JSP页面本身,是Servlet类的一个实例,就是转换后的Servlet类,可以调用Servlet中的任何方法。它实现了javax.servlet.jsp.HttpJspPage接口。当前page对象用处不大。下面举一个简单例子PageInfo.jsp,运行结果如图3-29所示。图3-29 PageInfo.jsp运行结果 10/13/2022593.4.2 config 对象lconfig对象是 javax.servlet.servletConfig 接口的实例,存储Servlet配置对象。其重要方法如下表所示。10/13/2022603.5 与Error 有关的隐含对象l这类的隐含对
29、象只有一个成员:exception 对象。lexception对象代表了JSP文件运行时所产生的异常对象,目的是在JSP内处理错误。此对象不能在一般JSP文件中直接使用,而只能在使用了的JSP文件中使用。l例:dividedexample.jsp 10/13/2022613.6 小 结l本章介绍了JSP页面中使用的主要隐含对象。它们是:request、response、out、session、application、pageContext、config、page、exception。正是由于这些隐含对象,你可以进入JSP页面的代码段,用不着深入了解太多的Servlet API细节。从本质上讲,
30、JSP的这些隐含对象其实都是由特定的Java类所产生的,在服务器运行时根据情况自动生成,所以如果你有较好的Java基础,可以参考相应的类说明。10/13/202262习习 题题l1编写JSP页面,完成下图功能:10/13/202263习题习题l2编写JSP页面,完成下图功能,提交请求后显示相应的选中项标签:10/13/202264习题习题l3在aa.jsp中有行代码:在bb.jsp中有行代码:为了使得在bb.jsp中的如上代码可以显示”jb-aptech”,可以使用()发送。A)在aa.jsp中使用把请求提交到bb.jspB)在aa.jsp中使用把页面重定向到bb.jspC)在aa.jsp中使
31、用把页面重定向到bb.jspD)在aa.jsp中使用包含页面bb.jspE)在aa.jsp中使用把页面重定向到bb.jsp10/13/202265习题习题l4如果在JSP脚本中有如下代码:int I=10;/1 String str=”jb-aptech”;/2 Vector v=new Vector();/3 v.add(“jb”);/4 v.add(“aptech”);/5 session.setAttribute(“I”,I);/6 session.setAttribute(“str”.str);/7 session.setAttribute(“v”,v);/8l以下正确的选项是()A)
32、第6、7、8行代码是错误的 B)修正第1到第8行中错误的代码后,使用String str=(String)session.getAttribute(“str”);可以取出属性str的值 C)修正第1到第8行中错误的代码以后,使用int x=(int)session.getAttribute(“I”);此时I的值为10 D)修正第1到第8行中错误的代码以后,可以使用Object v=session.getAttribute(“v”);取得属性v的值10/13/202266习题习题l5.下列选项中,()可以准确地获取请求页面的一个文本框的输入(文本框的名称为name)。A)request.getP
33、arameter(name);B)request.getParameter(“name”);C)request.getParameterValues(name);D)request.getParameterValues(“name”);10/13/202267习题习题l6.使用response对象进行重定向时使用的方法为()。A)getAttribute()B)setContentType()C)sendRedirect()D)setAttribute()10/13/202268习题习题l7.如果把用户名变量UserName放在session对象中,下面语句正确的是()。A)session.setName(UserName)B)session.setName(“name”,UserName)C)session.setAttribute(UserName)D)session.setAttribute(“name”,UserName)10/13/202269习题习题l8.page对象属于()类的对象。A)输入输出对象B)通信对象C)Servlet对象D)错误对象10/13/202270实验三 JSP隐含对象的使用l略10/13/202271本章结束,谢谢大家!本章结束,谢谢大家!休息一会儿。休息一会儿。10/13/202272