4.1 request 对象
4.1.1获取用户提交的信息
4.1.2处理汉字信息
request对象获取用户提交的信息中如果含有汉字字符或其他非ASCII字符,就必须进行特殊的处理方式,以防出现乱码现象。
JSP页面文件的编码为UTF-8编码,只要让request对象在获取信息之前调
用setCharacterEncoding方法设置编码为UTF-8(默认是ISO-8859-1)就可以避免乱码现象,代码如下:
request. setCharacterEncoding("utf一8");
4.1.3常用方法举例
尽管服务器非常关心用户提交的HTTP请求中form表单的信息,如前面的例4_1和例42中使用request对象的getParameter方法获取form表单提交的有关信息,但实际上,request对象调用相关方法可以获取请求的许多细节信息。request 对象常用方法如下:
(1) String getProtocol( )获取用户向服务器提交信息所使用的通信协议,例如http/1.1等。(2) String getServletPath()获取用户请求的JSP页面文件的名字(带目录符号\,例如hello. jsp).
(3) String getContextPath()
(4) int getContentLength()
(5) String getMethod()获取用户提交信息的方式,例如post或get。
(6) String getHeader(Štring s)
(7) Enumeration getHeaderNames()
(8) Enumeration getHeaders(String s)
(9) String getRemoteAddr()
(10) String getRemoteHost()
(11) String getServerName( )
(12) String getServerPort()
(13) Enumeration getParameterNames()
4.1.4处理HTML标记
(1)form标记
(2)input标记
文本框text
单选框radio
复选框checkbox
口令框password
隐藏hidden
提交键submit
重置键reset
(3)select、option标记
下拉式列表和滚动列表通过select和option标记来定义,经常作为form的子标记,为表单提供选择数据的GUI。select 标记将option作为子标记,形成下拉列表或滚动列表。
下拉列表的基本格式:
< select name = "myName">
<option value = "item1">文本描述</option ><option value = "item2">文本描述</option >
(4)textArea
(5)style样式标记
(6)table标记
(7)<image>标记
(8)embed标记
(9)style样式标记
(10)属性值格式的说明
4.1.5处理超链接
4.2 response 对象
4.2.1动态响应contentType属性
页面用page指令设置页面的contentType属性的值,那么Tomcat服务器将
按照这种属性值作出响应,将页面的静态部分返回给用户,用户浏览器接收到该
响应就会使用相应的手段处理所收到的信息。由于page指令只能为contentType指定一个值来决定响应的MIME类型,如果想动态地改变这个属性的值来响应用户,就需要使用
response对象的setContentType(String s)方法来改变contentType的属性值,该方法中的参数s可取值: text/html、text/ plain、image/ gif、image/ x xbitmap、image/jpeg、image/ pipeg、application/x- shockwave flash、application/ vnd. ms powerpoint、application/ vnd. ms-excel、application/ msword等。
当用setContentType(String s)方法动态改变了contentType 的属性值,即响应的MIME类型,Tomcat服务器就会按照新的MIME类型将JSP页面的输出结果返回给用户。
4.2.2 response 对象的HTTP文件头
当用户访问一个页面时,会提交一个HTTP请求给Tomcat服务器,这个请求包括一个请求行、HTTP头和信息体
4.2.3 response 对象的重定向
在某些情况下,当响应用户时,需要将用户重新引导至另一个页面。例如,如果用户输人的form表单信息不完整,就会再被引导到该form表单的输人页面。可以使用response对象的sendRedirect(URL url)方法实现用户的重定向,
即让用户从一个页面跳转到sendRedirect(URL url)中url 指定的页面,即所谓的客户端跳转。需要注意的是当使用sendRedirect(URL url)方法将用户从当前页
面重定向另一个页面时,Tomcat服务器还是要把当前JSP页面执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前页面的执行效果。如果在执行sendRedirect(URL url)方法后,紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前JSP页面的执行。
4.3 session 对象
4.3.1session对象的id
session对象被分配了一个String类型的id号,Tomcat服务器同时将这个id号发送到用户端,存放在用户(浏览器)的Cookie中。这样,session对象和用户之间就
建立起一-对应的关系,即每个用户都对应着一个session对象(称作用户的会话),不同用户(不同浏览器)的session对象互不相同,具有不同的id号码。当用户再访问该Web服务目录的其他页面时,或从该Web服务目录链接到其他Web服务器再回到该Web服务目录时,Tomcat服务器不再分配给用户的新session对象,而是使用完全相同的一个,直到session对象达到了最大生存时间或用户关闭自己的浏览器或Tomcat服务器关闭,Tomcat服务器将销毁用户的session对象,即和用户的会话对应关系消失。如果用户的session对象被销毁,当用户再请求访问该Web服务目录时,Tomcat服务器将为该用户创建一个新的session对象。简单地说,用户(浏览器)在访问一个Web服务目录期间,服务器为该用户分配一个session对象(称作和该用户的会话),服务器可以在各个页面使用这个session 对象记录当前用户的有关信息。而且服务器保证不同用户的session对象互不相同。
4.3.2session对象与URL重写
session对象能和用户建立起一一对应关系依赖于用户浏览器是否支持
Cookie。如果用户端浏览器不支持Cookie,那么用户在不同网页之间的session对象可能是互不相同的,因为Tomcat服务器无法将id存放到用户端浏览器中,就不能建立session对象和用户的一一对应关系。 用户将浏览器Cookie设置为禁止后(选择浏览器(IE)菜单→工具→Internet选项-一隐私-➢高级,将第三方Cookie设置成禁止),运行上述例4 13会得到不同的结果。也就是说,同一用户对应了多个session对象,这样Tomcat服务器就无法知道在这些页面上访问的实际上是同一个用户。
如果用户不支持Cookie,JSP页面可以通过URL重写来实现session对象的唯一一性。所谓URL重写,就是当用户从一个页面重新链接到一个页面时,通过向这个新的URL添加参数,把session对象的id传带过去,这样就可以保障用户在该Web服务目录的各个页面中的session对象是完全相同的。可以让response对象调用encodeURL( )或encodeRedirectURL()方怯实现URL重写,比如,如果从example4_ 13 _a. jsp页面链接到example4_ 13_ b.jsp 页面,首先在程序片中实现URL重写:
4.3.3 session 对象存储数据
session对象驻留在服务器端,该对象调用某些方法保存用户在访问某个Web服务目录期间的有关数据。session对象使用下列方法处理数据。
(1) public void settribute (String key ,Object obj)。session 对象可以调用
该方法将参数Object指定的对象obj添加到session对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加的对象被
(2) public Object getAttribute(String key)。获取session对象索引关键字是key的对象。由于任何对象都可以添加到session对象中,因此用该方法取回对象时,应显式转化为原
(3) public Enumeration getAttributeNames()。session 对象调用该方法产生一个枚举对象,该枚举对象使用nextElemets()遍历session中的各个对象所对应的关键字。
(4) public void removeAttribute(String key)。session 对象调用该方法移掉关键字key对应的对象。
例4_ 14实现猜数字游戏。当用户访问example4_ 14. jsp时,随机分配给用户一个1到100之间的整数,然后将这个整数存在用户的session对象中。用户在form表单的text里输人自己的猜测。用户输人猜测后单击提交键,访问example4 14 judge. jsp页面,该页面负责判断用户给出的猜测是否和用户的ssos对象中存放的那个整数相同。如果相同,就将用户定向到example_ 14 scss jsp;如果不相同就将用户定向到examplel 14 large jsp或example4 14_small isp,然后,用户在这些页面再重新提交新的猜测给exmplel 14 judge. isp页面。
4.3.4session对象的生存期限
一个用户在某个Web服务目录的session对象的生存期限依赖于session对
象是否调用invalidate()方法使得session 无效或session对象达到了设置的最长
的“发呆”状态时间以及用户是否关闭浏览器或服务器被关闭。所谓“发呆”状态
时间是指用户对某个Web服务目录发出的两次请求之间的间隔时间(默认的发呆时间是30分钟)。比如,用户对某个Web服务目录下的JSP页面发出请求,并得到响应,如果用户不再对该Web服务目录发出请求(可能去请求其他的Web服务目录),那么用户对该Web服务目录进入“发呆”状态,直到用户再次请求该Web服务目录时,“发呆”状态结束。
4.4 application 对象
4.4.1application对象的常用方法
(1) public void setAttribute(String key, Object obj)。 application调用该方法将参数object指定的对象obi添加到pplication对象中,并为添加的对象指定了-个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。
(2) public Object gttibte(String key)。获取aplication对象含有的关
键字是key的对象。由于任何对象都可以添加到aplication对象中,因此用该方法取回对象时,应显式转化为原来的类型。
(3) public Enumeration rertibuteNames)。aplication 对象调用该方法产生一个Enumeration(枚举)对象,该Enumeration对象使用nextElemetsO)遍历aplication 中的各个对象所对应的关键字。
(4D public vord rmevtbtelString key)。从当前aplieation 对象中删除关键字是key的对象。
(5) public StringgetServletInfo()。获取Servlet编译器的当前版本的信息。
由于application对象对所有的用户都是相同的,因此,在某些情况下,对该对象的操作需要实现同步CSynchronized处理。
需要注意的是,Tomer服务器启动后application对象中已经有8个关键字,因此,JSP程序使用setAtAtribute((String; key,Object obj)在pplication对象中存储数据时,key要避免
8关键字的名字都很长,例如: javax. servlet. context. tempdirog.
使用这8个关键字ne JspApplicationContextImpl等。
4.4.2application留言板
在实际项目中一般是使用数据库来实现留言板,不会用application对象(除
非是非常简单的告示留言板)。例4. _16是为了练习使用application 内置对象,让视预讲解其担当留言板的角色,并设置留言板上最多可留言9999条,即让application对
象用1至9999之间的一个整数作为关键字(key)存放一条 留言。用户通过example4 16. isp向example4_ 16 pane. jisp提交姓名留言标题和留言内容example4_ 16 pane. jsp页面用application存放这些内容,查找这些内容所使用的关键字是1至99999之间的某个整数。当留言数目超过99999时,提示用户无法再留言。example4_ 16_ show. jsp负责显示全部留言。example4_ 16_ delete, jsp页面负责删除留言(删除留言时需要输入密码123456,这个密码可以
4.5out对象
out对象是一个输出流,用来向用户端输出数据。在前面的许多例子里曾多次使用out对象进行数据的输出。out 对象可调用如下的方法用于各种数据的输出,例如:
(1) out. print( boolean)或out. println( boolean)用于输出一个布尔值。(2) out. print(char)或out. println(char)用于输出一个字符。
(3) out. print(double)或out. println(double)用于输出一个双精度的浮点数。
(4) out. print( fload)或out. println(float)用于输出一个单精度的浮点数。
(5) out. print(long)或out. println(long)用于输出一个长整型数据。
(6) out. print(String)或out. println(String)用于输出一个String对象的字符序列。println和print方法的区别是: println 会向缓存区写人一个换行,而print不写人换行。但是浏览器的显示区域目前不识别println写人的换行,如果希望浏览器显示换行,应当向浏览器写人"<br>"实现换行。