2.请求和响应的处理
文章目录
一、动态资源和静态资源
-
静态资源:
客户端发送请求到web服务器,web服务器从内存取到相应的文件,返回给客户端,客户端解析并渲染显示出来
-
动态资源:
.jsp
、.asp/.aspx
、.php
请求的资源先提交web服务器>>连接数据库处理,再将内容交给web服务器>>客户端
动态资源需要在服务器端运行,响应给客户端是服务器端代码的运行结果
-
javax.servlet(包)
Servlet
相关的接口都放在javax.servlet
包中,常用接口有:接口 说明 Servlet 处理请求和发送响应的过程的Java技术 ServletConfig 在初始化的过程中由 Servlet容器使用 ServletContext 定义在Servlet用于获取来自其容器的信息的方法 ServletRequest 向服务器发送的请求信息 ServletResponse 客户端请求的响应 ServletInputStream 用于从客户端读取二进制数据 ServletOutputStream 用于将二进制数据发送到客户端
二、Servlet体系
1.简介
Servlet
是一个用 Java 编写的程序,此程序在服务器上运行以处理客户端请求,处理请求的过程如下:
- 接收客户端(浏览器)请求信息
- 调用业务处理
- 向客户端(浏览器)发送HTTP响应
2.HttpServlet
HttpServlet 类是一个抽象类,用以创建针对HTTP协议的 Servlet接口的实现类,它实现了service方法;
针对客户端不同的消息发送方式,分别调用doGet()、doPost()等方法,因此在继承HttpServlet时只需要覆盖doGet或doPost方法即可
3.Servlet生命周期
阶段 | 时机 | 调用的方法(钩子) |
---|---|---|
实例化 | Servlet 容器创建 Servlet 的实例 | 默认构造方法 |
初始化 | 第一次向服务器发送请求或者服务器上没有servlet的时候,实例化之后 | init(config) |
服务 | 每次向服务器发送请求的时候 | service() |
销毁 | 服务停止的时候,项目重新加载的时候 | destroy () |
不可用 | 销毁实例并标记为垃圾收集 | 等待GC回收 |
Servlet的生命周期可以归纳为以下几个阶段:
-
装载Servlet:这项操作一般是动态执行的。有些服务器提供了响应的管理功能,可以在启动的时候就装载Servlet并能够初始化特定的Servlet。
只调用一次
当web应用处于运行阶段时,特定的servlet被客户端首次请求访问。
在web.xml文件中为servlet设置了
<load-on-startup>
元素<servlet> <servlet-name>servlet1</servlet-name> <servlet-class>servlet.servlet1</servlet-class> <load-on-startup>0</load-on-startup> </servlet>
在servlet的配置当中,
<load-on-startup>5</load-on-startup>
的含义是:标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。
当web应用被重新启动时,web应用中的所有servlet会在特定的时间被重新初始化。
-
创建一个Servlet实例。
-
调用Servlet的init()方法。
-
一个客户端的请求到达服务器。
-
创建一个请求对象。
-
创建一个响应对象。
-
激活Servlet的Service()方法,并传递请求和响应对象。
多次调用执行
在这个阶段servlet可以随时响应客户端的请求。当servlet容器接到访问特定的servlet请求时,servlet容器会创建针对与这个请求的servletRequest和servletResponse对象,然后调用service()方法,并把这两个对象当做参数传递给service()方法。Service()方法通过servletRequest对象获得请求信息,并处理该请求,再通过servletResponse对象生成响应结果。
不管是post还是get方法提交,都会在service中处理,然后,由service来交由相应的doPost或doGet方法处理,如果你重写了service方法,就不会再处理doPost或doGet了,如果重写sevice()方法,可以自己转向doPost()或doGet()方法
当servlet容器把servlet生成的响应结果发送给客户后,servlet容器会销毁servletRequest和sevletResponse对象。
-
Service()方法获得关于请求对象的信息、处理请求、访问其它资源、获得需要的信息。
-
Service()方法使用响应对象的方法,将响应传回服务器,最终到达客户端。
-
对于更多的客户端请求,服务器创建新的请求和响应对象,仍然激活此Servlet的Service()方法,将两个对象作为参数传递给它。
-
当服务器不再需要Servlet或当服务器关闭时,服务器将会调用Servlet的destroy()方法来销毁Servlet。
只执行一次
当Web应用被终止时,servlet容器会先调用web应用中所有的servlet对象的destroy()方法,然后在销毁servlet对象。此外容器还会销毁与servlet对象关联的servletConfig对象。
在destroy()方法的实现中,可以释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。
三、Request对象
Request对象封装了客户端对服务器的请求信息
实现javax.servlet.http.HttpServletRequest接口
使用 HTTP 协议处理客户端的请求
1.ServletRequest
ServletRequest接口封装了客户端请求的细节。它与协议无关,并指定一个HTTP的子接口。
1)ServletRequest主要功能有:
- 找出客户端的主机名和IP地址
- 检索请求参数
- 取得和设置属性
- 取得输入、输出流
2)ServletRequest类的常用方法:
- getAttribute(String name): 返回具有指定名称的请求属性,如果不存在则返回null。属性可由Servlet引擎设置或使用
- setAttribute()显式加入。
- getAttributeName(): 返回请求中所有属性名的枚举。如果不存在属性,则返回一个空的枚举。
- getCharacteEncoding(): 返回请求所用的字符编码。
- getInputStream()throws IOException: 返回与请求相关的(二进制)输入流。可以调用getInputStream()或getReader()方法。
- getParameter(String name): 返回指定输入参数,如果不存在,返回null。
- getParameterName(): 返回请求中所有参数名的一个可能为空的枚举。
- getParameterValues(String name): 返回指定输入参数名的取值数组,如果取值不存在则返回null。
2.HttpServletRequest处理请求
HttpServletRequest类型的对象代表的是请求对象,父接口:ServletRequest
所在包为:javax.servlet.http
常用方法
- getParameter: 得到客户端的请求参数信息
- getMethod: 得到客户端的请求方式,返回GET或者POST
- getRequestDispatcher: 得到请求转发器
- setAtrribute(): 给请求范围中设置数据
- getAttribute(): 取出请求范围的数据
四、Response对象
服务器端生成响应并发送给客户端
1.ServletResponse
ServletResponse将一个Servlet生成的结果传送到发出请求的客户端。ServletResponse操作主要是作为输出流及其内容类型和长度的包容器,它由Servlet引擎创建。
1)常用方法:
- getCharacterEncoding(): 返回响应程序使用字符解码的名字。除非显式设置,否则为ISO-8859-1。
- getOutputStream()throws IOException: 返回用于将返回的二进制输出写入客户端的流,此方法和getWrite()方法二者只能调用其一。
- getWriter()throws IOException: 返回用于将返回的文本输出写入客户端的一个字符写入器,此方法和getOutputStream()二者只能调用其一。
- setContentType(String type): 设置内容类型。在HTTPServlet中设置Content-Type头标。
2.HttpServletResponse处理响应
HttpServletResponse类型的对象代表的是响应对象,父接口ServletResponse;
HttpServletResponse代表了对客户端的Http的响应。它提供了表示状态码、状态信息和响应头标的方法,同时还负责对URL中写入一个Web页面的HTTP会话ID进行解码。JSP中的内建对象response是一个HttpServletResponse实例。
所在包为:javax.servlet.http
1)常用方法:
- addCookie(Cookie cookie): 将一个Set-Cookie头标加入到响应。
- setHeader(String name,String value): 设置具有指定名字和取值的一个响应头标。
- encodeRedirectURL(String url): 如果客户端不知道接受cookie,则向URL加入会话ID。第一种形式只对在sendRedirect()中使用的URL进行调用。其它被编码的URL应被传递到encodeURL()中。
- encodeURL(String url): 使用URL和一个SessionID重写这个URL。
- sendRedirect(String location): 把响应发送到另一页面或者Servlet进行处理。
- getWriter(): 该方法取得PrintWriter对象,来输出字符数据。
- getOutputStream(): 该方法获得ServletOutputStream输出流。
- setContentType(): 该方法设置响应的MIME类型。
dRedirect(String location): 把响应发送到另一页面或者Servlet进行处理。 - getWriter(): 该方法取得PrintWriter对象,来输出字符数据。
- getOutputStream(): 该方法获得ServletOutputStream输出流。
- setContentType(): 该方法设置响应的MIME类型。
- setCharacterEncoding(String charset): 设置响应的字符编码类型。