《Servlet与JSP核心编程》读书笔记——Servlet技术

servlet处理表单数据

表单数据的作用

<form action="..."></form>

如果省略action,那么数据将提交给当前页面对应的URL

在servlet中读取表单数据

1、HttpServletRequest.getParameter方法可以得到表单参数的值
2、如果同一参数名在表单数据中多次出现,可以调用HttpServletRequest.getParameterValues获取参数的值,该方法返回字符串数组
3、参数名查找:使用HttpServletRequest.getParameterNames,以Enumeration的形式返回,如果当前请求中没有参数,则返回空的Enumeration(不是null)。因为Enumeration是一个接口,所以该方法不保证返回的对象的具体数据结构实现,不保证以特定次序返回结果。
getParameterNames的替代方法是getParameterMap,该方法返回一个Map:参数名(字符串)是表的建,参数的值(字符串数组,与getParameters方法相同)是表的值
request.getParameter默认使用服务器的当前字符集解释输入,要改变默认的字符编码,需要使用ServletRequest.setCharacterEncoding方法,该方法必须在访问任何请求参数之前调用

分析参数值

分析参数值时,需要检查下面三种情况:
1、参数的值为null,如果表单中没有期望名称的文本字段或其他元素,期望的参数名根本不会出现在请求中,则request.getParameter返回null
2、参数的值为空字符串,如果表单提交时相关文本字段为空,则request.getParameter的调用会返回空字符串(”“)
3、参数的值为非空字符串,但格式错误

过滤字符串中的HTML特殊字符

如果servlet希望生成含有诸如<或>等字符的HTML,只需简单地使用标准的HTML字符实体—&lt;或&gt;,类似的,如果想使用双引号或者&符号,只需使用&quot;或&amp;如果不做替换,最终生成的HTML代码将会不正确,因为<或>常常被解释为HTML标记中标签的一部分,属性值中的双引号可能会被解释为属性值的结尾,而&符号根本不允许出现在属性值中。
如果需要读取请求参数,并将它们的值显示在生成的页面中,则必须过滤出那些特殊的HTML字符,不这样做可能会导致输出中缺失某些部分,或者某些部分格式错误。

HTTP相关

请求头的读取

HttpServletRequest.getHeader(XXX)
如果请求提供了指定的报头,则返回一个String,否则,返回null。报头名称不是大小写敏感的。

获取请求自身的信息

(1)getMethod:返回请求方法(GET或者POST或其他)
(2)getRequestURI:返回URL中主机和端口之后,请求参数之前的部分(如:http://localhost:8080/test/test.jsp?param=test,返回的是/test/test.jsp)
(3)getQueryString:返回的是请求参数(如上面的地址,返回的是param=test)
(4)getProtocol:返回的是请求协议

常用的HTTP请求头

(1)Accept
指定客户端能够处理的MIME类型
(2)Accept-Charset
指定客户端可以使用的字符集
(3)Accept-Encoding
指定客户端能够处理的编码类型
(4)Content-Length
只适用于POST请求,给定POST数据的大小,以字节为单位
(5)Cookie
向服务器返回cookie,这些cookie是之前服务器发送给浏览器的
(6)If-Modified-Since
只有在指定日期之后页面发生更改,客户端才希望获取该页面,如果没有更新,服务器发送304报头(Not Modified)
(7)Referer
用户点击链接到达当前页面时所处的页面位置,如果用户直接输入页面地址,客户端不会发送Referer
(8)User-Agent
标识请求的浏览器或者客户端,因为这个报头容易被篡改,所以不建议根据此报头进行判断客户端类型

指定HTTP状态代码

设置任意状态代码:HttpServletResponse.setStatus,如果状态代码比较特殊,并且伴有相关文档内容,一定要在返回任何文档内容之前设置状态代码
设置302状态代码:sendRedirect(String url),生成302响应及Location报头,命令浏览器访问新的URL
设置404状态代码:sendError(int code,String message)发送状态代码(一般为404)及一小段简短的消息

HTTP状态代码

100-199信息性的,标示客户应该采取其他动作
200-299请求成功
300-399用于已经移走的文件,常常包括Location报头,指出新的地址
400-499表示由客户引发的错误
500-599表示由服务器引发的错误
常用状态代码
(1)200
表示一切正常,默认值
(2)302
表示服务器命令客户端访问新的URL
(3)400
表示客户请求中含有语法错误
(4)404
表示客户请求的资源未找到
(5)500
表示服务器内部错误
(6)503
表示服务不可用,通常是由于维护工作或超负荷工作,服务器不能做出响应

设置响应报头

HttpServletResponse.setHeader(String header,String headerValue)设置报头的名称和报头的值,必须在返回实际的文档之前设置。
HTTP允许相同的报头名出现多次,我们希望加入新的报头,而非替换已有的同名报头,而setHeader会替换同名的已有报头,可以使用addHeader添加一个报头,如果需要确定是否已经设置了特定的报头,可以使用containsHeader进行检查

常用的HTTP响应报头

(1)Allow
服务器支持的请求方法(GET、POST等)
(2)Cache-Control
该报头告诉客户端,什么环境可以缓存文档,常用取值(public:可以缓存,private:只适用于单个用户,存储在私有缓存中,no-cache:不能缓存,no-store:不要缓存文档,甚至不应该存储在磁盘临时目录,max-age=xxx,xxx秒之后,应该将文档认作失效)
(3)Content-Disposition
要求浏览器询问用户,将响应存储在磁盘给定名称的文件中
(4)Content-Encoding
页面传输过程中使用的编码方式
(5)Content-Language
文档使用的语言
(6)Content-Type
响应文档的MIME类型
(7)Expires
规定内容的过期时间,从而不需要再继续缓存,如果和cache-control:max-age=xxx同时存在,max-age优先
(8)Last-Modified
文件的最后修改时间,与请求头中的If-Modified-Since一起使用
(9)Location
状态代码在300-399之间时使用,通知浏览器文档的地址,浏览器自动链接到这个地址
(10)Refresh
标明浏览器多长时间之后请求最新的页面
(11)Retry-After
可以和503响应结合使用,告诉客户端多久之后可以重复它的请求

cookie管理

cookie是小段的文本信息,Web服务器将它发送到浏览器,之后,再访问同一网站或域时,浏览器又将它原封不动的带回
向客户端发送cookie涉及3个步骤
(1)创建Cookie对象,调用Cookie的构造函数,给出cookie的名称和值,二者都是字符串,但不应该包含空格和=,”/?@:;
(2)设置可选属性,通常需要设置最大时效,默认情况下cookie是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器后被删除,如果希望cookie存储在磁盘上,需要使用setMaxAge(int seconds)方法,以秒为单位,默认maxAge为负数,如果为0则命令浏览器删除该cookie
(3)将Cookie放入HTTP响应报头,创建和操作Cookie对象对客户程序没有任何影响,必须显示地调用response.addCookie将cookie发送到客户端
从客户端读取cookie分为两步
(1)调用request.getCookies得到Cookie对象的数组
(2)遍历数组,调用Cookie的getName方法查找需要的cookie

除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie,服务端来自于浏览器的cookie并没有设置这些属性,它们不属于有浏览器返回给服务器的属性,比如,不能仅仅通过设置cookie的最大时效,发送给客户端,在随后的请求中查找到相应的cookie,读取它的属性值,再修改它存回cookie中,必须每次都调用setMaxAge方法。
cookie创建之后就不能更改它的名称。
通过Cookie的setPath(String path)、getPath()可以设置和获取cookie所适用的路径,如果没有指定一个路径,浏览器将cookie返回发送cookie的页面所在的目录中或之下的URL,如果要指定cookie适用网站所有的URL,使用cookie.setPath(“/”)

会话跟踪

会话的使用

会话的使用分为四个基本步骤
1、访问与当前请求关联的会话对象
调用request.getSession获取HttpSession对象,只能在发送任何文档内容到客户程序之前调用request.getSession
2、查找与会话相关联的信息
HttpSession对象存在于服务器端,它们不在网络上传送,通过HttpSession对象的getAttribute将返回值转换为恰当的类型,并检查结果是否为null
3、存储会话中的信息
使用setAttribute,设置要存储的值和相应的键
4、废弃会话数据
使用removeAttribute,废弃与指定键关联的值,使用invalidate将整个会话废弃掉
使用getMaxInactiveInterval()和setMaxInactiveInterval(int seconds)可以读取和设置会话在被自动废弃之前应该保持多长时间,时间为秒

浏览器会话与服务器会话

默认的,会话跟踪基于存储在浏览器内存中(而非写到磁盘上)的cookie,因此,除非servlet显式地读取输入的JSESSIONID cookie,设置最大时效和路径并将它发送出去,否则退出浏览器会造成浏览器会话中断,客户程序将不能再访问浏览器会话。但服务器并不知道浏览器已经关闭,因而服务器需要将服务器会话维护在内存中,直到它处于非活动状态超过设定的间隔为止,或者显式地调用invalidate()方法可以直接终止服务器会话。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值