HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
方法
1.获取客户机信息
方法声明 | 功能描述 |
String getMethod() | 该方法用于获取HTTP请求消息中的请求方式(如GET、POST等) |
String getRequestURI() | 该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分 |
String getQueryString() | 该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容 |
String getProtocol() | 该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0或HTTP/1.1 |
String getContextPath() | 该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以“/”开头,表示相对于整个WEB站点的根目录,路径结尾不含“/”。 如果请求URL属于WEB站点的根目录,那么返回结果为空字符串("") |
String getServletPath() | 该方法用于获取Servlet所映射的路径(url-pattern) |
String getRemoteAddr() | 该方法用于获取请求客户端的IP地址,其格式类似于“192.168.0.3” |
String getRemoteHost() | 该方法用于获取请求客户端的完整主机名,其格式类似于“www.sw.com”。 需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址 |
String getRemotePort() | 该方法用于获取请求客户端网络连接的端口号 |
String getLocalAddr() | 该方法用于获取Web服务器上接收当前请求网络连接的IP地址 |
String getLocalName() | 该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名 |
int getLocalPort() | 该方法用于获取Web服务器上接收当前网络连接的端口号 |
String getServerName() | 该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分 |
int getServerPort() | 该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分 |
String getScheme() | 该方法用于获取请求的协议名,例如http、https或ftp |
StringBuffer getRequestURL() | 该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。 注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改 |
2. 获得客户机请求头
方法声明 | 功能描述 |
String getHeader(String name) | 该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null; 如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值 |
Enumeration getHeaders(String name) | 该方法返回一个Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。 在多数情况下,一个头字段名在请求消息中只出现一次,但有时候可能会出现多次 |
Enumeration getHeaderNames() | 该方法用于获取一个包含所有请求头字段的Enumeration对象 |
int getIntHeader(String name) | 该方法用于获取指定名称的头字段,并且将其值转为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为-1; 如果获取到的头字段的值不能转为int类型,将发生NumberFormatException异常 |
Long getDateHeader(String name) | 该方法用于获取指定头字段的值,并将其按GMT时间格式转换成一个代表日期/时间的长整数, 这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值 |
3. 获取请求参数
方法声明 | 功能描述 |
String getParameter(String name) | 该方法用于获取某个指定名称的参数值,如果请求消息中没有包含指定名称的参数,getParameter()方法返回null; 如果指定名称的参数存在但没有设置值,则返回一个空串; 如果请求消息中包含有多个该指定名称的参数,getParameter()方法返回第一个出现的参数值 |
String[] getParameterValues(String name) | HTTP请求消息中可以有多个相同名称的参数(通常由一个包含有多个同名的字段元素的FORM表单生成), 如果要获得HTTP请求消息中的同一个参数名所对应的所有参数值,那么就应该使用getParameterValues()方法, 该方法用于返回一个String类型的数组 |
Enumeration getParameterNames() | getParameterNames()方法用于返回一个包含请求消息中所有参数名的Enumeration对象, 在此基础上,可以对请求消息中的所有参数进行遍历处理 |
Map getParameterMap() | getParameterMap()方法用于将请求消息中的所有参数名和值装入进一个Map对象中返回 |
public class ServletRequestLearn extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//getAttribute(request); ......
//setCharacterEncoding(request);
}
/*
* setAttribute(String name,Object o):在请求中存储一个属性值
* 参数:name指定的参数值,o对应的name的value值
*/
public static void setAttribute(HttpServletRequest request) {
String getAttribute = (String) request.getAttribute("myj");
System.err.println("getAttribute = " + getAttribute);
request.setAttribute("myj", "maomao");
String getSetAttribute = (String) request.getAttribute("myj");
System.err.println("getSetAttribute = " + getSetAttribute);
}
/*
* getParameterValues():获取一个参数的值,返回类型为Object类型的数组。
*/
public static void getParameterValues(HttpServletRequest request) {
String params[] = request.getParameterValues("name");
for (int i = 0; i < params.length; i++) {
System.err.println(params[i]);
}
}
/*
* getParameterNames():返回一个Enumeration,包含请求中所有参数。
*/
public static void getParameterNames(HttpServletRequest request) {
Enumeration enumParams = request.getParameterNames();
while (enumParams.hasMoreElements()) {
String obj = (String) enumParams.nextElement();
String getParams = request.getParameter(obj);
System.err.println(obj + " : " + getParams);
}
}
/*
* getParameterMap():返回请求中所有参数的形成的Map。
*/
public static void getParameterMap(HttpServletRequest request) {
Map<String, String[]> map = request.getParameterMap();
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
String strArray[] = map.get(str);
for (int i = 0; i < strArray.length; i++) {
System.err.println(str + " : " + strArray[i]);
}
}
}
/*
* getAttribute(String name):返回指定名称的属性值
* 参数:name指定的参数值
*/
public static void getAttribute(HttpServletRequest request) {
Object getAttribute = request.getAttribute("name");
System.err.println("getAttribute = " + getAttribute);
}
/*
* getParameter(String name):返回指定参数值,如果参数不存在则返回null。
* 参数:name指定的参数值
*/
public static void getParameter(HttpServletRequest request) {
String getParameter = request.getParameter("name");
System.err.println("getParameter = " + getParameter);
}
/*
* getCharacterEncoding():返回请求体中使用的字符编码。
*/
public static void getCharacterEncoding(HttpServletRequest request) {
String getCharacterEncoding = request.getCharacterEncoding();
System.err.println("getCharacterEncoding = " + getCharacterEncoding);
}
/*
* getContentLength(): 返回请求体和可用输入流的字节长度,返回-1标识长度未知。
*/
public static void getContentLength(HttpServletRequest request) {
int getContentLength = request.getContentLength();
System.err.println("getContentLength = " + getContentLength);
}
/*
* getContentType():返回请求数据体的MIME类型,如果类型未知,返回空值
*/
public static void getContentType(HttpServletRequest request) {
String getContentType = request.getContentType();
System.err.println("getContentType = " + getContentType);
}
/*
* getLocalAddr():返回发送请求的IP地址。(也就是客户端电脑的IP地址)
*/
public static void getLocalAddr(HttpServletRequest request) {
String getLocalAddr = request.getLocalAddr();
System.err.println("getLocalAddr = " + getLocalAddr);
//127.0.0.1
}
/*
* getLocales():返回一个保存Locale对象的Enumeration对象,这些Locale对象都是客户端可接受的,并且Locale依据客户端的优先次序存储Enumeration。
*/
public static void getLocales(HttpServletRequest request) {
Enumeration<Locale> getLocale = request.getLocales();
while (getLocale.hasMoreElements()) {
Locale local = getLocale.nextElement();
System.err.println("local = " + local.getCountry());
//zh_CN
}
}
/*
* getLocalName():返回发送请求的主机名称。
*/
public static void getLocalName(HttpServletRequest request) {
String getLocalName = request.getLocalName();
System.err.println("getLocalName = " + getLocalName);
//如localhost
}
/*
* getLocale():返回客户端的Local对象,包含基于接受语言的头。(说明:java.util.Locale 对象表示了特定的地理、政治和文化地区。)
*/
public static void getLocale(HttpServletRequest request) {
Locale getLocale = request.getLocale();
System.err.println("getLocale = " + getLocale);
//zh_CN
}
/*
* getLocalPort():返回发送请求的主机IP端口号。
*/
public static void getLocalPort(HttpServletRequest request) {
int getLocalPort = request.getLocalPort();
System.err.println("getLocalPort = " + getLocalPort);
//如:8088
}
/*
* getProtocol(): 返回请求使用的协议名称和版本。
*/
public static void getProtocol(HttpServletRequest request) {
String getProtocol = request.getProtocol();
System.err.println("getProtocol = " + getProtocol);
//如:HTTP/1.1
}
/*
* getRemoteAddr():获取发送请求的客户端或者最后代理主机的IP地址。
*/
public static void getRemoteAddr(HttpServletRequest request) {
String getRemoteAddr = request.getRemoteAddr();
System.err.println("getRemoteAddr = " + getRemoteAddr);
//如127.0.0.1
}
/*
* getRemoteHost():获取发送请求的客户端或者最后代理主机的名称。
*/
public static void getRemoteHost(HttpServletRequest request) {
String getRemoteHost = request.getRemoteHost();
System.err.println("getRemoteHost = " + getRemoteHost);
//如:127.0.0.1
}
/*
* getRemotePort():获取发送请求的客户端或者最后代理主机上的端口。
*/
public static void getRemotePort(HttpServletRequest request) {
int getRemotePort = request.getRemotePort();
System.err.println("getRemotePort = " + getRemotePort);
//如3285,是会变得端口
}
/*
* getScheme():返回产生请求的模式名称,例如,http, https, ftp.
*/
public static void getScheme(HttpServletRequest request) {
String getScheme = request.getScheme();
System.err.println("getScheme = " + getScheme);
}
/*
* getServerName():返回发送请求的主机名称。
*/
public static void getServerName(HttpServletRequest request) {
String getServerName = request.getServerName();
System.err.println("getServerName = " + getServerName);
//如localhost
}
/*
* getServerPort():返回发送请求的主机端口。
*/
public static void getServerPort(HttpServletRequest request) {
int getServerPort = request.getServerPort();
System.err.println("getServerPort = " + getServerPort);
//如8088
}
/*
* isSecure():返回是否使用安全通道。例如https。
*/
public static void isSecure(HttpServletRequest request) {
boolean isSecure = request.isSecure();
System.err.println("isSecure = " + isSecure);
//如false
}
/*
* removeAttribute(String name):从请求中移除一个属性。
*/
public static void removeAttribute(HttpServletRequest request) {
System.err.println("移除前name的值 = " + request.getAttribute("name"));
request.removeAttribute("name");
System.err.println("移除后name的值 = " + request.getAttribute("name"));
}
/*
* setCharacterEncoding(String name):重新设置请求体的字符编码。
* 参数:name指定的参数值
*/
public static void setCharacterEncoding(HttpServletRequest request) throws UnsupportedEncodingException {
request.setCharacterEncoding("GBK");
}
/**
* ************************不是很懂得************************************************
*/
/*
* getAttributeNames():返回一个Enumeration包含请求可用到的所有属性名称。
*/
/*
* getReader():获取请求体的BufferedReader对象表示。
*/
public static void getReader(HttpServletRequest request) throws IOException {
BufferedReader params = request.getReader();
System.err.println(params);
}
/*
* getInputStream():输入流用来从请求体读取二进制数据。
*/
public static void getInputStream(HttpServletRequest request) throws IOException {
ServletInputStream getInputStream = request.getInputStream();
System.err.println("getInputStream = " + getInputStream);
}
public static void getAttributeNames(HttpServletRequest request) {
Enumeration enumParames = request.getAttributeNames();
System.err.println("enumParames = " + enumParames);
while (enumParames.hasMoreElements()) {
//String getAttributeNames = (String) enumParames.nextElement();
//System.err.println("getAttributeNames = " + getAttributeNames);
Object obj = enumParames.nextElement();
System.err.println("obj = " + obj);
}
}
}
例子
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
System.out.println("getRequestURL: " + request.getRequestURL());
System.out.println("getRequestURI: " + request.getRequestURI());
System.out.println("getQueryString: " + request.getQueryString());
System.out.println("getRemoteAddr: " + request.getRemoteAddr());
System.out.println("getRemoteHost: " + request.getRemoteHost());
System.out.println("getRemotePort: " + request.getRemotePort());
System.out.println("getRemoteUser: " + request.getRemoteUser());
System.out.println("getLocalAddr: " + request.getLocalAddr());
System.out.println("getLocalName: " + request.getLocalName());
System.out.println("getLocalPort: " + request.getLocalPort());
System.out.println("getMethod: " + request.getMethod());
System.out.println("-------request.getParamterMap()-------");
//得到请求的参数Map,注意map的value是String数组类型
Map map = request.getParameterMap();
Set < String > keySet = map.keySet();
for (String key: keySet) {
String[] values = (String[]) map.get(key);
for (String value: values) {
System.out.println(key + "=" + value);
}
}
System.out.println("--------request.getHeader()--------");
//得到请求头的name集合
Enumeration < String > em = request.getHeaderNames();
while (em.hasMoreElements()) {
String name = (String) em.nextElement();
String value = request.getHeader(name);
System.out.println(name + "=" + value);
}
}
浏览器上地址栏输入:http://localhost:8080/RequestAndResponse/requestmethod?name=sunjob&password=123456&password=haha ,执行结果:
getRequestURL: http://localhost:8080/RequestAndResponse/requestmethod
getRequestURI: /RequestAndResponse/requestmethod
getQueryString: name=sunjob&password=123456&password=haha
getRemoteAddr: 127.0.0.1
getRemoteHost: 127.0.0.1
getRemotePort: 2374
getRemoteUser: null
getLocalAddr: 127.0.0.1
getLocalName: localhost
getLocalPort: 8080
getMethod: GET
-------request.getParamterMap()-------
name=sunjob
password=123456
password=haha
--------request.getHeader()--------
host=localhost:8080
user-agent=Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0
accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language=zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
accept-encoding=gzip, deflate
connection=keep-alive
cache-control=max-age=0
总结
ServletRequest是通用request,提供一个request应该具有的最基本的方法,HttpServletRequest是ServletRequest的孩子,针对http协议进行了进一步的增强。