request的类型是:javax.servlet.http.HttpServletRequest。request是服务器在收到客户端(浏览器)的请求后创建的对象,用来封装请求数据。
request的功能有一下几种
- 封装请求头数据
- 封装了请求正文数据,如果是GET请求,那么没有正文;
- request是一个域对象,可以把它当成Map来添加获取数据
- request提供了请求转发和请求包含的功能。
request域方法:
- void setAttribute(String name,Object value);可以用来存储一个对象也可以用来存储一个域属性
- Object getAttribute(String name); 用来获取存储的对象
- void removeAttribute(String name);用来移除request域中的属性
- Enumeration getAttributeName();获取属性所有域属性的名称
request获取请求头数据
- String getHeader(String name);获取指定名称的请求头;
- Enumeration getHeader();获取所有请求头名称
- int getIntHeader(String name) 获取值为int类型的请求头
request 获取请求相关方法:
request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。
- int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
- String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
- String getMethod():返回请求方法,例如:GET
- Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
- String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
- void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
- String getContextPath():返回上下文路径,例如:/hello
- String getQueryString():返回请求URL中的参数,例如:name=zhangSan
- String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
- StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
- String getServletPath():返回Servlet路径,例如:/oneServlet
- String getRemoteAddr():返回当前客户端的IP地址;
- String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
- String getScheme():返回请求协议,例如:http;
- String getServerName():返回主机名,例如:localhost
- int getServerPort():返回服务器端口号,例如:8080
request获取请求参数
主要有两种:GET、POST请求
GET请求:
- 浏览器地址栏直接输入
- 超链接
- 表单:<form>默认使用GET
POST请求
- 只要当表单中method=“post”时,才是POST请求
GET请求和POST请求的区别:
GET请求:
- 请求参数会在浏览器的地址栏中显示,所以不安全;
- 请求参数长度限制长度在1K之内;
- GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
POST请求:
- 请求参数不会显示浏览器的地址栏,相对安全;
- 请求参数长度没有限制;
请求转发(forward)和请求包含(include):
首先两者都是由多个Servlet来处理一个请求,不同的是:请求转发前面经过的servlet只能添加请求头,不能添加请求体(加了也会被覆盖,如果过大还会报错);请求包含可以添加请求头也可以添加请求题。
一句话概括:转发:留头不留体;包含:留头又流体
请求转发(和包含)与重定向的区别:
- 请求转发是一个请求,重定向是两个请求;
- 请求转发地址栏不会变化,重定向地址栏会变化
- 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用。
- 请求转发对多个servlet的请求方法是相同的,要么是GET,要么是POST;重定向第二个请求一定是GET