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 方法可以获得表单中单个对应的 Java 对象,它是一个 Part 类型的对象,其中封装了所上传的文件的内容、名称、类型等信息。
Part getPart(java.lang.String name)
当处理文件上传操作时,使用该方法 可以获 取文件 上传 表单中 所有的 对应的 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
"); writer.close(); }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 worldhtml页面
报文结果