Request请求笔记
1. 请求对象概述
1.1 什么是请求响应对象
-
request和response对象是由服务器创建的。我们来使用它们
-
request对象是来获取请求消息,response对象是来设置响应消息
1.2 request对象继承体系结构
ServletRequest – 接口
| 继承
HttpServletRequest – 接口
| 实现
org.apache.catalina.connector.RequestFacade (tomcat实现的类)
2. Request常用方法介绍
2.1 获取请求行及各种路径信息
返回值 | 方法名 | 说明 |
---|---|---|
String | getMethod() | 获得请求方式 |
String | getContextPath() | 获取虚拟目录名称 |
String | getServletPath() | 获取Servlet映射路径 |
String | getRemoteAddr() | 获取访问者ip地址 |
String | getRequestURI() | 获取统一资源标识符 |
StringBuffer | getRequestURL() | 获取统一资源定位符 |
String | getProtocol() | 获取协议及版本 |
//1. 获取请求方式 :getMethod()
String method = request.getMethod();
System.out.println(method);
//2.(*)获取虚拟目录:getContextPath()
String contextPath = request.getContextPath();
System.out.println(contextPath);
//3. 获取Servlet路径: getServletPath()
String servletPath = request.getServletPath();
System.out.println(servletPath);
//4. 获取客户机的IP地址:getRemoteAddr
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
//5.获取请求URI:getRequestURI
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//6.获取请求URL:getRequestURL
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//7. 获取协议及版本:getProtocol
String protocol = request.getProtocol();
System.out.println(protocol);
2.2 获取请求头信息
返回值 | 方法名 | 说明 |
---|---|---|
String | getHeader(String name) | 根据请求头名称获取一个值 |
Enumeration | getHeaderNames() | 获取所有请求头名称 |
//1. 根据请求头名称获取一个值
//演示获取请求头数据:user-agent
String agent = request.getHeader("user-agent");
//判断agent的浏览器版本
if(agent.contains("Chrome")){
//谷歌
System.out.println("谷歌来了...");
}else if(agent.contains("Firefox")){
//火狐
System.out.println("火狐来了...");
}
//1.获取所有请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
//2.遍历
while(headerNames.hasMoreElements()){
//得到当前便利出的请求头名称
String name = headerNames.nextElement();
//根据名称获取请求头的值
String value = request.getHeader(name);
System.out.println(name+"---"+value);
}
2.3 获取请求参数信息
返回值 | 方法名 | 说明 |
---|---|---|
String | getParameter(String name) | 根据名称获取数据 |
String[] | getParameterValues(String name) | 根据名称获取所有数据 |
Enumeration | getParameterNames() | 获取所有名称 |
Map<String,String[]> | getParameterMap() | 获取所有参数的键值对 |
//1.根据参数名称获取参数值 getParameter()
String username = request.getParameter("username");
System.out.println("username = " + username);
//2. 根据参数名称获取参数值的数组 getParameterValues()
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//3.获取所有请求的参数名称 getParameterNames()
Enumeration<String> parameterNames = request.getParameterNames();
//遍历Enumeration
while(parameterNames.hasMoreElements()){
//得到当前遍历出的参数名
String name = parameterNames.nextElement();
System.out.println(name);
String value = request.getParameter(name);
System.out.println(value);
System.out.println("----------------");
}
//4. 获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
Set<String> keyset = parameterMap.keySet();
for (String name : keyset) {
//获取键获取值
String[] values = parameterMap.get(name);
System.out.println(name);
System.out.println(Arrays.toString(values));
System.out.println("-----------------");
}
2.4 中文乱码问题
中文乱码问题:
- get方式:tomcat 8 已经将get方式乱码问题解决了
- post方式:会乱码
解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
//1.设置编码
request.setCharacterEncoding("utf-8");
//获取请求参数username
String username = request.getParameter("username");
System.out.println(username);
3. Request转发
请求转发:一种在服务器内部的资源跳转方式
- 步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) - 特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
3. 转发是一次请求
@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo8888被访问了。。。");
//转发到demo9资源
/*第一种方式*/
//RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9");
//requestDispatcher.forward(request,response);
/*第二种方式*/
request.getRequestDispatcher("/requestDemo9").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
@WebServlet("/requestDemo9")
public class RequestDemo9 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo9999被访问了。。。");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4. Request共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
// 往request中存数据
request.setAttribute("msg","hello");
//从request中根据key获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg); //hello
//从request中根据key删除数据
request.removeAttribute("msg");