java学习总结之Servlet

(一)Servlet概述

java servlet是运行在web服务器或应用服务器上的程序,它是作为来自web浏览器或其他http客户端的请求和http服务器上的数据库或应用程序之间的中间层。java servlet是运行在带有支持java servlet规范的解释器的web服务器上的java类,java servlet可以使用javax.servlet和javax.servlet.http包创建。

servlet架构

图1:servlet架构

servlet主要完成以下任务:

(1)读取客户端(浏览器)发送的显式的数据,包括网页上的html表单,或者是来自applet或自定义的http客户端程序的表单。

(2)读取客户端(浏览器)发送的隐式的http请求数据,包括cookies、媒体类型和浏览器能理解的压缩格式等。

(3)处理数据并生成结果,这个过程可能要访问数据库,也可能是直接计算得出对应的响应。

(4)发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(html或xml)、二进制文件(gif图像)、excel等。

(5)发送隐式的http响应到客户端(浏览器),告诉包括浏览器或其他客户端返回的文档类型、设置cookies和缓存参数,以及其他类型的任务。

(二)Servlet生命周期

Servlet生命周期

图2:Servlet声明周期

1、通过调用init()方法进行初始化

init()方法只调用一次,它在第一次创建servlet的时候被调用,在后续每次用户请求时不再调用。当用户调用一个servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交给doGet和doPost方法。init()方法简单的创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。(注意:servlet创建的有两个时机:第一次请求时、web应用启动时,可参阅《web.xml配置Servlet的load-on-startup》)

2、通过调用service()方法来处理客户请求

service()方法是执行实际任务的主要方法,Servlet容器(即web服务器,如tomcat)调用service()方法来处理来自客户端的请求,并把格式化的响应返回客户端。每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务。service()方法检查http请求类型(GET、POST、PUT、DELETE),并在适当的时候调用doGet、doPost、doPut、doDelete等方法。

doGet()和doPost()方法是每次服务请求中最常用的方法:

(1)doGet()方法

GET请求来自于一个URL的正常请求,或者来自于一个未指定Method的HTML表单,它由doGet()方法处理。

(2)doPost()方法

POST请求来自于一个特别指定了Method为POST的HTML表单,它由doPost()方法处理。

3、通过调用destroy()方法来终止

destroy()方法只会被调用一次,在Servlet生命周期结束时被调用。destroy()方法可以用于关闭数据库连接、停止后台线程、把Cookie列表或点击计数器写入磁盘,并执行其他类似的清理活动。在调用destroy()方法以后,servlet对象被标记为垃圾回收。

(三)Servlet表单数据

表单数据一般是通过POST和GET两种方式传递。GET方法是默认的从浏览器向web服务器传递信息的方法,它会将传递的参数显示在地址栏的URL中,所以,如果要传递的是用户名、密码,那么不要使用GET方式。同时,GET方式有大小的限制,请求字符串最多只能有1024个字符。POST方法不会把传递信息显示出来,而且无大小限制。

servlet读取表单数据有以下几种方法:

(1)getParameter():可以调用request.getParameter()方法来获取表单参数的值。

(2)getParameterValues():如果参数出现多次,可以调用request.getParameterValues()方法,并返回多个值,例如复选框。

(3)getParameterNames():如果想要得到当前请求中的所有参数的完整列表,可调用request.getParameterNames()方法。

(四)Servlet客户端HTTP请求

以下是Servlet读取http头的一些方法,这些方法通过HttpServletRequest对象调用,有关这些方法的详细介绍可以去参考java有关servlet的参考手册(点击这里)。

方法
描述
Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的Cookie对象。
Enumeration getAttributeNames() 返回一个枚举,包含提供给该请求可用的属性名称。
Enumeration getHeaderNames() 返回一个枚举,包含在该请求中包含的所有的头名。
Enumeration getParameterNames() 返回一个String对象的枚举,包含在该请求中包含的参数的名称。
HttpSession getSession() 返回与该请求关联的当前session会话,或者如果请求没有session会话,则创建一个。
HttpSession getSession(boolean create) 返回与该请求关联的当前HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的session会话。
Locale getLocale() 基于Accept-Language头,返回客户端接受内容的首选的区域设置。
Object getAttribute(String name) 以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。
ServletInputStream getInputStream() 使用 ServletInputStream,以二进制数据形式检索请求的主体。
String getAuthType() 返回用于保护Servlet的身份验证方案的名称,例如,"BASIC" 或 "SSL",如果JSP没有受到保护则返回 null。
String getCharacterEncoding() 返回请求主体中使用的字符编码的名称。
String getContentType() 返回请求主体的MIME类型,如果不知道类型则返回null。
String getContextPath() 返回指示请求上下文的请求URI部分。
String getHeader(String name) 以字符串形式返回指定的请求头的值。
String getMethod() 返回请求的HTTP方法的名称,例如:GET、POST 或 PUT。
String getParameter(String name) 以字符串形式返回请求参数的值,或者如果参数不存在则返回null。
String getPathInfo() 当请求发出时,返回与客户端发送的URL相关的任何额外的路径信息。
String getProtocol() 返回请求协议的名称和版本。
String getQueryString() 返回包含在路径后的请求URL中的查询字符串。
String getRemoteAddr() 返回发送请求的客户端的互联网协议(IP)地址。
String getRemoteHost() 返回发送请求的客户端的完全限定名称。
String getRemoteUser() 如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回null。
String getRequestURI() 从协议名称直到HTTP请求的第一行的查询字符串中,返回该请求的URL的一部分。
String getRequestedSessionId() 返回由客户端指定的session会话ID。
String getServletPath() 返回调用JSP的请求的URL的一部分。
String[] getParameterValues(String name) 返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回null。
boolean isSecure() 返回一个布尔值,指示请求是否使用安全通道,如HTTPS。
int getContentLength() 以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回-1。
int getIntHeader(String name) 返回指定的请求头的值为一个int值。
int getServerPort() 返回接收到这个请求的端口号。

(五)Servlet服务器HTTP响应

下面的方法可用于在Servlet程序中设置HTTP响应报头,这些方法可以通过HttpServletResponse对象调用。

方法 描述
String encodeRedirectURL(String url) 为sendRedirect方法中使用的指定的URL进行编码,或者如果编码不是必需的,则返回URL未改变。
String encodeURL(String url) 对包含session会话ID的指定URL进行编码,或者如果编码不是必需的,则返回URL未改变。
boolean containsHeader(String name) 返回一个布尔值,指示是否已经设置已命名的响应报头。
boolean isCommitted() 返回一个布尔值,指示响应是否已经提交。
void addCookie(Cookie cookie) 把指定的cookie添加到响应。
void addDateHeader(String name, long date) 添加一个带有给定的名称和日期值的响应报头。
void addHeader(String name, String value) 添加一个带有给定的名称和值的响应报头。
void addIntHeader(String name, int value) 添加一个带有给定的名称和整数值的响应报头。
void flushBuffer() 强制任何在缓冲区中的内容被写入到客户端。
void reset() 清除缓冲区中存在的任何数据,包括状态码和头。
void resetBuffer() 清除响应中基础缓冲区的内容,不清除状态码和头。
void sendError(int sc) 使用指定的状态码发送错误响应到客户端,并清除缓冲区。
void sendError(int sc, String msg) 使用指定的状态发送错误响应到客户端,该方法发送一个状态码,通常是404。
void sendRedirect(String location) 使用指定的重定向位置URL发送临时重定向响应到客户端,该方法生成一个302状态码,表示临时性转移。
void setBufferSize(int size) 为响应主体设置首选的缓冲区大小。
void setCharacterEncoding(String charset) 设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
void setContentLength(int len) 设置在HTTP Servlet响应中的内容主体的长度,该方法设置 HTTP Content-Length头。
void setContentType(String type) 如果响应还未被提交,设置被发送到客户端的响应的内容类型。
void setDateHeader(String name, long date) 设置一个带有给定的名称和日期值的响应报头。
void setHeader(String name, String value) 设置一个带有给定的名称和值的响应报头。
void setIntHeader(String name, int value) 设置一个带有给定的名称和整数值的响应报头。
void setLocale(Locale loc) 如果响应还未被提交,设置响应的区域。
void setStatus(int sc) 为该响应设置状态码。

(六)Servlet过滤器

关于Servlet过滤器的有关内容,可以阅读《Servlet过滤器编写小结》这篇文章。

(七)Servlet异常处理

关于Servlet异常处理的有关内容,可以阅读《Servlet异常处理小结》这篇文章。

(八)Servlet Cookies处理

关于Servlet Cookies处理的有关内容,可以阅读《Servlet Cookies小结》这篇文章。

(九)Servlet Session

关于Servlet Session的有关内容,可以阅读《Servlet Session小结》这篇文章。

本文标题:java学习总结之Servlet

本文链接:http://yedward.net/?id=260

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章