Servlet 之 Request
request对象和response对象的原理
- request和response对象是由服务器创建的。我们来使用它们
- request对象是来获取请求消息,response对象是来设置响应消息
request对象继承体系结构
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
request功能
-
获取请求消息数据
-
获取请求行数据
GET
方法: -
获取请求方式 :
String getMethod() -
(*)获取虚拟目录:
String getContextPath() -
获取Servlet路径:
String getServletPath() -
获取get方式请求参数:
String getQueryString() -
(*)获取请求URI:
String getRequestURI():
StringBuffer getRequestURL() :URL:统一资源定位符
URI:统一资源标识符 -
获取协议及版本:HTTP/1.1
String getProtocol() -
获取客户机的IP地址:
String getRemoteAddr()
-
-
获取请求头数据
方法:
(*)String getHeader(String name):通过请求头的名称获取请求头的值
EnumerationgetHeaderNames():获取所有的请求头名称 -
获取请求体数据:
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:-
获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据- 再从流对象中拿数据
-
获取请求参数的通用方式
根据参数获取参数值:
String name = request.getParameter("name");
根据参数获取参数值的数组:
String[] hobbies = request.getParameterValues("hobby");
获取所有请求的参数名称:
Enumeration
获取所有参数的map集合
Map<String,String[]> getParameterMap();
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("/RegisterDemo")
public class RegisterDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通用方法
//根据参数获取参数值
String name = request.getParameter("name");
//根据参数获取参数值的数组
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//获取所有请求的参数名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
String name1 = parameterNames.nextElement();
System.out.print(name1);
String value = request.getParameter(name1);
System.out.println(value);
//获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
Set<String> keyset = parameterMap.keySet();
for (String key : keyset) {
//获取集合中的键和值
String[] values = parameterMap.get(key);
System.out.println(key);
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);
}
}
相应的html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
<form action="/RegisterDemo" method="post">
<input type="text" placeholder="请输入用户名" name="username"> <br>
<input type="text" placeholder="请输入密码" name="password"> <br>
<input type="checkbox" name="hobby" value="game"> 游戏
<input type="checkbox" name="hobby" value="study"> 学习
<input type="submit" value="注册">
</form>
</head>
<body>
</body>
</html>
请求转发:一种在服务器内部的资源跳转方式
-
步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
-
特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
-
共享数据:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对