javaWeb--response和request

服务器处理请求的流程:
服务器每次接收到一个新的请求时,都会为这个请求开辟一个新的线程
服务器把客户端的请求数据封装到request对象中,request就是请求数据的载体
服务器还会创建response对象,这个对象与客户端连接在一起,他可以用来向客户端发出响应。

一、1 response概述
response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。

response对象的功能分为以下四种:
设置响应头信息;
发送状态码;
设置响应正文;
重定向;

二、重定向:
1、 重定向是两次请求;
2、 重定向的URL可以是其他应用,不局限于当前应用;
3、 重定向的响应头为302,并且必须要有Location响应头;
4、 重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;

response.setStatus(302); 
response.setHeader("Location", "http://www.itcast.cn"); 
//客户端浏览器解析到响应码为302后,就知道服务器让它重定向,所以它会马上获取响应头Location,然发出第二个请求。
response.sendRedirect()方法会设置响应头为302,以设置Location响应头。
//如果要重定向的URL是在同一个服务器内,那么可以使用相对路径
//response.sendRedirect("/hello/BServlet");

三、request概述
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据
1、request与请求头相关的方法有:
String getHeader(String name):获取指定名称的请求头;
2、获取请求URL

http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy
    > String getScheme():获取协议,http
    > String getServerName():获取服务器名,localhost
    > String getServerPort():获取服务器端口,8080
    > *****String getContextPath():获取上下文路径,即获取项目名,/day10_2
    > String getServletPath():获取Servlet路径,/AServlet
    > String getQueryString():获取参数部分,即问号后面的部分。username=xxx&password=yyy
    > String getRequestURI():获取请求URI,等于项目名+Servlet路径。/day10_2/AServlet
    > String getRequestURL():获取请求URL,等于不包含参数的整个请求路径。http://localhost:8080/day10_2/AServlet

3、获取请求参数(请求参数是由客户端发送给服务器的!有可能是在请求体中(POST),也可能是在URL之后(GET))
请求参数:有一个参数一个值的,还有一个参数多个值!
GET请求和POST请求的区别:
GET请求:
请求参数会在浏览器的地址栏中显示,所以不安全;
请求参数长度限制长度在1K之内;
GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
POST请求:
请求参数不会显示浏览器的地址栏,相对安全;
请求参数长度没有限制;

方法

*String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数
String[] getParameterValues(String name):获取指定名称的请求参数值,适用于多值请求参数
Enumeration<String> getParameterNames():获取所有请求参数名称
*Map<String,String[]> getParameterMap():获取所有请求参数,其中key为参数名,value为参数值。

4、请求转发和请求包含
无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");  
//使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径
请求转发:rd.forward(request,response);
请求包含:rd.include(request,response);

一个请求跨多个Servlet,需要使用转发和包含。
    > 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
    > 请求包含:由两个Servlet共同未完成响应体!(都留)
    > 无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!

请求转发与请求包含比较
1、 如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;
2、 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);
3、 请求包含大多是应用在JSP页面中,完成多页面的合并;
4、 请求转发大多是应用在Servlet中,转发目标大多是JSP页面;

请求转发与重定向比较
1、 请求转发是一个请求一次响应,而重定向是两次请求两次响应
2、请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
3、请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目,请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名!
4、请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
5、重定向的第二个请求一定是GET;

5、request域
Servlet中三大域对象:request、session、application,都有如下三个方法:
     void setAttribute(String name, Object value)
     Object getAttribute(String name)
     void removeAttribute(String name);
同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。

猜你喜欢

转载自blog.csdn.net/ilikejj0/article/details/80110297