HttpServletRespone和HttpServletRequest
- 格式:doc
- 大小:273.78 KB
- 文档页数:20
response如何发送状态码在上一节服务器如何处理客户端请求中,我们了解,request对象中封装了请求信息,使用response对象可以向客户端响应消息。
在Http协议详解之响应中,我们知道响应首行信息中包含了响应状态码,而今天,我们要学习的就是如何使用response向客户端发送状态码。
response对象的类型是HttpServletResponse。
Servlet的生命周期方法之一service()方法,它的两个参数的类型分别是ServletRequest和ServletResponse。
其中HttpServletResponse和ServletResponse是子与父的关系,在HttpServlet类中,生命周期方法service()将它的参数都强转成HttpServletRequest类型和HttpServletResponse类型。
ServletRequest和ServletResponse是与协议无关的两个接口,而HttpServletRequest和HttpServletResponse是与http协议有关的两个接口。
下面我们来了解HttpServletResponse,首先查看该接口的API,如图1-1所示:图1-1HttpServletResponse接口方法图1-1中,有三个方法被红色标注,它们是发送状态码的相关方法,与Http协议相关,因此该方法是在HttpServletResponse类中定义。
接下来对着三个方法进行分析,如下所示:(1)void sendError(int sc)该方法是向客户端发生错误的状态码,例如404、500等。
(2)void sendError(int sc,ng.String msg)该方法是向客户端发送错误的状态码,并且添加错误信息,例如,404,您访问的资源不存在。
(3)void setStatus(int sc)该方法是向客户端发送成功的状态码,还可以用来发送302状态码。
servlet面试题及答案servlet面试题及答案(一)1.Servlet执行时一般实现哪几个方法?Public void init(ServletConfig config)public ServletConfig getServletConfig()public String getServletInfo()public void service(ServletRequest request,ServletResponse response) public void destroy()2. url重写有几种方式?由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另一种是作为查询字符串附加在URL后面,表现形式为...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99 zWpBng!-145788764这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
3.在jsp中引用使用jsp:useBean id=" " ...scope=" "/来引用javabean.Ⅰscope的值有哪些,这些值的区别是什么?不同的jsp页面中引用javabean 时,id能否相同,如果能相同,对scope的值有什么要求?scope可以为:application|page|session|requeat这个东西就是指定ID 的有效范围。
java 根据上下文获取请求头的方法Java中通过HttpServletRequest对象可以获取请求头信息。
具体来说,可以使用HttpServletRequest的getHeader()方法来获取指定请求头的值。
下面将详细介绍如何在Java中通过HttpServletRequest对象获取请求头信息。
步骤一:获取HttpServletRequest对象在Java中,处理HTTP请求需要使用Servlet。
在Servlet中,可以通过doGet()或doPost()等方法来处理请求。
在这些方法中,可以通过HttpServletRequest 对象来获取请求头信息。
通常,HttpServletRequest对象作为这些方法的参数之一。
例如,在doGet()方法中,可以通过以下代码获取HttpServletRequest对象:javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpServletRequest req = (HttpServletRequest) request;获取其他请求头信息}步骤二:获取指定请求头的值在获取到HttpServletRequest对象后,可以使用getHeader()方法来获取指定请求头的值。
getHeader()方法接收一个字符串参数,表示要获取的请求头名称。
该方法返回一个字符串,表示对应请求头的值。
例如,要获取名为"User-Agent"的请求头的值,可以使用以下代码:javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpServletRequest req = (HttpServletRequest) request;String userAgent = req.getHeader("User-Agent");处理获取到的请求头的值}在以上示例中,使用req.getHeader("User-Agent")可以获取到使用该请求的浏览器或客户端的相关信息。
第4章请求和响应题与答案第4章请求和响应一、选择题1.下面选项中关于请求包含include()方法的参数,正确的是()A:依次为ServletRequest和ServletResponse两个B:依次为ServletResponse和ServletRequest两个C:只有ServletRequestD:只有ServletResponse2.通过配置Tomcat来解决GET请求参数的乱码问题,可以在server.xml文件中的Connector节点下添加的属性是()A:useBodyEncodingForURI=”false”B:useBodyEncoding=”true”C:useBodyEncodingForURI=”true”D:useBodyEncoding=”false”3.如果请求消息中包含有多个该指定名称的参数,getParameter()方法的返回值是()A:这些参数的所有值形成一个数组B:“”C:第一个参数的值D:最后一个参数的值4.下列关于HttpServletRequest接口中getDateHeader(String name)方法返回值的说法中,正确的是()A:自1970年1月1日0点0分0秒算起的以秒为单位的时间值B:自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值C:自1970年1月1日0点0分0秒算起的以纳秒为单位的时间值D:自1970年1月1日0点0分0秒算起的以分钟为单位的时间值5.一次重定向过程中,浏览器会发出多少次服务器请求()A:1次B:2次C:0次D:3次二、填空题1.请求包含指的是使用【】方法将Servlet请求转发给其它Web资源进行处理,响应消息中既包含了当前Servlet又包含了其它Web资源的响应消息。
2.在HttpServletResponse接口中,定义了一个【】方法,用于实现请求重定向。
3.我们可以通过response.setHeader("【】",“3”)语句,使当前页面定时每3秒刷新一次。
说明 servlet 的三种访问方式Servlet是Java语言编写的服务器端组件,用于处理客户端的请求并生成响应。
Servlet的访问方式有三种:通过URL直接访问、通过表单提交数据访问和通过AJAX异步请求访问。
一、通过URL直接访问通过URL直接访问Servlet是最常见的方式之一。
在浏览器地址栏中输入Servlet的URL,就可以直接访问该Servlet。
URL的格式通常为:http://服务器地址:端口号/项目名/Servlet路径。
例如,假设服务器地址是localhost,端口号是8080,项目名是myapp,Servlet的路径是myservlet,则访问该Servlet的URL为:http://localhost:8080/myapp/myservlet。
通过URL直接访问Servlet时,可以通过URL参数传递数据给Servlet。
例如,可以在URL中添加参数name=张三,让Servlet根据该参数生成相应的响应。
URL参数的格式为:?参数名1=参数值1&参数名2=参数值2&...。
例如,访问Servlet的URL为:http://localhost:8080/myapp/myservlet?name=张三。
二、通过表单提交数据访问通过表单提交数据访问Servlet是常用的方式之一。
在HTML页面中,可以使用<form>标签创建一个表单,设置表单的action属性为Servlet的URL,设置表单的method属性为POST或GET,然后在表单中添加各种输入元素,用户填写完表单后点击提交按钮,表单数据会被发送到Servlet进行处理。
在Servlet中,可以通过HttpServletRequest对象的getParameter方法获取表单提交的数据。
例如,假设表单中有一个输入框的name属性为name,用户填写了姓名为张三,那么在Servlet中可以通过getParameter("name")方法获取到该值。
JSP 的基础语法JSP 内置对象response 对象:response 对象的主要功能是服务器端用于向客户端发送信息,例如HTTP 的头信息和Cookie 信息等。
request 对象:服务器端用于接收客户端请求内容的所属的接口:javax.servlet.http.HttpServletRequestHttpServletRequest 是 ServletRequest 接口的子接口而且 ServletRequest 也只有唯一的一个子接口 —— HttpServletRequest主要是因为,现在的J2EE 的WEB 程序 主要以HTTP 协议为主要通讯协议response 对象:服务器端回应客户端的请求所属的接口:javax.servlet.http.HttpServletResponseHttpServletReponse 的父接口是ServletResponse而且 ServletResponse 也现在只有唯一的一个HttpServletReponse 子接口主要原因:现在的J2EE 的WEB 程序 主要以HTTP 协议为主要通讯协议response 的主要功能:1、设置头信息: ------- responseDemo01.jsp最有用的一个头信息:refresh :刷新response.setHeader("头信息内容","头信息参数") ;<%!// 此处为全局变量,初始化一次int i = 0 ;%><%// 一秒种刷新一次,每次使i 自增response.setHeader("refresh","1") ;%><h1><%=i++%></h1>新的需求:两秒种跳转到responseDemo02.jsp 页面上 ------ responseDemo02.jspresponse.setHeader("refresh","2;URL=页面名称") ;此代码在开发中较为常见setHeader 可以实现跳转功能。
InheritableRequestAttributesHolder是Spring框架中用于在异步线程中传递HttpServletRequest和HttpServletResponse等请求相关属性的工具类。
在Web应用程序中,通常使用HttpServletRequest和HttpServletResponse等对象来处理HTTP请求和响应。
在一些场景下,我们可能需要在异步线程中使用这些请求相关属性,例如在使用线程池执行异步任务时。
但是,由于异步线程与原始请求线程不同,无法直接访问HttpServletRequest和HttpServletResponse等对象。
这时,就需要使用InheritableThreadLocal或InheritableRequestAttributesHolder等工具类来在异步线程中传递请求相关属性。
InheritableRequestAttributesHolder的作用原理是使用ThreadLocal来存储HttpServletRequest和HttpServletResponse等请求相关属性,并通过InheritableThreadLocal实现在异步线程中传递这些属性。
具体来说,在主线程中将HttpServletRequest和HttpServletResponse等属性设置到当前线程的InheritableRequestAttributesHolder中,然后在异步线程中获取这些属性并设置到对应的HttpServletRequest和HttpServletResponse等对象中,从而实现异步线程中对请求相关属性的访问。
总之,InheritableRequestAttributesHolder是Spring框架中用于在异步线程中传递HttpServletRequest和HttpServletResponse等请求相关属性的工具类,其原理是使用ThreadLocal来存储和传递这些属性。
Web项目答辩问题1.css和div 开发的优势?A、显示和内容实现分离B、有利于搜索引擎搜索C、有利于维护和程序的扩展2.谈谈页面间的参数传递有哪些方式?A、通过作用域对象session、request 的setAttribute()和getAttribute()方法进行参数传递。
B、<jsp:forward><jsp:param name= value=></jsp:forward>C、request.gerRequestDispatcher(“1.jsp?name=XX”).forward(requ est,response);D、<jsp:useBean id= class= scope=request/session>3.hidden表单域有什么作用?A、多个表单的区分B、多个提交按钮4.jsp有哪些内置对象?pageContex,request,session,application,request,out,exception ,config,page,5.request的作用有哪些?获取客户端传递的参数值获取客户端请求头信息获取会话获取转发对象可作为容器使用, 利用setAttribute()和getAttribute()方法进行参数传递6.session有什么作用。
因为http协议是无状态的协议,但我们需要保存客户端在多次请求之间状态信息的时候,我们需要session来维护客户端的状态Session对象类似于一个容器,可以存放任何对象,以供不同页面间共享数据7.application有什么作用。
保存的一些全局性的对象信息。
8.在jsp中怎样操作page作用域特定于JSP 的一个类型,代表当前的JSP 页面。
pageContext.setAttribute(“java”,”lovo”);9.jsp有哪些动作?作用分别是什么?<jsp:include /> 包含<jsp:forward /> 转发到另一页面相当于request.gerRequestDispatcher(“1.jsp?name=XX”).forward(request,response);<jsp:usebean /> 设置javaBean<jsp:setProperty /> 设置属性<jsp:getProperty /> 获得属性<jsp:plugin /> 设置插件10.java servlet api中forward() 与redirect()的区别?1.forward客户端请求服务器一次,redirect请求服务器两次,所以forward方式可以获得request作用域的信息,而redirect方式不能获得。
servlet工作原理
servlet是Java Web开发的重要组件之一,用于处理Web应用程序
的HTTP请求和响应。
servlet的工作原理如下:
1.客户端发起HTTP请求,包含请求头和请求体。
2. Web服务器(如Tomcat)接收请求,将请求头解析成HttpServletRequest对象,将请求体交给ServletInputStream对象。
3. 根据请求的URL匹配相应的servlet,创建一个新线程并将HttpServletRequest、HttpServletResponse对象传入servlet。
4. servlet处理请求,做出相应动作并生成响应数据,然后将响应
数据写入HttpServletResponse对象中。
5. HttpServletResponse对象将响应头和响应体发送给Web服务器。
6. Web服务器将响应头和响应体发送到客户端。
总之,servlet是在Web服务器上运行的Java程序,通过HTTP协议
对外提供服务,可以接收和处理请求,并生成相应的响应数据。
它们充当Web服务器和Web应用程序之间的中介,使开发人员可以以面向对象的方
式实现Web应用程序。
使用HttpServletResponse 可以对浏览器进行响应。
大部分情况下,可以使用setContentType()设置响应类型,使用getWriter()取得PrintWriter 对象,而后使用PrintWriter 对象的println()等方法输出HTML 内容。
还可以进一步使用setHeader()、addHeader()等方法进行响应标头的设置,或者是使用sendRedirect()、sendError()方法,对客户端要求重定向网页,或是传送错误消息状态。
也可以使用getOutputStream()取得ServletOutputStream ,直接使用串流对象对浏览器进行字节数据的响应。
对浏览器进行响应当浏览器收到响应时,必须知道如何处理响应的数据,这个信息来自于HTTP 响应的content-type 标头,该标头的设置值为MIME (Multipurpose Internet Mail Extentions )类型,常见的设置有text/html 、application/pdf 、application/jar 、application/x-zip 、image/jpeg 等。
setContentType()会自动设置content-type 响应标头,只要指定MIME 类型就可以了,必要时可以附加一个编码规格,容器会使用指定的字符编码来作为响应对象处理编码的方式(默认是ISO-8859-1)。
响应对象处理编码的方式亦可以使用setCharacterEncoding()来设置,使用getCharacterEncoding()则可以取得代表编码方式的字符串。
setContentType()可以自动设置content-type 的标头。
如果要自行设置响应标头,则可以使用setHeader()、addHeader()等方法。
语句:<codeclass ="hljsavrasm">response.setContentType("text/html;charset=utf-8");</code>等同于以下的程序:?1 2 <code class ="language-java hljs ">response.setHeader("content-type", "text/html;charset=utf-8");response.setCharacterEncoding("utf-8");</code>如果标头名称相同,后续的setHeader()设置值会覆盖先前的设置值,如果打算在一个标头上附加值,则应使用addHeader()方法。
软件包:javax.servlet.http所包含的接口:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。
所包含的类:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。
一、HttpServletRequest接口定义public interface HttpServletRequest extends ServletRequest;用来处理一个对Servlet的HTTP格式的请求信息。
方法1、getAuthTypepublic String getAuthType();返回这个请求的身份验证模式。
2、getCookiespublic Cookie[] getCookies();返回一个数组,该数组包含这个请求中当前的所有cookie。
如果这个请求中没有cookie,返回一个空数组。
3、getDateHeaderpublic long getDateHeader(String name);返回指定的请求头域的值,这个值被转换成一个反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。
如果头域不能转换,抛出一个IllegalArgumentException。
如果这个请求头域不存在,这个方法返回-1。
4、getHeaderpublic String getHeader(String name);返回一个请求头域的值。
(译者注:与上一个方法不同的是,该方法返回一个字符串)如果这个请求头域不存在,这个方法返回-1。
5、getHeaderNamespublic Enumeration getHeaderNames();该方法返回一个String对象的列表,该列表反映请求的所有头域名。
有的引擎可能不允许通过这种方法访问头域,在这种情况下,这个方法返回一个空的列表。
http协议浏览器需要URL找到服务器当中的资源,浏览器传给服务器一个请求,服务器对这个请求进行相应的处理(比如增删改查),服务器根据处理结果返回给浏览器,浏览器根据返回结果进行相应的处理(比如显示网页显示图片),那么浏览器和服务器怎么相互传输数据,数据如何解析,传输什么格式的数据需要制定好一套规则,HTTP协议就应运而生了,这是一群外国人(www)勾搭之后产生的,HTTP协议自出现以来,主要解决的就是浏览器和服务器数据交换的格式问题,所以HTTP协议定义了一套数据格式,一个http请求一般含有请求方法,请求地址,http协议版本,和header,这些header就相当于http协议提供的功能,你设置相应的header可以让服务器产生相应的行为,服务器响应中一般包含协议版本,状态码和状态码描述,和一大堆header,不同的是请求和响应所支持的header 并不一样,具体的参观相应的介绍,http与web开发的联系中有request 和response对象,使用相应的方法可以取到http请求中header内容也可以返回相应的http内容给浏览器,还有一点就是response 当中定义一大把状态码和状态描述,比如200对相应ok,404对应找不到,由来Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest和HttpServletResponse对象,向客户端发送数据找HttpServletResponse,从客户端取数据找HttpServletRequest;HTTP 协议是基于请求-响应的协议,客户端请求一个文件,服务器对该请求进行响应。
HTTP 使用TCP 协议,默认使用80 端口。
最初的HTTP 协议版本是HTTP/0.9,后被HTTP/1.0 替代。
目前使用的版本是HTTP/1.1,在HTTP 协议中,总是由主动建立连接、发送HTTP 请求的客户端来初始化一个事务。
HttpServletRequest对象⽅法的⽤法⼩结深⼊体验JavaWeb开发内幕——关于HttpServletRequestRequest对象HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发⼈员通过这个对象的相关⽅法,即可以获得客户的这些信息。
⼀、通过request常⽤⽅法获得相关信息:1、通过request常⽤⽅法获得客户机信息getRequestURL⽅法返回客户端发出请求时的完整URL。
getRequestURI⽅法返回请求⾏中的资源名部分。
getQueryString ⽅法返回请求⾏中的参数部分。
getRemoteAddr⽅法返回发出请求的客户机的IP地址getRemoteHost⽅法返回发出请求的客户机的完整主机名getRemotePort⽅法返回客户机所使⽤的⽹络端⼝号getLocalAddr⽅法返回WEB服务器的IP地址。
getLocalName⽅法返回WEB服务器的主机名getMethod得到客户机请求⽅式例如在Request.Java中加⼊如下代码://返回相关请求的信息String uri=request.getRequestURI();Stringrad = request.getRemoteAddr();Stringrh = request.getRemoteHost();Stringru = request.getRemoteUser();intrp = request.getRemotePort();Stringcp = request.getContextPath();Stringla = request.getLocalAddr();Stringce = request.getCharacterEncoding();Stringgm = request.getMethod();Stringqs = request.getQueryString();System.out.println(uri);System.out.println(rad);System.out.println(rh);System.out.println(ru);System.out.println(rp);System.out.println(cp);System.out.println(la);System.out.println(ce);System.out.println(gm);System.out.println(qs);即可获取相关信息。
过滤器通过HttpServletResponseWrapper包装HttpServletR。
前⼏天我们项⽬总监给了我⼀个任务,就是将请求的接⼝数据进⾏压缩,以达到节省流量的⽬的。
对于实现该功能,有以下思路:1.获取到response中的值,2.对数据进⾏gzip压缩(因为要求前端不变,所以只能选在这个浏览器都⽀持的压缩⽅式)3.将数据写⼊到response中,4.将response返货前端但是,当我执⾏第⼀步的时候,就遇到了很蛋疼的事情,response中的返回数据拿不到,这⾥就很⽆语了,⼜不允许在每个接⼝⽅法都加上处理⽅法,刚开始想的是在拦截器中的afterCompletion()⽅法⾥进⾏数据处理的,但是response⾥没有提供可以获取body值的⽅法,只能⾃⼰想办法了。
通过⽹上查找,有⼀种⽅式可以获取到response中的数据,就是使⽤HttpServletResponseWrapper包装HttpServletResponse来实现。
通过⽹上找通过HttpServletResponseWrapper实现获取response中的数据,⼤概有两个版本,有⼀个版本的数量很多,但是根本没⽤啊,就是下⾯的代码:public class ResponseWrapper extends HttpServletResponseWrapper {private PrintWriter cachedWriter;private CharArrayWriter bufferedWriter;public ResponseWrapper(HttpServletResponse response) throws IOException {super(response);bufferedWriter = new CharArrayWriter();cachedWriter = new PrintWriter(bufferedWriter);}public PrintWriter getWriter() throws IOException {return cachedWriter;}public String getResult() {byte[] bytes = bufferedWriter.toString().getBytes();try {return new String(bytes, "UTF-8");} catch (Exception e) {LoggerUtil.logError(this.getClass().getName(), "getResult", e);return "";}}}经过测试getResult()根本就获取不到值,具体的⼤家可以研究下上⾯的代码,就知道为啥了,完全是⼀个坑啊,这⾥就不多说了。
拦截器实现原理拦截器是一种常见的程序设计模式,常用于Web开发中请求的拦截处理。
拦截器通过对请求的拦截,可以实现日志记录、安全验证、权限控制等功能,提高Web应用的安全性和可维护性。
本文将从定义、分类和实现原理三个方面介绍拦截器的相关知识。
一、定义拦截器是指在应用程序运行过程中,拦截某个操作并在该操作之前或之后进行处理的一种程序设计模式。
它可以拦截Web请求、方法调用等操作,并对其进行相应的处理。
二、分类根据拦截器的使用场景和功能,可以将其分为以下几种类型:1. Web拦截器Web拦截器是指用于拦截Web请求的拦截器,常用于对请求进行安全验证、权限控制、日志记录等功能。
常见的Web拦截器包括SpringMVC中的HandlerInterceptor、Struts2中的Interceptor等。
2. AOP拦截器AOP拦截器是指应用于AOP编程中的拦截器,用于拦截方法调用等操作,并进行相应的处理。
常见的AOP拦截器包括Spring框架中的MethodInterceptor、AspectJ中的Interceptor等。
3. 日志拦截器日志拦截器是指用于拦截某个操作并记录日志的拦截器。
常用于记录系统运行日志、用户操作日志等。
常见的日志拦截器包括Log4j、Logback等。
三、实现原理拦截器的实现原理主要涉及到反射和链式调用两个方面。
以下以Web拦截器为例,介绍其实现原理:1. 反射Web拦截器常常通过反射机制实现对请求的拦截。
具体实现方式如下:(1)定义一个拦截器接口,并实现doInterceptor方法。
该方法接受参数为HttpServletRequest和HttpServletResponse对象,用于对请求进行操作。
public interface HandlerInterceptor {boolean doInterceptor(HttpServletRequest request, HttpServletResponseresponse);}(2)在拦截器实现类中实现doInterceptor方法,并使用反射机制调用控制器中相应的方法。
在Java中,请求转发通常使用Servlet技术实现。
以下是一个简单的请求转发的示例代码:
在上面的代码中,首先通过requestContext.getRequest()获取当前请求对象,然后通过responseContext.getResponse()获取响应对象。
接着,通过
request.getRequestDispatcher(targetPath).forward(request, response)将请求转发到目标资源。
其中,targetPath是目标资源的路径,可以是相对于当前Servlet的路径,也可以是绝对路径。
需要注意的是,请求转发是服务器端的行为,客户端并不知道发生了请求转发。
因此,客户端仍然会认为它正在访问原始的请求资源。
同时,请求转发可以保留原始请求中的属性,因此可以在目标资源中访问这些属性。
第六天 HttpServletResponse 和HttpServletRequest (1)HttpServletResponse 接口 .................................................................................... 2 数据响应(重点) ...................................................................................................... 2 HttpServletRequest 接口 ....................................................................................... 7 请求获取(重点) ...................................................................................................... 8 Web 项目中路径问题 ........................................................................................... 18 URLEncoder 和URLDecoder 类 ......................................................................... 18 总结 ..................................................................................................................... 20 练习 (20)第六天 HttpServletResponse 和HttpServletRequest在Servlet 生命周期中我们只是简单的讲解了生命周期的几个方法以及对象的创建,下图详细的描述了客户端浏览器和服务器Tomcat 的请求和响应过程。
文字描述:1.浏览器发送请求2.服务器找到指定的网站,然后该网站的web.xml 中找到指定的资源名映射的Class 类 3.服务器检测该Class 是否有对象,如果有直接返回,如果没有直接创建 4.服务器创建ServletConfig 接口的实现类对象5.服务器调用Servlet 的init(ServletConfig)方法进行初始化 6.创建HttpServletRequest 和HttpServletResponse 对象 7.服务器调用service 方法8.在service 方法中响应用户的请求9.执行完毕service 方法将response 返回给Tomcat 容器IE 浏览器Tom cat 服务器Dem o11 : 192.168.10.1/day06/Dem o1()2 : 在Tom cat 管理的网站中的web.xm l 找资源()3 : 找到/Dem o1对应的class()4 : 如果没有找到该类的实例,那么创建,否则直接返回该实例()5 : 执行构造函数创建对象()6 : 创建Servelt()7 : 创建ServletConfig 对象()8 : 执行init()9 : 创建HttpServletRequest 和HttpServletResponse 对象()10 : service 处理用户的请求,就是使用response 进行数据输出()11 : 将写好数据的response 对象返回给Tocm at()12 : 将response 中的数据使用HTTP 响应消息格式封装好()13 : 响应用户的请求()13结束后请求和响应结束,如果服务器关闭了,那么销毁服务器创建好的所有对象:ServletConfig 、ServletContext 、request 和response 以及servlet 的实例GET /day07/MyResources HTTP/1.1Accept: */*Accept-Language: zh-cn,en-US;User-Agent: Mozilla/4.0Accept-Encoding: gzip, deflate Host: localhost:8080Connection: Keep-AliveHTTP/1.1 200 OKServer: Apache-Coyote/1.1Content-Length: 0Date: Fri, 02 Nov 2012 03:42:49HTTPServletRequestHttpServletResponse10.服务器封装response响应数据为HTTP格式11.服务器将封装为HTTP协议的响应数据发送给浏览器进行响应12.服务器响应结束,如果关闭则销毁创建好的所有对象13.整个请求和响应结束….HttpServletRequest代表用户的请求(重点)HttpServletResponse代表服务器的响应(重点)HttpServletResponse接口继承体系:----| ServletResponse 接口该接口主要定义了一个用于响应客户端请求的对象,该接口的对象由Tomcat创建并传递给service相关的方法。
获取输出流方法ServletOutputStream getOutputStream() →给客户端响应二进制数据PrintWriter getWriter() →给客户端响应文本数据响应设置方法void setCharacterEncoding(String charset) →设置输出数据的编码方式void setContentType(String type) →设置响应的内容类型------| HttpServletResponse 接口该接口继承自ServletResponse接口,主要定义了用于获取响应消息头和Cookie的一些方法。
该接口的对象由Tomcat创建传递给service相关的方法。
设置响应头方法void setStatus(int sc) →设置响应的状态码void setHeader(String name, String value) →设置响应头添加Cookie方法void addCookie(Cookie cookie) →添加Cookie信息请求重定向方法void sendRedirect(String location) →重定向请求数据响应(重点)◆设置响应状态码和响应头1.重定向设置public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应的状态码response.setStatus(302);// 设置响应头response.setHeader("location", "/day07/redirect");}特点:(1) 浏览器发送了两次请求(2) 浏览器地址栏发生了变化缺点:对于不懂得HTTP协议的人而言不好操作。
2.使用response提供的方法实现重定向public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.sendRedirect("/day07/redirect");}总结:其实Servlet不主张直接操作HTTP协议,一般都会提供额外的方法来使得开发者简单(透明)的操作HTTP协议。
response.setHeader("content-type", "text/html;charset=UTF-8");使用以下语句替换:response.setContentType("text/html;charset=UTF-8")字节流输出1、普通数据输出public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 1. 获取字节输出流ServletOutputStream out = response.getOutputStream();// 2. 输出数据String data = new String("hello");out.write(data.getBytes());data = "<font color=\"red\"><h2>this is a h2</h2></font>";out.write(data.getBytes());// 3. 释放资源out.close();}2、中文的输出public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 0. 设置输出数据的编码方式(设置字节流)response.setHeader("content-type","text/html;charset=UTF-8");// 1. 获取字节输出流ServletOutputStream out = response.getOutputStream();// 2. 输出数据String data = new String("hello");out.write(data.getBytes());data = "<font color=\"red\"><h2>我的文章标题</h2></font>";out.write(data.getBytes("UTF-8")); // 编码// 3. 释放资源out.close();}多学一招:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />该标签在HTML中模拟HTTP协议通知浏览器我的页面的编码方式。