3.7、请求和响应
在servlet API中有两个接口ServletRequest、ServletResponse,分别用来处理请求和响应。其子接口javax.servlet.http.HttpServletRequest用来处理HTTP请求、javax.servlet.http.HttpServletResponse用来处理HTTP响应。
- Servlet 容器接收到来自客户端的 HTTP 请求后,容器会针对该请求分别创建一个 HttpServletRequest 对象和 HttpServletReponse 对象。
- 容器将 HttpServletRequest 对象和 HttpServletReponse 对象以参数的形式传入 service() 方法内,并调用该方法。
- 在 service() 方法中 Servlet 通过 HttpServletRequest 对象获取客户端信息以及请求的相关信息。
- 对 HTTP 请求进行处理。
- 请求处理完成后,将响应信息封装到 HttpServletReponse 对象中。
- Servlet 容器将响应信息返回给客户端。
- 当 Servlet 容器将响应信息返回给客户端后,HttpServletRequest 对象和 HttpServletReponse 对象被销毁。
3.7.1、请求request
来源于javax.servlet.http.HttpServletRequest。代表客户端的请求,主要用来处理 HTTP 请求。
通过Http协议访问服务器时,HTTP请求中的所有信息被封装到HttpServletRequest中,通过其中的提供的一些方法,获取所请求的数据。
-
获取请求行信息:
1、得到客户端请求方式(post、get..):getMethod() 2、返回客户端发出请求时的完整URL(主机端口之后、参数之前的路径):getRequestURI() 3、获取请求行中的参数部分(?之后的参数):String getQueryString() 4、返回请求行中所使用的协议名和版本(如:HTTP/1.0):getProtocol() 5、获取请求中有关程序的路径部分:String getContextPath() 6、返回servlet的映射路径或名称:getServletPath() 7、返回客户端的IP地址:getRemoteAddr() 8、返回客户端的完整主机名:getRemoteHost() 9、返回客户端所使用的网络端口号:getRemotePort() 10、获取Web服务器上接收当前请求网络连接的IP地址:getLocalAddr() 11、返回客户端所使用的网络端口号:getRemotePor() 12、返回WEB服务器的主机名:getLocalName() 13、获取服务器的名字:getServerName() 14、返回服务器端口号:int getServerPort() 15、获取请求的协议名,例如http、https或ftp:Sring getScheme() 16、获得完整的请求路径(不包括参数部分):StringBuffer getRequestURL()
-
获取请求头信息
1、返回指定的信息头(没有返回null、多个返回第一个):getHeader(String name) 2、返回所有的请求头名称集合:Enumeration getHeaderNames() 3、返回自定名字的头信息集合:Enumeration getHeaders(String name) 4、返回指定名称的request信息头的值:int getIntHeader(String name) 5、获取Content-Type头字段的值:String getContentType() 6、返回request主体所包含的字节数,若未知的返回-1:int getContentLength() 7、返回request的字符编码集名称:String getCharacterEncoding() 8、返回客户端所有的Cookie的数组:Cookie[] getCookies()
-
获得请求中的参数,并将数据保存在request中
获取请求中的参数 1、根据name获得value值,name重复获得第一个name对应的value中:String getParameter(String name) 2、可以获得name重复的所有value值:String[] getParameterValues(String name) 3、获得所有的name值:Enumeration getParameterNames(); 4、将请求中的name值和value值装入Map对象中并返回map:Map getParameterMap()
将参数保存到request中 1、在request中保存数据:void setAttribute(String key,Object value) 2、根据key获取request中保存的数据:request.getAttribute(key) 3、获取所有的key:Enumeration getAttributeNames()
-
获取其他的对象
1、返回请求的输入流:ServletInputStream getInputStream() 2、返回request对应的session对象,如果没有,则创建一个:HttpSession getSession()
3.7.2、响应response
来源于javax.servlet.http.HttpServletResponse。response对象用于把取得的数据返回到客户端,即响应。
由于 HTTP 响应消息由响应行、响应头、消息体三部分组成,所以 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应头、响应体的方法
-
设置状态码
1、设置响应的状态码 :void setStatus(int sc) 2、使用状态码和状态返回一个错误,并清空缓冲区:void sendError(int) 3、使用状态码返回一个错误,并清空缓冲区:void sendError(int)
-
设置响应头
1、设定ContentType响应头:setContentType(String) 2、设定ContentLenght响应头:setContentLenght(String) 3、添加指定名称的响应头和日期值:void addDateHeader(String, long) 4、添加指定名称的响应头和值:void addHeader(String, String) 5、添加指定名称的响应头和int值:void addIntHeader(String, int) 6、查看指定的响应头是否存在:boolean containsHeader(String) 7、使用指定名称和值设置响应头的名称和内容:void setHeader(String, String) 8、使用指定名称和值设置响应头的名称和内容:void setDateHeader(String, long) 9、设置编码:setContentType("text/html;charset=utf=8");
-
获取流,可以向客户端发送数据
OutputStream流向客户端发送如图片、文件等内容: ServletOutputStream out = response.getOutputStream(); PrintWriter流向客户端写入字符文本:PrintWriter out = response.getWriter();
-
重定向
重定向:response.sendRedirect("/项目名/重定向的路径");
3.8、转发、重定向
3.8.1 转发
一次请求一次响应
//转发
request.getRequestDispatcher("/需要转发到的路径").forward(request,response);
3.8.2 重定向
两次请求两次响应
因为两者的request的对象不是同一个,所以重定向之间不能用request保存数据
//重定向
response.sendRedirect("/项目名/重定向的路径");
重定向和转发的区别:
1、重定向
浏览器地址栏发生改变
重定向是浏览器的行为,通过响应对象HttpServletResponse来执行
两次请求,两次响应
不能访问WEB-INF目录下的资源
不共享Request中数据
可以访问工程外的资源2、转发
浏览器地址栏不发生改变,不会变为目标地址,是从一个资源跳转到另一个资源。
请求转发是服务器的行为,整个转发的过程在服务器中完成
一次请求,一次响应
共享Request中的数据
可以转发到WEB-INF目录下
不可以访问工程以外的资源