ServletRequest接口
在容器中接收到Web客户端的 HTTP请求之后会先解析该请求,并创建与之相对应的请求对象和响应对象,而创建的请求对象的类型就是ServletRequest 类型。
1、ServletRequest
简单点说就是该接口封装了请求信息。可以从中获取到任何的请求信息。同时该接口还定义了向请求对象中设置数据的方法。
使用该接口和客户端进行数据传递的大致过程为:容器在解析HTTP请求之后,将HTTP请求中的数据映射到新创建的ServletRequest对象中,再将该对象传递给相应的Servlet实例的service方法,所以说ServletRequest对象中存在客户端向Servlet程序发送的数据信息。
2、ServletRequest常用方法
2.1、获取请求协议
-
java.lang.String getProtocol()
返回请求协议
2.2、获取请求头
-
java.lang.String getContentType()
返回请求体的MIME类型,如果类型未知则返回null
-
int getContentLength()
返回输入流可用的请求体的长度(以字节为单位),如果长度未知则返回-1
2.3、获取请求参数
-
java.lang.String getParameter(java.lang.String name)
以字符串的形式返回请求参数的值,如果该参数不存在,则返回null -
java.util.Enumeration<java.lang.String> getParameterNames()
该方法用于获取请求对象中所有的请求参数名称 -
java.lang.String[] getParameterValues(java.lang.String name)
该方法用于从请求对象中获取指定参数名称对应的多个值的方法,当页面上通过同一个名称传递多个取值时,可以使用该方法来获取这些取值(比如页面上的 checkbox) -
java.util.Map<java.lang.String,java.lang.String[]> getParameterMap()
该方法用于获取所有请求参数及其取值,其返回类型是 Map,其中 key 为参数名称,value 为参数值。因为同一个参数名称可能对应多个取值,所以这里的 value 是 String 数组类型
2.4、读取请求体数据
-
java.io.BufferedReader getReader()
该方法返回一个可以 读取请求体中 所包含内容的 字符输入 流,当请求报头中content-type 字段的取值为 application/x-www-form-urlencoded 或 text/plain 时,可以通过该方法来读取请求体中所包含的字符数据。 -
ServletInputStream getInputStream()
该方法返回一个可以 读取请求体中 所包含内容的 字节输入流 ,当请求报头中content-type 字段的取值为 multipart/form-data 时,可以通过该方法来读取请求体中所包含的字节数据。
2.5、字符编码
-
void setCharacterEncoding(java.lang.String env)
该方法用于设置请求体中使用的字符编码的名称。 -
java.lang.String getCharacterEncoding()
该方法用于获取请求体中使用的字符编码方案的名称。如果从未指定过处理请求体数据时所使用的字符编码方案,则返回 null,此时容器会采用当前默认的字符编码方案来处理请求体中的数据
2.6、属性操作
-
void setAttribute(String attributeName, Object attributeValue )
该方法用于将指定对象关联到当前请求对象的指定属性上 -
java.lang.Object getAttribute(java.lang.String name)
该方法用于从请求对象中获取指定名称的属性的属性值 -
java.util.Enumeration<java.lang.String> getAttributeNames()
用于从请求对象中获取所有的属性名称 -
void removeAttribute(java.lang.String name)
该方法用于从请求对象中删除指定的属性
3、HttpServletRequest
HttpServletRequest 接口继承了 ServletRequest 接口,它是针对 HTTP协议提供的一个接口,容器通过该类型的对象向 HttpServlet 传递 HTTP 请求数据,其中提供了大量的获取 HTTP 请求数据的方法。
3.1、获取_请求行_数据
-
java.lang.StringBuffer getRequestURL()
用于获取完整的请求路径,包括协议、主机名、端口、资源路径等。 -
java.lang.String getRequestURI()
用于获取当前请求所访问的资源路径(不包含协议、主机名、端口等) -
java.lang.String getMethod()
用于获取本次请求所采用的请求方式,比如 GET -
java.lang.String getContextPath()
用于获取当前 Web 应用对应的路径
-
java.lang.String getQueryString()
当客户端采用 GET 方式请求指定资源时,如果同时向服务器发送了数据,则这些数据被编码到 request-URL 中,该方法即用于获取 request-URL 中的 queryString 部分
3.2、获取_请求头_数据
-
Cookie[] getCookies()
用于从请求头中获取所有的 cookie。 -
long getDateHeader(java.lang.String name)
用于从请求头中获取指定名称的、用来表示日期和时间的字段取值 -
java.lang.String getHeader(java.lang.String name)
用于从请求头中获取指定名称的字段的单个取值 -
java.util.Enumeration<java.lang.String> getHeaderNames()
用于获取请求头中所有的字段名称。 -
java.util.Enumeration<java.lang.String> getHeaders(java.lang.String name)
用于从请求头中获取指定名称的字段的所有取值 -
int getIntHeader(java.lang.String name)
以整数形式返回请求头中指定名称的字段的单个取值
3.3、获取_请求体_数据
-
Part getPart(java.lang.String name)
当处理文件上传操作时,使用 getPart 方法可以获得表单中单个<input type="file">对应的 Java 对象,它是一个 Part 类型的对象,其中封装了所上传的文件的内容、名称、类型等信息。
-
Part getPart(java.lang.String name)
当处理文件上传操作时,使用该方法 可以获 取文件 上传 表单中 所有的 <input type="file">对应的 Part 对象对应的 Collection 集合
4、案例
-
Servlet类继承HttpServlet并实现其中service方法
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String method = request.getMethod(); StringBuffer buffer = request.getRequestURL(); String queryString = request.getQueryString(); if(queryString != null){ buffer.append("?"); buffer.append("queryString"); } String url = buffer.toString(); String protocol = request.getProtocol(); System.out.println("------------请求行---------------"); System.out.println("请求方式:"+method+"\t 请求路径:"+url+"\t 请求协议:"+protocol);
System.out.println("------------请求头---------------"); Enumeration<String> e = request.getHeaderNames(); //获取请求头信息的所有的key。 //遍历所有的键 while(e.hasMoreElements()){ String key = e.nextElement(); //根据键取值 String value = request.getHeader(key); //根据键取出对应的值(请求头的信息) System.out.println(key+":"+value); } System.out.println("------------请求体---------------"); BufferedReader bufferedReader = request.getReader(); String string = null; while (( s = bufferedReader.readLine()) != null){ System.out.println(string); } response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); writer.println("<p'>Hello world</p>"); writer.close();}
-
html页面
<form method="post" action="/prese.do"> <input type="text" name="username" placeholder="请输入登录名"> <input type="password" name="password" placeholder="请输入密码"> <input type="submit" value="登录"> </form> <form method="get" action="/prese.do"> <input type="text" name="username" placeholder="请输入登录名"> <input type="password" name="password" placeholder="请输入密码"> <input type="submit" value="登录"> </form> -
报文结果