目录
Request对象获取请求行
Request对象获取请求头
Request获取请求参数
Request对象接收表单请求参数的中文乱码处理
Request域对象
请求转发
请求转发和重定向区别
Request对象:
负责获取客户端的请求数据
request对象是从客户端向服务器发出请求,包括⽤户提交的信息以及客户端的⼀些信息。客户端可通过
HTML
表单或在⽹⻚地址后⾯提供参数的⽅法提交数据,然后服务器通过
request对象的相关⽅法来获取这些数据。
查看Servlet中的service⽅法得知, Servlet中使⽤的ServletRequest接⼝, ⽽我们使⽤的是ServletRequest
的⼦接⼝HttpServletRequest, 它继承⾃ServletRequest, 是与HTTP协议相关的Request请求对象 我们使⽤的⼦接⼝HttpServletRequest, 此接⼝对象由Tomcat引擎提供 可以实现客户端向服务器发出请求, 请求内容包括: 请求⾏,请求头,请求体
Request对象获取请求行
API
⽅法
返回值
描述
getMethod()
String
获取提交的⽅式
(GET,POST)
getRequestURI()
String
获取请求的参数
,
请求服务器路径( / 开始 )
getRequestURL()
StringBuffer
获取请求的参数
,
请求服务器路径(http 开始)
getQueryString()
String
获取请求⾏ 问号后⾯的参数
(GET)
getContextPath()
String
获取
WEB
应⽤名称
代码演示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request对象⽅法 getMethod()获取客户端的请求⽅式
String method = request.getMethod();
System.out.println(method);
//⽅法 String getRequestURI() 获取请求服务器路径
//⽅法 StringBuffer getRequestURL() 获取请求服务器路径
String URI = request.getRequestURI();
StringBuffer URL = request.getRequestURL();
System.out.println("URI=="+URI);// /web03/line
System.out.println("URL=="+URL);// http://localhost:8080/web03/line
//⽅法 String getQueryString()获取请求⾏,?后⾯的所有参数
String query = request.getQueryString();
System.out.println(query);//user=tom&pass=123
//获取WEB应⽤名称 String getContextPath()
String path = request.getContextPath();
System.out.println(path);// /web03
//获取WEB应⽤名称, 结合重定向使⽤
//response.sendRedirect(request.getContextPath()+"/ddd");
}
Request对象获取请求头
请求头数据格式键值对
, k:v
指导性信息
,
指导服务器
⽅法
返回值
描述
getHeader(String name)
String
获得⼀个key对应⼀个value的请求头
getHeaderNames()
Enumeration
获取所有的请求头的键
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* Enumeration getHeaderNames() 获取所有的请求头的键
* 返回值Enumeration接⼝ (向量枚举)
* 集合:1.0-1.1 Enumeration 集合1.2 迭代器
*Iterator迭代器接⼝: hasNext() next()
* Enumeration接⼝: hasMoreElement() nextElement()
*/
Enumeration<String> enums = request.getHeaderNames();
while (enums.hasMoreElements()){
key = enums.nextElement();
String value = request.getHeader(key);
System.out.println(key+"=="+value);
}
}
Request获取请求参数
⽅法
返回值
描述
getParameter(表单中的name
值
)
String
获得提交的参数(⼀个
name对应⼀个value
)
getParameterValues(表单中的
name
值
)
String[]
获得提交的参数(⼀个
name对应多个value
)
getParameterMap()
Map<String,String[]>
获得提交的参数,将提交的参数名称和 对应值存⼊到⼀个
Map
集合中
<body>
<form action="/param" method="post">
⽤户名:<input type="text" name="username"><br/>
密 码:<input type="password" name="password"><br/>
爱 好:<input type="checkbox" name="hobby" value="Basketball">篮球
<input type="checkbox" name="hobby" value="football">⾜球
<input type="checkbox" name="hobby" value="pingpang">乒乒球
<br/>
<input type="submit">
</form>
</body>
@WebServlet(urlPatterns = "/param")
public class ParamServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得提交的参数(⼀个name对应⼀个value)
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username +" == " +password);
//获得提交的参数(⼀个name对应多个value)
String[] hobbies = request.getParameterValues("hobby");
System.out.println("hobbies = " + Arrays.toString(hobbies));
//获得提交的参数,将提交的参数名称和对应值存⼊到⼀个Map集合中
Map<String, String[]> map = request.getParameterMap();
for(String key : map.keySet()){
String[] values = map.get(key);
System.out.println(key + " == " + Arrays.toString(values));
}
}
Request对象接收表单请求参数的中文乱码处理
POST
⽅式接收中⽂
产⽣乱码的原因:
post⽅式提交的数据是在请求体中,request对象接收到数据之后,放⼊request的缓冲区中。缓冲区就有编码(默认
ISO-8859-1:不⽀持中⽂).
解决⽅案:
将request的缓冲区的编码修改了即可
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将request的缓冲区的编码修改
request.setCharacterEncoding("utf-8");
//获取请求参数
String user = request.getParameter("user");
System.out.println("user = " + user);
}
GET
⽅式接收中⽂
Tomcat8.5
版本之后
, Tomcat
⾃动处理了
get请求的中⽂乱码问题,在
Tomcat8.5
之前的版本中
, get
请求的中⽂乱码需要⾃⾏处理
产⽣乱码原因:
get⽅式提交的数据在请求⾏的url后⾯,在地址栏上其实就已经进⾏了⼀次URL的编码了。
解决⽅案
:
将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取到,以UTF-8的⽅式进⾏解码。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
get⽅式提交的数据在 请求⾏中
Tomcat8.5之后, Tomcat⾃动处理了get请求的中⽂乱码问题, 但在之前的Tomcat版本
中,get请求的中⽂乱码需要⾃⾏处理
⽼版本Tomcat中⽂乱码的解决:将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取
到,以UTF-8的⽅式进⾏解码。
*/
String user = request.getParameter("username");
//将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取到
byte[] bytes = user.getBytes("iso-8859-1");
//以UTF-8的⽅式进⾏解码
String value = new String(bytes, "utf-8");
System.out.println("user = " + user);
}
Request域对象
Request
作为域对象的
API
Request
作为域对象作⽤范围
Request
对象其实就是从客户端浏览器向服务器发送的⼀次请求信息的封装。那么实质上向
Request中所保存的数据有效期也是
⼀次请求范围。
⼀次请求范围:从客户端浏览器向服务器发送⼀次请求,服务器针对这次请求对浏览器作出响应。当服
务器作出响应之后,请求对象就销毁了,保存在其中的数据就⽆效了。
API
⽅法
返回值
描述
setAttribute(String name, Object obj)
void
向
Request
域中保存数据
getAttribute(String name)
Object
从
Request
域中获取数据
removeAttribute(String name)
void
从
Request
域中移除数据
代码演示:
servlet1
@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向request域对象中 存值
request.setAttribute("code","java");
//从request域对象中 取值
Object value = request.getAttribute("code");
System.out.println("MyServlet1 value = " + value);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
servlet2
@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request域对象中 取值
Object value = request.getAttribute("code");
System.out.println("MyServlet2 value = " + value);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
请求转发
请求转发的写法
通过ServletRequest对象获得RequestDispatcher对象
方法返回值描述
getRequestDispatcher(String path)
RequestDispatcher
获得
RequestDispatcher
对象
再根据RequestDispatcher中的⽅法进⾏请求转发
⽅法
返回值
描述
forward(ServletRequest request, ServletResponse response)
void
进⾏请求转发
转发的实现步骤
request对象⽅法获取转发器 RequestDispatcher getRequestDispatcher("转发地址")返回值就是转发器
使⽤转发器对象的⽅法 forward
代码实现
servlet1
@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向request域对象中 存值
request.setAttribute("code","java");
//从request域对象中 取值
Object value = request.getAttribute("code");
System.out.println("MyServlet1 value = " + value);
//进⾏请求转发
request.getRequestDispatcher("/my2").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
servlet2
@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request域对象中 取值
Object value = request.getAttribute("code");
System.out.println("MyServlet2 value = " + value);
//响应回浏览器
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("我是MyServlet2 ⻚⾯数据");
}
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
doGet(request, response);
}
}
请求转发和重定向区别
区别总结
请求转发是⼀次请求⼀次响应,⽽重定向是两次请求两次响应。 请求转发地址栏不会变化的,重定向地址栏发⽣变化。 请求转发路径不带⼯程名,重定向需要带⼯程名路径。 请求转发只能在本⽹站内部,重定向可以定向到任何⽹站。
代码演示
MyServlet1
@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向request域对象中 存值
request.setAttribute("code'","java");
//从request域对象中 取值
Object value = request.getAttribute("code");
System.out.println("MyServlet1 value = " + value);
//进⾏请求转发
//request.getRequestDispatcher("/my2").forward(request, response);
//进⾏重定向
response.sendRedirect("/my2");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
MyServlet2
@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request域对象中 取值
Object value = request.getAttribute("code");
System.out.println("MyServlet2 value = " + value);
//响应回浏览器
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("我是MyServlet2 ⻚⾯数据");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
注意:
如果需要使⽤request进⾏值传递,需要通过请求转发完成。 如果⻚⾯需要跳转到其他⽹站上必须使⽤重定向, 不能使⽤request进⾏值传递。