Request和Response
来源:互联网 发布:好用的网络机顶盒 编辑:程序博客网 时间:2024/06/05 19:38
学习的过程中,慢慢的发现基础很重要,因为很多被认为很高深的东西往往也只是对基础东西的封装而已,下面来稍微回顾一下Request和Response的知识
服务器如何处理客户端请求
当客户端向服务器发送请求时,服务器是如何将请求信息传递给Servlet,Servlet又是通过什么将响应送给客户端。带着这些问题,我们来看下面这张图
请求响应流程图
由图可知,服务器向Servlet传递了两个对象,分别是request对象和response对象。现在我们来分析一下请求响应的流程。具体如下:
(1)当客户端向服务器发送请求时,服务器会先创建两个对象:request对象和response对象。其中request对象中封装的是请求信息,response是用来向客户端响应信息。
(2)创建后,服务器会将两个对象作为参数传递到客户端请求的Servlet的service()方法中,Servlet就可以从request对象中获取请求信息;处理之后,使用response向客户端响应信息。
注意
我们知道Servlet是单例的,当多个用户同时请求一个Servlet时,服务器会为每个请求开启一个线程去访问Servlet,当请求完毕之后,request和response死亡;再次访问时,服务器再创建新的request和response对象,因此这两个对象的生命周期很短暂。
request对象的方法
request对象
在服务器如何处理客户端请求中的图中,我们可以了解request对象是当客户端向服务器端发送请求后,服务器为本次请求创建出request对象,并在调用Servlet的service()方法时,将该对象传递给service()方法。request对象中封装了客户端发送过来的所有请求数据。下面通过一张图来了解客户端请求服务器的请求响应过程,如图:
图请求响应过程
request对象常用API
request对象的类型是HttpServletRequest,该类中定义了很多与http协议相关的方法。比如获取请求头信息、请求方式、客户端ip地址等信息。下面介绍request对象常用的API,如下:
(1)常用信息
(1)创建web应用,Example06,在该应用下新建一个Servlet类,TestServlet,主要代码如例1-1所示:
例1-1 TestServlet.java
public class TestServlet extends HttpServlet {
当客户端向服务器发送请求时,服务器是如何将请求信息传递给Servlet,Servlet又是通过什么将响应送给客户端。带着这些问题,我们来看下面这张图
请求响应流程图
由图可知,服务器向Servlet传递了两个对象,分别是request对象和response对象。现在我们来分析一下请求响应的流程。具体如下:
(1)当客户端向服务器发送请求时,服务器会先创建两个对象:request对象和response对象。其中request对象中封装的是请求信息,response是用来向客户端响应信息。
(2)创建后,服务器会将两个对象作为参数传递到客户端请求的Servlet的service()方法中,Servlet就可以从request对象中获取请求信息;处理之后,使用response向客户端响应信息。
注意
我们知道Servlet是单例的,当多个用户同时请求一个Servlet时,服务器会为每个请求开启一个线程去访问Servlet,当请求完毕之后,request和response死亡;再次访问时,服务器再创建新的request和response对象,因此这两个对象的生命周期很短暂。
request对象的方法
request对象
在服务器如何处理客户端请求中的图中,我们可以了解request对象是当客户端向服务器端发送请求后,服务器为本次请求创建出request对象,并在调用Servlet的service()方法时,将该对象传递给service()方法。request对象中封装了客户端发送过来的所有请求数据。下面通过一张图来了解客户端请求服务器的请求响应过程,如图:
图请求响应过程
request对象常用API
request对象的类型是HttpServletRequest,该类中定义了很多与http协议相关的方法。比如获取请求头信息、请求方式、客户端ip地址等信息。下面介绍request对象常用的API,如下:
(1)常用信息
- String getRemoteAddr():获取客户端ip地址;
- String getMethod():获取客户端请求方式,例如:post或get
- String getHeader(String name):获取单值的请求头的值;
- int getIntHeader(String name):获取单值int类型的请求头的值;
- getDateHeader(String name):获取单值long类型的请求头的值;
- Enumeration<String> getHeaders(String name):获取多值请求头的值,返回值是Enumeration类型。
(1)创建web应用,Example06,在该应用下新建一个Servlet类,TestServlet,主要代码如例1-1所示:
例1-1 TestServlet.java
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//获取客户端的ip地址
String ip=request.getRemoteAddr();//获取客户端的请求方式String method=request.getMethod();//获取User-Agent请求头的值,该请求头是表明客户端浏览器的类型String userAgent=request.getHeader("User-Agent");System.out.println("ip:"+ip);System.out.println("method:"+method);System.out.println("User-Agent:"+userAgent);
}
}
(2)TestSerlvet类在web.xml文件其访问路径配置为:“/TestServlet“。
(3)将Example04发布到Tomcat服务器,然后启动服务器,在浏览器地址栏上输入:http://localhost:8080/Example06/TestServlet,控制台打印结果如图所示:
图中,控制台打印的浏览器信息为:User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)。该信息中包含以下几点:
例1-2 TestServlet.java
public class TestServlet extends HttpServlet {
(2)TestSerlvet类在web.xml文件其访问路径配置为:“/TestServlet“。
(3)将Example04发布到Tomcat服务器,然后启动服务器,在浏览器地址栏上输入:http://localhost:8080/Example06/TestServlet,控制台打印结果如图所示:
图中,控制台打印的浏览器信息为:User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)。该信息中包含以下几点:
- Windows NT 6.1:操作系统信息
- MSIE 8.0:浏览器为IE,版本8.0
例1-2 TestServlet.java
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取客户端的ip地址
String ip=request.getRemoteAddr();//获取客户端的请求方式String method=request.getMethod();//获取User-Agent请求头的值,该请求头是表明客户端浏览器的类型String userAgent=request.getHeader("User-Agent");System.out.println("ip:"+ip);System.out.println("method:"+method);System.out.println("User-Agent:"+userAgent);if(userAgent.toLowerCase().contains("chrome")) {
System.out.println("hello:" + ip + ", you use google");
} else if(userAgent.toLowerCase().contains("firefox")) {
System.out.println("hello:" + ip + ", you use firefox");
} else if(userAgent.toLowerCase().contains("msie")) {
System.out.println("hello:" + ip + ", you use IE");
}
}
}
(5)重启服务器,在浏览器中再次访问TestServlet,控制台打印结果如图所示:
图控制台打印结果
(6)使用浏览器,控制台打印结果如图所示:
response如何发送状态码
在服务器如何处理客户端请求中,我们了解,request对象中封装了请求信息,使用response对象可以向客户端响应消息。在Http协议详解之响应中,我们知道响应首行信息中包含了响应状态码,现在,我们要谈的就是如何使用response向客户端发送状态码。
response对象的类型是HttpServletResponse。Servlet的生命周期方法之一service()方法,它的两个参数的类型分别是ServletRequest和ServletResponse。其中HttpServletResponse和ServletResponse是子与父的关系,在HttpServlet类中,生命周期方法service()将它的参数都强转成HttpServletRequest类型和HttpServletResponse类型。
ServletRequest和ServletResponse是与协议无关的两个接口,而HttpServletRequest和HttpServletResponse是与http协议有关的两个接口。
下面我们来了解HttpServletResponse,首先查看该接口的API,如图所示:
HttpServletResponse接口方法中,有三个方法被红色标注,它们是发送状态码的相关方法,与Http协议相关,因此该方法是在HttpServletResponse类中定义。
接下来对着三个方法进行分析,如下所示:
(1)void sendError(int sc)
该方法是向客户端发生错误的状态码,例如404、500等。
(2)void sendError(int sc,java.lang.String msg)
该方法是向客户端发送错误的状态码,并且添加错误信息,例如,404,您访问的资源不存在。
(3)void setStatus(int sc)
该方法是向客户端发送成功的状态码,还可以用来发送302状态码。
下面我们来看一个案例,使用response向客户端发送404状态码,具体如下:
(1)创建web应用,Example01,在该应用中新建一个Servlet类,StatusServlet,主要代码如例1-1所示:
例1-1 StatusServlet.java
public class StatusServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendError(404,"您访问的资源不存在");
}
}
(2)StatusServlet在web.xml文件中配置的访问路径是“/StatusServlet”;
(3)将Example10发布到Tomcat服务器中,然后启动服务器,在浏览器地址栏上输入:http://localhost:8080/YouProject/StatusServlet,浏览器显示结果如图所示:
图浏览器显示结果
由图所示,在StatusServlet类中,使用response发送404状态码发送成功,这里要注意的是,当使用response的setStatus(int sc)方法发送404状态码时,不起任何作用。
response发送响应头相关方法介绍
响应信息都是由response发送给客户端的,今天的主要讨论的内容就是学习使用response发送响应头的相关方法。
响应头是以键值对的形式存在,例如:Content-Type:text/html;charset=utf-8等。一般情况下,响应头都是一个名称对应一个值,但是也会存在特殊情况:一个名称对应多个值。这种情况很少见。对响应头进行设置是通过response的以下方法实现的,如下表所示:
表response设置响应头相关方法
(1)setHeader(String name ,String value):
response.setHeader(“Content-Type”,”text/html;charset=utf-8”),设置Content-Type响应头;
(2)addHeader(String name,String value):
response.addHeader(“xxx”,”XXX”);
response.addHeader(“xxx”,”SSS”);这里的xxx是表示某一响应头;
(3)setIntHeader(String name ,int value ):
response.setIntHeader(“Context-Length”,888);通知客户端响应内容长度为888个字节;
response.setDateHeader(“expires”,当前时间+1000*60*60*24),设置过期时间为一天;
重定向
什么是重定向
所谓的重定向是将请求重新定个方向转到其他位置。例如,客户端访问AServlet,然后立刻自动访问BServlet。这个过程其实就是重定向。下面通过一张图来了解重定向,如图1-1所示:
图重定向
由图可知,重定向共有两次请求,两次响应。当客户端接收到AServlet的响应之后立刻去请求BServlet,这个过程很迅速。可以发现,地址栏发生变化,由AServlet变成BServlet。
(5)重启服务器,在浏览器中再次访问TestServlet,控制台打印结果如图所示:
图控制台打印结果
(6)使用浏览器,控制台打印结果如图所示:
response如何发送状态码
在服务器如何处理客户端请求中,我们了解,request对象中封装了请求信息,使用response对象可以向客户端响应消息。在Http协议详解之响应中,我们知道响应首行信息中包含了响应状态码,现在,我们要谈的就是如何使用response向客户端发送状态码。
response对象的类型是HttpServletResponse。Servlet的生命周期方法之一service()方法,它的两个参数的类型分别是ServletRequest和ServletResponse。其中HttpServletResponse和ServletResponse是子与父的关系,在HttpServlet类中,生命周期方法service()将它的参数都强转成HttpServletRequest类型和HttpServletResponse类型。
ServletRequest和ServletResponse是与协议无关的两个接口,而HttpServletRequest和HttpServletResponse是与http协议有关的两个接口。
下面我们来了解HttpServletResponse,首先查看该接口的API,如图所示:
HttpServletResponse接口方法中,有三个方法被红色标注,它们是发送状态码的相关方法,与Http协议相关,因此该方法是在HttpServletResponse类中定义。
接下来对着三个方法进行分析,如下所示:
(1)void sendError(int sc)
该方法是向客户端发生错误的状态码,例如404、500等。
(2)void sendError(int sc,java.lang.String msg)
该方法是向客户端发送错误的状态码,并且添加错误信息,例如,404,您访问的资源不存在。
(3)void setStatus(int sc)
该方法是向客户端发送成功的状态码,还可以用来发送302状态码。
下面我们来看一个案例,使用response向客户端发送404状态码,具体如下:
(1)创建web应用,Example01,在该应用中新建一个Servlet类,StatusServlet,主要代码如例1-1所示:
例1-1 StatusServlet.java
public class StatusServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendError(404,"您访问的资源不存在");
}
}
(2)StatusServlet在web.xml文件中配置的访问路径是“/StatusServlet”;
(3)将Example10发布到Tomcat服务器中,然后启动服务器,在浏览器地址栏上输入:http://localhost:8080/YouProject/StatusServlet,浏览器显示结果如图所示:
图浏览器显示结果
由图所示,在StatusServlet类中,使用response发送404状态码发送成功,这里要注意的是,当使用response的setStatus(int sc)方法发送404状态码时,不起任何作用。
response发送响应头相关方法介绍
响应信息都是由response发送给客户端的,今天的主要讨论的内容就是学习使用response发送响应头的相关方法。
响应头是以键值对的形式存在,例如:Content-Type:text/html;charset=utf-8等。一般情况下,响应头都是一个名称对应一个值,但是也会存在特殊情况:一个名称对应多个值。这种情况很少见。对响应头进行设置是通过response的以下方法实现的,如下表所示:
表response设置响应头相关方法
方法名
方法描述
setHeader(String name,String value )
该方法是设置只有一个值的响应头,参数name表示响应头名称,参数value表示响应头的值.
addHeader(String name,String value)
该方法是设置有多个值的响应头,参数含义同上
setIntHeader(String name,int value)
该方法是设置只有一个值且值的类型为int类型的响应头,例如Content-Length响应头,该响应头是代表响应内容有多少字节数
addIntHeader(String name,int value)
该方法是设置有多个值且值的类型为int类型的响应头
setDateHeader(String name,long value)
该方法是设置只有一个值且值的类型为long类型的响应头,例如expies响应头,表示过期时间
addDateHeader(String name,long value)
该方法是设置有多个值且值的类型为long类型的响应头
由表1-1所示,可以设置响应头有以上6中方法,其中最常用的方法就是setHeader(String name ,String value)。下面我们通过以下几个小例子来了解如何使用这些方法:(1)setHeader(String name ,String value):
response.setHeader(“Content-Type”,”text/html;charset=utf-8”),设置Content-Type响应头;
(2)addHeader(String name,String value):
response.addHeader(“xxx”,”XXX”);
response.addHeader(“xxx”,”SSS”);这里的xxx是表示某一响应头;
(3)setIntHeader(String name ,int value ):
response.setIntHeader(“Context-Length”,888);通知客户端响应内容长度为888个字节;
response.setDateHeader(“expires”,当前时间+1000*60*60*24),设置过期时间为一天;
重定向
什么是重定向
所谓的重定向是将请求重新定个方向转到其他位置。例如,客户端访问AServlet,然后立刻自动访问BServlet。这个过程其实就是重定向。下面通过一张图来了解重定向,如图1-1所示:
图重定向
由图可知,重定向共有两次请求,两次响应。当客户端接收到AServlet的响应之后立刻去请求BServlet,这个过程很迅速。可以发现,地址栏发生变化,由AServlet变成BServlet。
0 0
- Request和Response对象
- Response和Request
- Request和Response对象
- request和response对象
- Request和Response
- response和request类
- C# Response 和 Request
- response和request
- Request和Response
- Request和Response详解
- Request和Response对象
- request和response学习
- request 和 response
- request和response
- Request和Response
- Request和Response
- Request和Response
- Request和Response
- 开启守护进程daemon
- 推荐系统的常用算法概述
- 推荐系统开源软件列表汇总和点评
- 府谷红枣
- 数组-12. 简易连连看(20)
- Request和Response
- 随机森林特征筛选
- jQuery基础学习笔记(下)
- JS漂浮广告代码
- 抓取网络json数据并存入mongodb(1)
- Physics Experiment poj 3684 弹性碰撞
- JS事件Event元素(兼容IE,Firefox,Chorme)
- 2015微商元年,淘金子平台携手微商新模式
- Android自定义字体类库Calligraphy--快速实现自定义应用字体