简介
Servlet API 中定义的 ServletRequest 接口类用于封装请求消息。
HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装HTTP 请求消息。
在service() 方法内部调用HttpServletRequest 对象的各种方法来获取请求消息。
获取请求行的相关信息
- HTTP请求消息的请求行包括请求方式、资源路径和HTTP协议版本:
GET /lampbrother/servlet/RequestURI?param1=a¶m2=b HTTP/1.1
- getMethod:返回HTTP请求消息中的请求方式。
- getRequestURI:返回请求行中的资源名部分。
- getQueryString :返回请求行中的参数部分。
- getProtocol:返回请求行中的协议名和版本。
- getContextPath:返回请求资源所属于的WEB应用程序的路径。
- getPathInfo:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
- getPathTranslated:返回URL中的额外路径信息所对应的资源的真实路径。
- getServletPath方法:Servlet的名称或Servlet所映射的路径。
获取网络连接信息
getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。 (*)
getRemoteHost方法返回发出请求的客户机的完整主机名,即“pc1.atguigu.com”这种格式。
getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。
getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。
getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。
getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。
getServerName方法返回当前请求所指向的主机名。
getServerPort方法返回当前请求所连接的服务器端口号。
getScheme方法返回请求的协议名,例如http、https或ftp。
getRequestURL方法返回客户端发出请求时的完整URL。
获取请求头信息
- getHeader方法
- getHeaders方法
- getHeaderNames方法
- getIntHeader方法
- getDateHeader方法
- getContentType方法
- getContentLength方法
- getCharacterEncoding方法
获取请求参数
- getParameter方法
- getParameterValues方法
- getParameterNames方法
- getParameterMap方法
请求域属性
- 存储在ServletRequest对象中的对象称之为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据。
- 与请求域属性相关的方法:
- setAttribute方法
- getAttribute方法
- removeAttribute方法
- getAttributeNames方法
测试代码
login.jsp
Insert title here
LoginServlet.java
package mac.com;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/*
* ServletRequest:
* 1.获取用户输入内容
* 1.1.public String getParameter(String name):根据请求参数的name,返回参数值。
* 1.2.public String[] getParameterValues(String name):根据请求参数的name,返回参数值的数组。
* 1.3.public Enumeratinon getParameterNames():获取所有的name值。
* 1.4.public
* 2.获取URI(URL = IP + 端口 + URI)(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
* 2.1.public String getRequestURI():获取请求的URI
* 3.获取请求方式(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
* 3.1.public String getMethod():获取请求方式
* 4.获取查询字符串(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
* 4.1.public String getQueryString():获取查询字符串(就是URL?后面的那一部分,所以POST请求方式值是null)
* 5.和Attribute相关的方法,后面写
* 6.基本上都可以获取,自己去查询API(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
*
*/
public class LoginServlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
/*
* public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException:
* 由 servlet 容器调用,以允许 servlet 响应某个请求。
* 此方法仅在 servlet 的 init() 方法成功完成之后调用。
* 应该为抛出或发送错误的 servlet 设置响应的状态代码。
* servlet 通常运行在可同时处理多个请求的多线程 servlet 容器中。开发人员必须知道要同步对所有共享资源
* (比如文件、网络连接以及 servlet 的类和实例变量)的访问。有关 Java 中多线程编程的更多信息,可从
* the Java tutorial on multi-threaded programming 中获得。
* req 包含客户端请求的 ServletRequest 对象
* res 包含 servlet 的响应的 ServletResponse 对象
* Throws ServletException:
* 如果发生妨碍 servlet 正常操作的异常
* Throws java.io.IOException:
* 如果发生输入或输出异常
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
/*
* 每一次请求都会调用这个方法。
*/
/*
* ServletRequest:
* 定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参
* 数传递给该 servlet 的 service 方法。
* ServletRequest 对象提供包括参数名称、参数值、属性和输入流的数据。扩展 ServletRequest 的接口可提供
* 其他特定于协议的数据,例如 javax.servlet.http.HttpServletRequest 提供的 HTTP 数据。
*/
/*
* ServletResponse:
* 定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,
* 并将它作为参数传递给 servlet 的 service 方法。
*/
System.out.println("有人在请求我!!!");
/*
* ServletReques:封装了请求信息。
* ServletResponse:封装了请求信息。
* 他们的实现都是服务器完成的,当服务器调用service方法的时候,会自动的传入这两个各个参数。
*/
System.out.println("--------------------------------");
/*
* public String getParameter(String name):
* 以 String 形式返回请求参数的值,如果该参数不存在,则返回 null。
* 请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串
* 或发送的表单数据中。
* 只有在确定参数只有一个值时,才应该使用此方法。如果参数可能拥有一个以上的值,则使
* 用 #getParameterValues。
* 如果将此方法用于一个有多个值的参数,则返回的值等于 getParameterValues 返回的数组中的第一个值。
* 如果参数数据是在请求正文中发送的,比如发生在 HTTP POST 请求中,则通过 #getInputStream 或
* #getReader 直接读取正文可能妨碍此方法的执行。
* name 指定参数名称的 String
* return 表示单个参数值的 String
*/
//1.获取form表单中name所对应的单个输入值
String user = req.getParameter("user");
String password = req.getParameter("password");
System.out.println("user: " + user);
System.out.println("password: " + password);
System.out.println("--------------------------------");
/*
* public String[] getParameterValues(String name):
* 返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。
* 如果该参数只有一个值,则数组的长度为 1。
* name 包含请求其值的参数的名称的 String
* return 包含参数值的 String 对象数组
*/
//2.获取form表单中name的多个输入值
String[] interestValues = req.getParameterValues("interest");
for( String value : interestValues ) {
System.out.println("interest: " + value);
}
System.out.println("--------------------------------");
/*
* ublic java.util.Enumeration getParameterNames()
* 返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。
* 如果该请求没有参数,则此方法返回一个空的 Enumeration。
* return String 对象的 Enumeration,每个 String 都包含一个请求参数的名称;如果该请求没有参数,
* 则返回一个空的 Enumeration
*/
//3.获取所有的name值
Enumeration names = req.getParameterNames();
while( names.hasMoreElements() ) {
String name = names.nextElement();
System.out.println("names: " + name);
}
System.out.println("--------------------------------");
/*
* public java.util.Map getParameterMap()
* 返回此请求的参数的 java.util.Map。请求参数是与请求一起发送的额外信息。
* 对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
* return 将参数名称作为键、参数值作为映射值的不可变 java.util.Map。参数映射
* 中的键的类型为 String。参数映射中的值的类型为 String 数组。
*/
//4.获取name-values的Map
//Map
Map parameterMap = req.getParameterMap();
//Keys
Set keySet = parameterMap.keySet();
//key
for( String name : keySet ) {
//key-values
String[] values = parameterMap.get(name);
//key-value
for( String value : values ) {
System.out.println(name + ": " + value );
}
}
System.out.println("------------------------------");
/*
* HttpServletRequest:
* Implements: ServletRequest
* Implemented by: HttpServletRequestWrapper
* 扩展 javax.servlet.ServletRequest 接口,为 HTTP servlet 提供请求信息。
* servlet 容器创建 HttpServletRequest 对象,并将该对象作为参数传递给
* servlet 的 service 方法(doGet、doPost,等等)。
*/
HttpServletRequest hsr = (HttpServletRequest)req;
/*
* public String getRequestURI()
* 返回此请求的 URL 的一部分,从协议名称一直到 HTTP 请求的第一行中的查询字符串。
* Web 容器不会解码此 String。例如:
* HTTP请求的第一行 返回的值
* POST /some/path.html HTTP/1.1 /some/path.html
* GET http://foo.bar/a.html HTTP/1.0 /a.html
* HEAD /xyz?a=b HTTP/1.1 /xyz
* 要使用某个方案和主机重新构造 URL,可使用 HttpUtils#getRequestURL。
* return 包含 URL 从协议名称一直到查询字符串的那一部分的 String
*/
//5.获取URI
String uri = hsr.getRequestURI();
System.out.println("URI: " + uri);
System.out.println("URL: " + hsr.getRequestURL());
//URI: /006_ServletRequest/LoginServlet
//URL: http://localhost:8080/006_ServletRequest/LoginServlet
System.out.println("------------------------------");
/*
* public String getMethod()
* 返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。
* 返回的值与 CGI 变量 REQUEST_METHOD 的值相同。
* return 指定用于发出此请求的方法名称的 String
*/
//6.获取请求方式
String method = hsr.getMethod();
System.out.println("method: " + method);
//7.获取查询字符串
String queryString = hsr.getQueryString();
System.out.println("QueryString: " + queryString);
//QueryString: user=mac&password=123&interest=reading&interest=watchTV&interest=writeCode
}
}
运行结果
欢迎加入交流群:451826376