在前面的几篇文章中,介绍了servlet的一些基本的知识。接下来的几篇开始介绍一下servlet中的几个常用的对象。本文主要先简单的了解一下HttpServletRequest对象。
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中。HttpServletReques代表请求象,其中封装了对请求中具有请求行、请求头、实体内容的操作的方法。(对于请求行、请求头、请求实体内容这里不做过多的解释,后期会补上一片讲解HTTP协议的文章围绕这个知识点再做详细的分析和学习。)
下面从一下几个方面来介绍该对象的一些特性:
一、获取请求头信息
getHeader(name)方法 --- String ,获取指定名称的请求头的值
getHeaders(String name)方法 --- Enumeration<String> ,获取指定名称的请求头的值的集合,因为可能出现多个重名的请求头
getHeaderNames()方法 --- Enumeration<String> ,获取所有请求头名称组成的集合
getIntHeader(name)方法 --- int ,获取int类型的请求头的值
getDateHeader(name)方法 --- long(日期对应毫秒) ,获取一个日期型的请求头的值,返回的是一个long值,从1970年1月1日0时开始的毫秒值
二、获取客户端相关信息
1.资源路径
getRequestURL 方法返回客户端发出请求完整URL【网络地址,eg:http://****:8080/……】
getRequestURI 方法返回请求行中的资源名部分,在权限控制中常用【服务器端地址】
2. 协议和版本号
getScheme 协议--http
getProtocal版本号--http/1.1
3.请求信息
getQueryString方法返回请求行中的参数部分
getRemoteAddr 方法返回发出请求的客户机的IP地址
getRemotePort 方法返回发出请求的客户机的端口号
4.请求方式
getMethod 得到客户机请求方式
5. 项目名称
getContextPath 获得当前web应用虚拟目录名称
三、获取请求实体内容
getParameter(name) --- String 通过name获得值
getParameterValues(name) --- String[ ] 通过name获得多值 checkbox
getParameterNames() --- Enumeration<String> 获得所有请求参数名称组成的枚举
getParameterMap() --- Map<String,String[ ]> 获取所有请求参数的组成的Map集合,注意,其中的键为String,值为String[]
四、request实现请求转发
ServletContext可以实现请求转发,request也可以。在forward之前输入到response缓冲区中的数据,如果已经被发送到了客户端,forward将失败,抛出异常。
在forward之前输入到response缓冲区中的数据,但是还没有发送到客户端,forward可以执行,但是缓冲区将被清空,之前的数据丢失。注意丢失的只是请求体中的内
容,头内容仍然有效。在一个Servlet中进行多次forward也是不行的,因为第一次forward结束,response已经被提交了。
总之,一条原则,一次请求只能有一次响应,响应提交走后,就再没有机会输出数据给浏览器了。
五、利用请求域传递对象
作用域:就是在某一个范围中可以使用。作为作用域对象,一般都有getAttribute(),setAttribute,removeAttribute三个方法,其内部就是维持了一个
Map<String,Object>对象。
对于HttpServletRequest作用域对象有一下特点:
1. 生命周期:在service方法调用之前由服务器创建,传入service方法。整个请求结束,request生命结束。
2.作用范围:整个请求链。
3.作用:在整个请求链中共享数据。
六、RequestDispatcher进行include操作【了解即可】
forward没有办法将多个servlet的输出组成一个输出,因此RequestDispatcher提供了include方法,可以将多个Servlet的输出组成一个输出返回个浏览器。