Request&Response
第一章-Request
一、Request概述
什么是Request?
request这个对象不用事先声明,就可以在JSP网页中使用,在编译为Servlet之后,它会转换为javax.servlet.http.HttpServletRequest形态的对象,HttpServletRequest对象是有关于客户端所发出的请求的对象,只要是有关于客户端请求的信息,都可以藉由它来取得,例如请求标头、请求方法、请求参数、客户端IP,客户端浏览器等等信息。
HttpServletRequest类
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
常用方法
方法 | 描述 |
---|---|
getParameterNames() | 取得客户端所发出的请求参数名称 |
getParameter() | 可以让您指定请求参数名称,以取得对应的设定值 |
getServerName() | 获取请求的服务器 |
getProtocol() | 获取使用协议 |
getMethod() | 获取请求方式(GET/POST) |
getServerPort() | 获取请求的端口号 |
getContextPath() | 获取Context路径 |
getServletPath() | 获取Servlet路径 |
getRequestURI() | 获取请求的资源路径 |
getRequestURL() | 获取请求的统一资源定位符(绝对路径) |
getQueryString() | 获的请求参数 |
getRemoteAddr() | 获取使用者主机IP |
getRemotePort() | 获取使用者使用的端口号 |
@WebServlet("/demo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用request对象
//获取请求行的信息:
//获取请求方法
String method = request.getMethod();
System.out.println(method);
//获取请求的客户端的IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
//获取请求的URI路径: 统一资源标识符,没有包含主机名
String uri = request.getRequestURI();
System.out.println(uri);
//获取请求的url路径: 统一资源定位符,包含主机地址的
String url = request.getRequestURL().toString();
System.out.println(url);
//获取项目的部署路径(虚拟路径)
String contextPath = request.getContextPath();
System.out.println(contextPath);
//使用request获取请求头的信息: getHeader(name)
//有一个请求头的key叫做user-agent: 客户端的信息
String header = request.getHeader("user-agent");
System.out.println(header);
}
}
二、获得请求参数
方法
方法 | 描述 |
---|---|
String getParameter(String name) | 获得指定参数名对应的值。如果没有则返回null,如果有多个获得第一个。 例如:username=jack |
String[] getParameterValues(String name) | 获得指定参数名对应的所有的值。此方法专业为复选框提供的。 例如:hobby=抽烟&hobby=喝酒&hobby=敲代码 |
Map<String,String[]> getParameterMap() | 获得所有的请求参数。key为参数名,value为key对应的所有的值。 |
代码
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用request获取请求参数:
//根据一个参数名获取一个参数值
String username = request.getParameter("username");
System.out.println(username);
//根据一个参数名获取多个参数值
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//3. 使用一个方法获取所有的请求参数: 所有请求参数肯定就是多个键值对,
//多个键值对肯定要存储在Map集合中,从集合中获取键和值
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keys = parameterMap.keySet();
for (String key : keys) {
String[] values = parameterMap.get(key);
for (String value : values) {
System.out.println(key + ":" + value);
}
}
}
}
请求参数乱码处理
我们在输入一些中文数据提交给服务器的时候,服务器解析显示出来的一堆无意义的字符,就是乱码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tla8gLUd-1606637520211)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201129151830327.png)]
//在获取请求参数之前解决post方式的中文乱码问题
request.setCharacterEncoding("UTF-8");
三、请求转发
方法
request.getRequestDispatcher(url).forward(request, response);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eqF8k6a-1606637520213)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201129154538833.png)]
特征
- 跳转操作是由服务器执行的,所以客户端地址栏不会发生变化
- 跳转操作不会发起新的请求
- 可以跳转到WEB-INF中的资源,但是不能跳转到其它项目的资源
注意
- 如果在Servlet01中请求转发到Servlet02,那么在Servlet01中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由Servlet02来完成;如果是使用请求包含,那么没有这个限制
- 请求转发虽然不能输出响应体,但还是可以设置响应头的例如response.setContentType(”text/html;charset=utf-8”)
- 请求包含大多是应用在JSP页面中,完成多页面的合并
- 请求转发大多是应用在Servlet中,转发目标大多是JSP页面
四、作为域对象
概念
request对象作为域对象向存取数据,它的作用范围是一次请求中,和请求转发一起使用
方法
- setAttribute(name,value)往域对象中存数据
- getAttribute(name)从域对象中获取数据
- removeAttribute(String name) 从域对象中删除数据
代码
@WebServlet("/demo03")
public class Demo03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String nickname = "川建国";
//使用request域对象将nickname存进去
//request域对象的使用范围是:一次请求
request.setAttribute("nickname",nickname);
//请求转发跳转到Demo04
request.getRequestDispatcher("/demo04").forward(request, response);
}
}
@WebServlet("/demo04")
public class Demo04 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//在Demo04中获取Demo03中的那个nickname
//从request域对象中取出nickname
String nickname = (String) request.getAttribute("nickname");
System.out.println("获取的nickname的值是:" + nickname);
}
}
第二章-Response
一、Response概述
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置。
二、操作响应行、头、体
操作响应行
-
API:response.setStatus(int code);
-
常见的响应状态码:
- 200 成功
- 302 重定向
- 304 读缓存
- 404 客户端错误
- 500 服务器错误
操作响应头
-
API:setHeader(String name,String value);
-
常用的响应头 :
Refresh: 定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)
Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx)
Content-Disposition: 告诉浏览器下载
Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)
操作响应体
1. API:
- response.getWriter()获取字符输出流
- response.getOutputStream()获取字节输出流
- writer.write()/print()输出字符串解决响应数据的中文乱码:
- response.setContentType("text/html;charset=UTF-8")
三、请求重定向
概念:
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端,我给你新的地址,你去新地址访问。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYdXOw7Z-1606637520215)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201129160415361.png)]
代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo05被访问了");
req.setAttribute("key", "value");
// 设置响应状态码302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080/07_servlet/response2");
resp.setHeader("Location", "http://localhost:8080");
resp.sendRedirect("http://localhost:8080");
}
四、重定向与请求转发的区别
重定向的特点:
- 重定向的跳转是由浏览器发起的,在这个过程中浏览器会发起两次请求
- 重定向跳转可以跳转到任意服务器的资源,但是无法跳转到WEB-INF中的资源
- 重定向跳转不能和request域对象一起使用
- 重定向跳转浏览器的地址栏中的地址会变成跳转到的路径
请求转发的特点:
-
请求转发的跳转是由服务器发起的,在这个过程中浏览器只会发起一次请求
-
请求转发只能跳转到本项目的资源,但是可以跳转到WEB-INF中的资源
t(“http://localhost:8080”);
}
### 四、重定向与请求转发的区别
#### 重定向的特点:
1. 重定向的跳转是由浏览器发起的,在这个过程中浏览器会发起两次请求
2. 重定向跳转可以跳转到任意服务器的资源,但是无法跳转到WEB-INF中的资源
3. 重定向跳转不能和request域对象一起使用
4. 重定向跳转浏览器的地址栏中的地址会变成跳转到的路径
#### 请求转发的特点:
1. 请求转发的跳转是由服务器发起的,在这个过程中浏览器只会发起一次请求
2. 请求转发只能跳转到本项目的资源,但是可以跳转到WEB-INF中的资源
3. 请求转发可以和request域对象一起使用