没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
30页
一、Servlet请求和响应 web容器概念:顾名思义就像一个盒子,里面可以装东西,这里的web容器 (Tomcat,WebLogic,WebSphere)就是装载Servlet和JSP的环境、负责管理它们的各种对象,并且负责 它们的生命周期以及相关服务的链接。 1. 客户端对Web服务器发出HTTP请求 2. HTTP服务器(Apache)收到HTTP请求以后,转发给Web容器(Tomcat),此时Web容器会解析 HTTP请求的内容,创建各种对象(例如HttpServletRequest、HttpServletResponse、 HttpSession等) 3. web容器通过请求的URL来选择需要用哪个Servlet来处理请求(这个就是web.xml中配置的或者 @webServlet注解的作用了) 4. Servlet根据请求对象(HttpServletRequest)来决定做什么样的处理,然后通过响应对象 (HttpServletResponse)来创建响应。 5. Web服务器将响应回传到客户端。
资源推荐
资源详情
资源评论
一、Servlet请求和响应
web容器概念:顾名思义就像一个盒子,里面可以装东西,这里的web容器
(Tomcat,WebLogic,WebSphere)就是装载Servlet和JSP的环境、负责管理它们的各种对象,并且负责
它们的生命周期以及相关服务的链接。
从浏览器请求到服务器响应的过程:
1. 客户端对Web服务器发出HTTP请求
2. HTTP服务器(Apache)收到HTTP请求以后,转发给Web容器(Tomcat),此时Web容器会解析
HTTP请求的内容,创建各种对象(例如HttpServletRequest、HttpServletResponse、
HttpSession等)
3. web容器通过请求的URL来选择需要用哪个Servlet来处理请求(这个就是web.xml中配置的或者
@webServlet注解的作用了)
4. Servlet根据请求对象(HttpServletRequest)来决定做什么样的处理,然后通过响应对象
(HttpServletResponse)来创建响应。
5. Web服务器将响应回传到客户端。
提问:web容器接收了Http请求做了什么事情?
回答:以下这张时序图,很好的说明了web容器都干了啥。
方法 作用
void addHeader(java.lang.String name,
java.lang.String value)
添加 给定 响应头名称 和 值(字符串) 的响应头
void addDateHeader(java.lang.String
name, long date)
添加 给定 响应头名称 和 值( 日期格式 long) 的响应
头
例: Date:Tue, 20 Mar 2018 09:13:19 GMT
void addIntHeader(java.lang.String
name, int value)
添加 给定 响应头名称 和 值(整数) 的响应头
boolean
containsHeader(java.lang.String name)
返回一个boolean值 用来表明 响应头 中 属性名为
name 的响应头 是否被设定
方法 作用
void setHeader(java.lang.String name,
java.lang.String value)
设置 给定 响应头名称 和 值(字符串) 的
响应头
void setDateHeader(java.lang.String name, long
date)
设置 给定 响应头名称 和 值(日期) 的响
应头
void setIntHeader(java.lang.String name, int value)
设置 给定 响应头名称 和 值(整数) 的响
应头
1. Web容器接收到web服务器发来的HTTP请求,就会先创建两个对象,HttpServletRequest对象
以及HttpServletResponse对象,将请求信息设置给HttpServletRequest,
HttpServletResponse对象后面响应会用到。
2. 接着Web容器会读取Web.xml或者@WebServlet的设置,选择处理该请求的Servlet类,调用
service()方法,将1创建的两个对象作为它的参数,service()方法会根据请求的方式(GET、
POST)来选择调用doXXX()方法,这里使用的是Get方式。
3. 这里在doGet()方法内分别调用HttpServletRequest、HttpServletResponse对象的
getParameter()方法取得请求的参数、setContentType()设置内容类型以及getWriter()方法,
它会返回一个PrintWriter对象,向请求方输出显示字符串。
4. 因为Http是无状态的协议,所以用完之后就销毁了上面创建的两个对象(HttpServletRequest,
HttpServletResponse)。
二、HttpServletResponse对象
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发
送响应状态码的方法。
1、向客户端(浏览器)发送响应头
在 HttpServletResponse 接口中定义了如下方法:
若需要 设定已包含 的属性值:
得到响应头中内容:
方法 作用
java.lang.String getHeader(java.lang.String name)
获取 给定 响应头名称 的 响应
头值
java.util.Collection<java.lang.String> getHeaderNames() 获取此响应的标题的名称。
java.util.Collection<java.lang.String>
getHeaders(java.lang.String name)
获取给定 响应头名称 的 响应
头值。
方法 作用
void setStatus(int sc) 设置 返回的状态码
方法 作用
int getStatus() 获取此响应的当前状态码。
示例代码:
特别说明:在设置响应头时,有些可以在前端 html,js 界面中实行
如: <meta> 标签 ,可以在其中设定 某些特定的响应头
2、向客户端(浏览器)发送响应状态码
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态,状态码都是3位数字。
向浏览器发送响应状态码:
得到当前 响应状态码
向浏览器发送错误信息:
resp.addHeader("year", "2020");// 添加一个值为 2020 的 year 响应头
resp.setHeader("Content-Type", "text/html; charset=UTF-8");// 设置互联网媒体类
型(MIME类型)
//获取请求头的所有name值
Collection<String> list = resp.getHeaderNames();
//遍历名称并显示值
for (String str : list) {
System.out.println(str + " = " + resp.getHeader(str));
}
1
2
3
4
5
6
7
8
9
10
方法 作用
void sendError(int sc)
使用指定的状态码 向客户端发送 错误响应 并 清除缓冲
区。
void sendError(int sc,
java.lang.String msg)
使用指定的状态 向客户端发送 错误响应(带有信息) 并清
除缓冲区。
响应状态码:
分类
1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2xx:成功。代表:200
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
3xx:重定向。代表:302(重定向),304(访问缓存)
4xx:客户端错误。代表:404(请求路径没有对应的资源),05:请求方式没有对应的
doXxx方法
5xx:服务器端错误。代表:500(服务器内部出现异常)
详细说明:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/50536
60?fr=aladdin
3、向客户端(浏览器)发送数据
负责像浏览器发送数据的方法:
response可以使用OutputStream流向客户端浏览器输出或者PrintWriter输出,但是同一个
response只能被一种方式后获取,如果同时被2中方式获取会报错。
response.getOutputStream()向浏览器输出的是二进制数据,是字节流,可以处理任意类型的数据,而
response.getWriter()输出的是字符型数据,是字符流。
3.1、使用OutputStream流
示例代码:
3.2、使用PrintWriter流
示例代码:
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
1
2
String str = "使用OutputStream输出:我们终将战胜疫情,福建加油!泉州加油!";
// 获取OutputStream输出流
OutputStream out = resp.getOutputStream();
/**
* getBytes的作用是将字符转化为字节数组,如果不带参数,默认根据系统环境来进行转化
* 这里指定以utf-8的编码进行转换
*/
byte[] b = str.getBytes("utf-8");
// 想客户端(浏览器)输出数据
out.write(b);
1
2
3
4
5
6
7
8
9
10
11
剩余29页未读,继续阅读
资源评论
都来学
- 粉丝: 8
- 资源: 165
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功