第4章 JSP内置对象.doc
第四章、JSP内置对象JSP的内置对象由JSP容器自动为JSP页面提供,可以使用标准的变量来访问这些对象,并且不用编写任何额外的代码,可以在JSP网页中使用。在JPS 2.0规范中定义了以下9个内置对象:request(请求对象)、response(响应对象)、session(会话对象)、application(应用程序对象)、out(输出对象)、page(页面对象)、config(配置对象)、exception(异常对象)、pageContext(页面上下文对象)。在这一章中,我们将对它们进行介绍,并通过示例来介绍它们的具体使用方法。4.1内置对象概述正如第一章所介绍,Web应用程序的特点是每一个JSP文件相当于独立的运行单元,类似于一个独立的应用程序,并由容器(Tomcat)进行统一管理。对于一个实际工程项目来说,不可能只有一张页面,且页面之间存在各类内部数据的实时通信问题,如:把A页面登录数据传递到B页面进行验证;购物车的设计涉及若干页面共享数据问题;公告栏涉及不同用户的数据共享问题。而且,在实际项目中,存在着对各类请求/响应有一些特殊要求等。因此,容器根据规范要求,向用户提供了一些内置对象,用于解决上述问题,并负责对这些对象的管理,包括内置对象的生存期、作用域等。这些内置对象中,request、response对象是在客户端请求一个JSP页面,由容器实时生成并作为服务参数传递给JSP(实际上是servlet),请求/相应结束,由容器回收;session的生成一般是在用户第一进入系统时形成,退出系统时,由容器回收。4.2 request对象request对象最主要的作用在于接收参数,当客户端请求一个JSP页面时,JSP容器会将客户端的请求信息包装在这个request对象,请求信息的内容包括请求的头信息、请求的方式、请求的参数名称和参数值等信息。request对象封装了用户提交的信息,通过调用该对象相应的方法可以获取来自客户端的请求信息,然后做出响应。它是HttpServletRequest类的实例。4.2.1 request对象主要方法序号方 法 名方 法 说 明1 * getAttribute(String name)返回指定属性的属性值2 getAttributeNames()返回所有可用属性名的枚举3 getCharacterEncoding()返回字符编码方式4 getContentLength()返回请求体的长度(以字节数)5 getContentType()得到请求体的MIME类型6 getInputStream()得到请求体中一行的二进制流7 * getParameter(String name)返回name指定参数的参数值8 getParameterNames()返回可用参数名的枚举9 getParameterValues(String name)返回包含参数name的所有值的数组10 getProtocol()返回请求用的协议类型及版本号11 getServerName()返回接受请求的服务器主机名12 getServerPort()返回服务器接受此请求所用的端口号13 getReader()返回解码过了的请求体14 getRemoteAddr()返回发送此请求的客户端IP地址15 getRemoteHost()返回发送此请求的客户端主机名16 * setAttribute(String key,Object obj)设置属性的属性值17 getRealPath(String path)返回一虚拟路径的真实路径18 getMethod()返回客户向服务器传输数据的方式19 getRequestURL()返回发出请求字符串的客户端地址20 * getSession()创建一个session对象表4-1 request对象方法 下面的程序示例了request对象的一些常用方法,通常使用request对象来获得客户端传来的数据。example4_1.jsp<% page contentType="text/html;charset=gb2312"%><%request.setCharacterEncoding("gb2312");%><% page import="java.util.Enumeration"%><html><head><title>request对象示例</title></head><body bgcolor="#FFFFF0"><h4>一.request对象常用方法</h4>请求方式:<%=request.getMethod()%><br>请求的资源:<%=request.getRequestURI()%><br>请求用的协议:<%=request.getProtocol()%><br>请求的文件名:<%=request.getServletPath()%><br>请求的服务器的IP:<%=request.getServerName()%><br>请求服务器的端口:<%=request.getServerPort()%><br>客户端IP地址:<%=request.getRemoteAddr()%><br>客户端主机名:<%=request.getRemoteHost()%><br>表单提交来的值:<%=request.getParameter("qwe")%><br><h4>二.使用request获取客户端提交的参数</h4><form action="" method="post">用户名:<input type="text" name="username"> 密 码:<input type="text" name="userpass"> <input type="submit" value="进 入"></form><%String str="" if(request.getParameter("username")!=null && request.getParameter("userpass")!=null) Enumeration enumt = request.getParameterNames(); while(enumt.hasMoreElements() str=enumt.nextElement().toString(); out.println(str+":"+request.getParameter(str)+"<br>"); %><form action="" method="post">擅长:<input type="checkbox" name="cb" value="ON1">VC+ <input type="checkbox" name="cb" value="ON2">JAVA <input type="checkbox" name="cb" value="ON3">DELPHI <input type="checkbox" name="cb" value="ON4">VB <br><input type="submit" value="进 入" name="qwe"></form><%if(request.getParameter("qwe")!=null ) for(int i=0;i<request.getParameterValues("cb").length;i+) out.println("cb"+i+":" +request.getParameterValues("cb")i +"<br>"); out.println(request.getParameter("qwe"); %></body></html>执行结果如图4-1所示:图4-14.2.2 request对象的常用技术 1、用getParameter方法获取表单提交信息request对象获取客户提交信息的最常用的方法是getParameter(String s)。在下面的示例,form.html通过表单向requestForm1.jsp提交用户名和密码信息;requestForm1.jsp通过request对象获取表单提交的信息。form1.html示例代码:<HTML><BODY><FORM ACTION=“requestForm1.jsp" METHOD="POST"><P>姓名:<INPUT TYPE="TEXT" SIZE="20" NAME="UserID"></P><P>密码:<INPUT TYPE="PASSWORD" SIZE="20" NAME="UserPWD"></P><P><INPUT TYPE="SUBMIT" VALUE="提 交"> </P></FORM></BODY></HTML>图4-2requestForm.jsp示例代码:<% page contentType="text/html;charset=GBK" %><%String strUserName = ""String strUserPWD = ""strUserName = request.getParameter("UserID");strUserPWD = request.getParameter("UserPWD");%>姓名:<%=strUserName%><br>密码:<%=strUserPWD%>图4-32、用getParameterValues方法获取表单成组信息通过request对象的getParameterValues方法可以获得指定参数的成组信息,通常在表单的复选框中使用。该方法的原型如下:public String getParameterValues(String str)下面示例中,form2.html表单中有三个复选框,选中复选框后,表单信息提交给requestForm2.jsp,在requestForm2.jsp中使用getParameterValues获取复选框的成组信息并显示。form2.html<html><body><form id="form1" name="form1" method="post" action="requestForm2.jsp">请选择喜欢的水果:<p><input type="checkbox" name="checkbox" value="apple" />apple <input type="checkbox" name="checkbox" value="banana" />banana <input type="checkbox" name="checkbox" value="peach" />peach<p> <input type="submit" name="Submit" value="提交" /></form></body></html>图4-4requestForm2.jsp<% page contentType="text/html;charset=gb2312"%><html> <body> <% String temp = request.getParameterValues("checkbox"); out.println("你喜欢的水果是:"); for (int i = 0; i< temp.length; i+) out.println(tempi + " "); %> </body></html>图4-53、表单信息获取的综合应用下面示例通过request对象中的常用方法获取表单中的各类信息。注意:request对象中获取中文信息经常出现乱码,在requestForm3.jsp中编写了trans方法解决乱码文题。form3.html</html><body><form id="form1" name="form1" method="post" action="requestForm3.jsp">姓名:<input type="text" name="name" /><p> 密码:<input type="password" name="pass" /><p> 性别:<input name="sex" type="radio" value="男" checked="checked" />男 <input name="sex" type="radio" value="女" />女<p>性格:<input type="checkbox" name="checkbox" value="热情大方" />热情大方 <input type="checkbox" name="checkbox" value="温柔体贴" />温柔体贴 <input type="checkbox" name="checkbox" value="多愁善感" />多愁善感<p> 简介: <textarea name="textarea"></textarea><p> 城市: <select name="select"> <option value="北京">北京</option> <option value="上海">上海</option> </select><p> <input type="submit" name="Submit" value="提交" /></form></body></html>图4-6requestForm3.jsp<% page contentType="text/html;charset=gb2312"%><html><body> <%! public String trans(String str) throws Exception byte b = str.getBytes("ISO-8859-1"); str = new String(b); return str; %> <% String name = trans(request.getParameter("name"); String pass = trans(request.getParameter("pass"); String sex = trans(request.getParameter("sex"); String temp = request.getParameterValues("checkbox"); String xingge="" for (int i = 0; i< temp.length; i+) xingge = xingge + tempi + " " xingge = trans(xingge); String jianjie = trans(request.getParameter("textarea"); String city = trans(request.getParameter("select"); %> 姓名:<%=name%><p> 密码:<%=pass%><p> 性别:<%=sex%><p> 性格:<%=xingge%><p> 简介:<%=jianjie%><p> 城市:<%=city%> </body></html>图4-74、利用request传递任意类型对象数据正如上述,request主要用来传递数据的(二个页面之间)。大多数情况下,利用其getParameter()和getParameterValues()方法获取各类表单信息,一般是字符串或字符串数组类型。有时,项目要求传递其它类型值,如,在一个servlet中,通过数据库操作,得到一个学生记录集,以二维数组形式存放,具体可以用ArrayList实现。进一步,把该记录集传递到一JSP页面,用于显示该记录集,此时,就可以利用request的setAttribute(String key,Object obj)和 getAttribute(String key)来设值和取值了。详细代码以后章节会介绍,示意代码如下所示。servletArrayList studentList;/其具体值的获得略。request.setAttribute(“student”,studentList );forward到A.jsp;A.jspArrayList list=(ArrayList)request. getAttribute(“student”);4.3 response对象request对象和response对象是相辅相成的,request对象用来得到客户端的信息。 response对象处理服务器端对客户端的一些响应,request用来得到客户端信息,用response处理响应。response对象对客户的请求做出动态的响应,向客户端发送数据。它是HttpServletResponse类的实例。4.3.1 response对象主要方法序号方 法 名方 法 说 明1addCoolie(Cookie coolie)向客户端写入一个cookie2addHeader(String name,String value)添加HTTP文件头3containsHeader(String name)判断名为name的header文件头是否存在4encodeURL(String url)把sessionId作为URL参数返回到客户端5getOutputStream()获得到客户端的输出流对象6sendError(int)向客户端发送错误信息。如404信息7sendRedirect(String url)重定向请求8setContentType(String type)设置响应的MIME类型9setHeader(String name, String value)设置指定的HTTP文件的头信息值,如果该值已经存在,则新值会覆盖原有的旧值.表4-24.3.2 response对象的常用技术1、使用response对象设置Http文件的头信息这里主要介绍两个方法:setContentType(String type)和setHeader(String name, String value)。setContentType(String s)方法可以动态改变ContentType的属性值,参数s可取text/html、text/plain、application/x-msexcel、application/msworld等。在下面的示例中,当用户选择用world显示文件时,response对象将contentType属性值设置成为application/msworld。同样,当用户选择用excel显示文件时,response对象将contentType属性值设置成为application/ x-msexcel。A.txt34 79 51 99<br>40 69 92 22<br>67 71 85 20<br>72 30 78 38<br>55 61 39 43<br>43 81 10 55<br>36 93 41 99<br>contenttype.html<HTML><BODY bgcolor=cyan><Font size=5> <P>您想使用什么方式查看文本文件A.txt? <FORM action="response1.jsp" method="post" name=form> <INPUT TYPE="submit" value="word" name="submit1"> <INPUT TYPE="submit" value="excel" name="submit2"> </FORM></FONT></BODY></HTML>response1.jsp<% page contentType="text/html;charset=gb2312"%><HTML><BODY><%String str1 = request.getParameter("submit1");String str2 = request.getParameter("submit2");if (str1 = null) str1 = ""if (str2 = null) str2 = ""if (str1.startsWith("word") response.setContentType("application/msword;charset=GB2312");out.print(str1);if (str2.startsWith("excel") response.setContentType("application/x-msexcel;charset=GB2312");%><jsp:include page="A.txt"/></BODY></HTML>setHeader(String name, String value)方法可以添加新的相应头和头的值。下面的示例中response对象添加一个响应头refresh,其头值是“3”。那么客户收到这个头之后,每隔3秒刷新一次页面。response2.jsp<% page contentType="text/html;charset=GB2312" %><% page import="java.util.*" %><HTML><BODY bgcolor=cyan><Font size=5 ><P>现在的时间是:<BR><% out.println(""+new Date(); response.setHeader("Refresh","3"); %></FONT></BODY></HTML>2、使用rssponse实现重定向对于response对象,最常用到的是sendRedirect方法,可以使用这个方法将当前客户端的请求转到其他页面去。相应的代码格式为"response.sendRedirect("URL地址");"。下面示例中login.html提交姓名到response3.jsp页面,如何提交的姓名为空,需要重定向到login.html页面,否则显示欢迎界面。login.html示例代码:<HTML><BODY><FORM ACTION=“response3.jsp" METHOD="POST"><P>姓名:<INPUT TYPE="TEXT" SIZE="20" NAME="UserID"></P><P><INPUT TYPE="SUBMIT" VALUE="提 交"> </P></FORM></BODY></HTML>response3.jsp<% page contentType="text/html;charset=GB2312" %><HTML><BODY> <% String s = request.getParameter("UserID ");byte b = s.getBytes("ISO-8859-1");s = new String(b); if (s=null) s="" response.sendRedirect("login.html"); else out.println("欢迎您来到本网页!"+s);%></BODY></HTML>注意:用<jsp:forward>指令和response对象中sendRedirect方法都可以实现页面的重定向,但二者是有区别的。使用<jsp:forward>只能在本网站内跳转,且跳转后,在地址栏中,仍然显示以前页面的URL,跳转前后的二个页面属同一个request,用户程序可以用request来设置或传递用户程序数据。但对于response.sendRedirect,则不一样了,它相对前者是绝对跳转,在地址栏中,显示的是跳转后页面的URL,跳转前后的二个页面不属同一个request,当然也可用其它技术手段来保证request为同一个,但这不是本节的讨论范围。对于后者来说,可以跳转到任何一个地址的页面。如:response. sendRedirect(“4.4 session对象session中文是“会话”的意思,指的是客户端与服务器的一次会话过程,以便跟踪每个用户的操作状态。一般情况下,它在第一个JSP页面被装载时由服务器自动创建,并在用户退出应用程序时,由服务器销毁该session对象,完成会话期管理,这也是session的生命周期。服务器为每个访问者都设立一个独立的session对象,用以存储session变量,并且各个访问者的session对象互不干扰。session是HttpSession类的实例。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来管理客户端信息,因此在实际工程项目中,应该注意慎用session,以免服务器内存溢出。服务器为每个客户端新建一个session时,同时产生一个唯一的sessionID号与session相关联,这个sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,而且这个sessionID是保存在客户端的cookie中。如果客户端不支持cookie,那么将不能使用session了。但我们可以通过重写URL等技术来保证sessionID的唯一性。session对象用途很广泛,它主要用于网页间数据共享,系统操作安全等方面。4.4.1 session对象主要方法序号方 法 名方 法 说 明1getAttribute( String name )获取与指定名字相关联的session属性值2getAttributeNames()取得session内所有属性的集合3getCreationTime()返回SESSION创建时间,最小单位千分之一秒4getId()返回SESSION创建时JSP引擎为它设的惟一ID号5getLastAccessedTime()返回此SESSION里客户端最后一次访问时间6getMaxInactiveInterval()返回两次请求间隔多长时间,以秒为单位7getValueNames()返回一个包含此SESSION中所有可用属性的数组8invalidate()取消SESSION,使SESSION不可用9isNew()返回服务器创建的一个SESSION,客户端是否已经加入10removeValue(String name)删除SESSION中指定的属性11setAttribute( String name, Object value )设置指定名称的session属性值12setMaxInactiveInterval()设置两次请求间隔时间, 以秒为单位表 4-34.4.2 session对象的常用技术1、session对象的常用方法 下面这个程序用到了session的一些常用方法,代码如下:simple.jsp<% page contentType="text/html;charset=gb2312"%><% page import="java.util.*;"%><html><head><title>session对象示例</title></head><body><br>session的创建时间:<%=session.getCreationTime()%> <!-返回的是从格林威治时间(GMT)1970年01月01日0:00:00起到计算当时的毫秒数-><%=new java.sql.Time(session.getCreationTime()%><br><br>session的Id号:<%=session.getId()%><br><br>客户端最近一次请求时间:<%=session.getLastAccessedTime()%> <%=new java.sql.Time(session.getLastAccessedTime()%><br>两次请求间隔多长时间此SESSION被取消(ms):<%=session.getMaxInactiveInterval()%><br>是否是新创建的一个SESSION:<%=session.isNew() ? "是" : "否"%><br><%session.putValue("name", "练习session");session.putValue("name2", "10000");%><%for (int i = 0; i < session.getValueNames().length; i+)out.println(session.getValueNames()i + "="+session.getValue(session.getValueNames()i);%></body></html>以上程序显示了如何获知session的创建时间,session的id号以及session的存活周期等,执行结果如下图所示:图4-82、setAttribute与getAttribute方法setAttribute与getAttribute方法是session对象最常用的方法,其原型如下:l void setAttribute(String name,Object value):以键/值的方式,将一个对象的值存放到session 中。l Object getAttribute(String name):获取session对象中含有关键字是key的对象。该方法取回对象时应强制转化为原来的类型。下面的示例是一个猜数字得小游戏。当用户访问session.jsp时,随机分配给用户一个 1到100之间的数,然后将这个数存在用户的session对象中。用户在表单中输入一个数,来猜测随机数,提交给result.jsp。如果猜测的数与session对象中存放的数匹配,链接到success.jsp,否则链接到large.jsp或small.jsp,然后用户在这些页面再重新提交数字到result.jsp。session.jsp:<% page contentType="text/html;charset=GB2312" %><HTML><BODY bgcolor=cyan><FONT Size=1><P>随机分给了你一个1到100之间的数,请猜! <% int number=(int)(Math.random()*100)+1; session.setAttribute("count",new Integer(0); session.setAttribute("save",new Integer(number); %><BR><P>输入你的所猜的数 <FORM action="result.jsp" method="post" name=form> <INPUT type="text" name="boy" > <INPUT TYPE="submit" value="送出" name="submit"> </FORM></FONT></BODY></HTML>图4-9resu