Request和Response

来源:互联网 发布:好用的网络机顶盒 编辑:程序博客网 时间:2024/06/05 19:38
   学习的过程中,慢慢的发现基础很重要,因为很多被认为很高深的东西往往也只是对基础东西的封装而已,下面来稍微回顾一下RequestResponse的知识
服务器如何处理客户端请求
当客户端向服务器发送请求时,服务器是如何将请求信息传递给ServletServlet又是通过什么将响应送给客户端。带着这些问题,我们来看下面这张图

 请求响应流程图
由图可知,服务器向Servlet传递了两个对象,分别是request对象和response对象。现在我们来分析一下请求响应的流程。具体如下:
(1)当客户端向服务器发送请求时,服务器会先创建两个对象:request对象和response对象。其中request对象中封装的是请求信息,response是用来向客户端响应信息。
(2)创建后,服务器会将两个对象作为参数传递到客户端请求的Servletservice()方法中,Servlet就可以从request对象中获取请求信息;处理之后,使用response向客户端响应信息。
注意
我们知道Servlet是单例的,当多个用户同时请求一个Servlet时,服务器会为每个请求开启一个线程去访问Servlet,当请求完毕之后,requestresponse死亡;再次访问时,服务器再创建新的requestresponse对象,因此这两个对象的生命周期很短暂。
 
request对象的方法
request对象
在服务器如何处理客户端请求中的图中,我们可以了解request对象是当客户端向服务器端发送请求后,服务器为本次请求创建出request对象,并在调用Servletservice()方法时,将该对象传递给service()方法。request对象中封装了客户端发送过来的所有请求数据。下面通过一张图来了解客户端请求服务器的请求响应过程,如图:

请求响应过程
request对象常用API
request对象的类型是HttpServletRequest,该类中定义了很多与http协议相关的方法。比如获取请求头信息、请求方式、客户端ip地址等信息。下面介绍request对象常用的API,如下:
(1)常用信息
  • String getRemoteAddr():获取客户端ip地址;
  • String getMethod():获取客户端请求方式,例如:postget
(2)获取请求头信息
  • String getHeader(String name):获取单值的请求头的值;
  • int getIntHeader(String name):获取单值int类型的请求头的值;
  • getDateHeader(String name):获取单值long类型的请求头的值;
  • Enumeration<String> getHeaders(String name):获取多值请求头的值,返回值是Enumeration类型。
下面通过一个案例,来学习如何使用request对象的方法获得客户端ip地址、请求方式以及浏览器类型。具体如下:
(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-AgentMozilla/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
(4)TestServletdoGet()方法略加修改,具体如例1-2所示:
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对象的类型是HttpServletResponseServlet的生命周期方法之一service()方法,它的两个参数的类型分别是ServletRequestServletResponse。其中HttpServletResponseServletResponse是子与父的关系,在HttpServlet类中,生命周期方法service()将它的参数都强转成HttpServletRequest类型和HttpServletResponse类型。
ServletRequestServletResponse是与协议无关的两个接口,而HttpServletRequestHttpServletResponse是与http协议有关的两个接口。
下面我们来了解HttpServletResponse,首先查看该接口的API,如图所示:

 HttpServletResponse接口方法中,有三个方法被红色标注,它们是发送状态码的相关方法,与Http协议相关,因此该方法是在HttpServletResponse类中定义。
接下来对着三个方法进行分析,如下所示:
(1)void sendError(int sc)
                  该方法是向客户端发生错误的状态码,例如404500等。     
(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)StatusServletweb.xml文件中配置的访问路径是“/StatusServlet”;
(3)Example10发布到Tomcat服务器中,然后启动服务器,在浏览器地址栏上输入:http://localhost:8080/YouProject/StatusServlet,浏览器显示结果如图所示:

图浏览器显示结果
由图所示,在StatusServlet类中,使用response发送404状态码发送成功,这里要注意的是,当使用responsesetStatus(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个字节;

(4)setDateHeader(String name,int value )
     response.setDateHeader(“expires”,当前时间+1000*60*60*24),设置过期时间为一天;
重定向
什么是重定向
所谓的重定向是将请求重新定个方向转到其他位置。例如,客户端访问AServlet,然后立刻自动访问BServlet。这个过程其实就是重定向。下面通过一张图来了解重定向,如图1-1所示:

重定向
由图可知,重定向共有两次请求,两次响应。当客户端接收到AServlet的响应之后立刻去请求BServlet,这个过程很迅速。可以发现,地址栏发生变化,由AServlet变成BServlet
 
0 0
原创粉丝点击