14.7 Request_功能
14.7.1 获取请求消息数据
14.7.1.1 获取请求行数据
- eg:
GET /day14/demo1?name=zhangsan HTTP/1.1
- 方法:
- 1.获取请求方式 : GET
- 2.
(*)
获取虚拟目录: /day14
- 3.获取Servlet路径: /demo1
- 4.获取get方式请求参数: name=zhangsan
- 5.获取请求URl: /day14/demo1
String getRequestURI()
: /day14/demo1StringBuffer getRequestURL()
:http://localhost/day14/demo1- URL: 统一资源定位符 : http://localhost/day14/demo1
- URI: 统一资源标识符 : /day14/demo1
- 6.获取协议及版本: HTTP/1.1
- 7.获取客户机的IP地址:
- 示例:
package com.xww.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ServletRequest")
public class ServletRequest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method = request.getMethod();
System.out.println(method);
String contextPath = request.getContextPath();
System.out.println(contextPath);
String servletPath = request.getServletPath();
System.out.println(servletPath);
String queryString = request.getQueryString();
System.out.println(queryString);
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
String protocol = request.getProtocol();
System.out.println(protocol);
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
}
14.7.1.2 获取请求头数据
- 方法:
String getHeader(String name)
: 通过请求头的名称获取请求头的值。Enumeration<String> getHeaderNames()
: 获取所有的请求头名称。
- 示例:
package com.xww.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet( "/requestDemo4")
public class ServletRequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name+"---"+value);
}
}
}
14.7.1.3 获取请求体数据
- 请求体: 只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数。
- 步骤:
- 1.获取流对象;
BufferedReader getReader()
:获取字符输入流,只能操作字符数据。ServletInputStream getInputStream()
:获取字节输入流,可以操作所有类型数据 。
- 2.再从流对象中拿数据。
- 示例:
package com.xww.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BufferedReader br = request.getReader();
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
- List item
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
14.7.2 其他功能
14.7.2.1 获取请求参数通用方式
- 获取请求参数通用方式: 不论get还是post请求方式都可以使用下列方法来获取请求参数.
String getParameter(String name)
:根据参数名称获取参数值 ,
username=zs&password=123;String[] getParameterValues(String name)
:根据参数名称获取参数值的数组, hobby=xx&hobby=game;Enumeration<String> getParameterNames()
:获取所有请求的参数名称;Map<String,String[]> getParameterMap()
:获取所有参数的map集合。- 中文乱码问题:
- get方式: tomcat 8 已经将get方式乱码问题解决了;
- post方式: 会乱码。
- 解决: 在获取参数前,设置request的编码
request.setCharacterEncoding("utf-8");
- 示例:
package com.xww.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet( "/requestDemo6")
public class RequestDemo6 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String[] hobbies = request.getParameterValues("hobby");
Enumeration<String> parameterNames = request.getParameterNames();
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keyset = parameterMap.keySet();
for (String name : keyset) {
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
System.out.println("-----------------");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
14.7.2.2 请求转发
- 请求转发: 一种在服务器内部的资源跳转方式 。
- 步骤:
- 1.通过 request对象 获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
- 2.使用 RequestDispatcher对象 来进行转发:
forward(ServletRequest request, ServletResponse response)
- 特点:
- 浏览器地址栏路径不发生变化;
- 只能转发到当前服务器内部资源中;
- 转发是一次请求。
- 图示:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/92143345d1285436da5f94e46a26ad38.png#pic_center)
- 示例:
package com.xww.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request7....");
request.getRequestDispatcher("/requestDemo8").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
14.7.2.3 共享数据
- 域对象: 一个有作用范围的对象,可以在范围内共享数据
- request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
void setAttribute(String name,Object obj)
:存储数据Object getAttitude(String name)
:通过键获取值void removeAttribute(String name)
:通过键移除键值对
- 示例:
package com.xww.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
request.setAttribute("name","xww");
System.out.println("request7....");
request.getRequestDispatcher("/requestDemo8").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
package com.xww.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request8...");
Object obj = request.getAttribute("name");
System.out.println(obj);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
14.7.2.4 获取ServletContext
- 方法:
ServletContext getServletContext()