重温Servlet,为Spring Framework和Spring BOOT之基础

1、一个Servlet入门项目

使用STS4新建一个空的POM项目:html

(1)建立包com.edisonjava

(2)建立类ServletTest,继承自HttpServlet,代码以下:web

image.png 

3)使用mvn compile编译数据库

4)到本项目的target目录下数组

image.png

拷贝classes目录到tomcatwebapps\ROOT\WEB-INF目录下:
浏览器

image.png

5)打开这个目录下的web.xml,并增长以下几行(阴影部分):缓存

image.png 

(6)tomcatbin目录下,执行startup.battomcat

image.png 

(7)使用浏览器测试:安全

image.png 

2Servlet架构和依赖环境

image.png 

Java Servlet 是运行在 HTTP Server或应用服务器(例如:Tomcat上的程序,它是做为来自 Web browser HTTP server应用程序之间的中间层。服务器

Servlet收集来自网页表单的用户输入,呈现来自数据库或者其余源的记录,还能够动态建立网页,这些功能和 CGICommon Gateway Interface,公共网关接口)程序相同

相比于 CGIServlet更容易开发,还有以下特色:

Servlet Web 服务器的地址空间内执行。

Servlet Java 编写。

Java 安全管理器能保护Servlet

Java 类库能支撑 Servlet

 

JAVA Web开发框架大部分都是创建在Servlet基础之上的,好比StructsSpring MVC,前者的ActionServlet和后者的DispatcherServletServlet

Servlet是处理web请求的基本单元,而Filter则是围绕着Servlet,用于在web请求被处理以前或者以后对web请求(Request)和应答(Response)修改,Filter工做机制以下图:

image.png 

Servlet Filter 具备以下特色:

Filter能够做用于Servlet以前、又能够做用于Servlet以后。Spring Security做用于Servlet以前

FilterRequest到达Servlet以前,能够直接将Response返回,此功能用于诸如在未登陆的状况下直接向用户展现登陆页面这样的功能。

多个Filter起做用时有前后顺序。

 

Servlet依赖环境包括Web服务器(应用服务器、容器)、servlet规范、JSP规范。

Java Servlet 运行在带有支持 Java Servlet 规范的Web服务器或者容器上,而Tomcat就是一种支持servlet容器功能的应用服务器

Servlet须要 javax.servlet  javax.servlet.http 支持。

Servlet必须符合Java Servlet 规范 JSP 规范,不一样容器实现的规范版本不一样

3Servlet主要功能和生命周期

Servlet用于替代CGI,所以具备CGI相似的功能:

获取浏览器上传的用户数据,例如网页上的 HTML 表单(也能够是来自 applet 或自定义的 HTTP 客户端程序的表单)。

获取浏览器上传的HTTP请求数据包括 cookies、媒体类型和浏览器能理解的压缩格式等等。

处理这些上行数据并生成结果,包括访问数据库,执行 RMI CORBA 调用,调用 Web 服务。

下发用户响应数据到浏览器,例如文本文件(HTML XMLJSON)、图片、流媒体等。

下发 HTTP响应数据到浏览器包括返回文档类型(例如 HTML),设置 cookies 和缓存参数,以及其余相似的任务。

 

Servlet 生命周期从建立直到毁灭的整个过程,过程包括:

init () 方法初始化,只调用一次

service() 方法处理客户端的请求,每收到一次请求,服务器新产生一个线程来处理

destroy() 方法: 终止,只调用一次

垃圾回收:JVM 的垃圾回收器负责最后的垃圾回收。

生命周期示意图以下:

image.png 

 

service() 方法能够调用的HTTP请求方法:

doGet() 方法

对应HTTP GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD HTML 表单

public void doGet(HttpServletRequest request,

                  HttpServletResponse response)

    throws ServletException, IOException {

    // Servlet 代码}

doPost() 方法

对应HTTP POST 请求来自于一个特别指定了 METHOD POST HTML 表单

public void doPost(HttpServletRequest request,

                   HttpServletResponse response)

    throws ServletException, IOException {

    // Servlet 代码}

 

4HTTPHTTPS协议介绍

HTTPHyperText Transfer Protocol超文本传输协议),是WWWWorld Wide Web,万维网)的传输协议,是TCP/IP模型的应用层协议,负责Web浏览器和Web服务器之间传输超文本信息(Hypertext),超文本信息能够描述超媒体( Hypermedia),而超媒体包括文本、图形、视频、音频等多媒体(Multimedia)信息,这些信息以web页面(Web Page)为单位,他们之间经过超连接(Hyperlink)相互链接。

HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行做为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

image.png 

 HTTP1.0采用普通交互流程,屡次交互才能完成信息传输,以下

1Web浏览器链接到Web服务器
Web浏览器Web服务器的HTTP端口(默认为80)创建一个TCP套接字链接。

2发送HTTP请求
经过TCP套接字,Web浏览器Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据组成。

3Web服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。Web服务器将资源复本写到TCP套接字,由Web浏览器读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

4释放链接TCP链接
链接模式为close,则Web服务器主动关闭TCP链接,Web浏览器释放TCP链接;链接模式为keepalive,则该链接会保持一段时间,在该时间内能够继续接收请求;

5Web浏览器解析HTML内容
Web浏览器首先解析状态行,查看代表请求是否成功的状态代码。而后解析每个响应头,响应头告知如下为若干字节的HTML文档和文档的字符集。Web浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在Web浏览器窗口中显示。

 

HTTP1.1采用持久链接(HTTP Persistent Connections),也称为 HTTP keep-alive HTTP connection reuse,只要任意一端没有明确提出断开链接,则保持TCP链接状态,其交互流程以下:

image.png 

上图的“客户端”实际上就是Web浏览器,或者定制的特殊Web浏览器,上图的“服务器”就是Web服务器,“创建TCP链接”包括三个子步骤,“断开TCP链接”包括四个子步骤。

持久链接使得多数请求以管线化(pipelining)方式发送成为可能,HTTP1.1支持管线化传输。管线化技术支持并行发送多个请求。以下图:

image.png 

HTTPSHTTP基础上增长了数字签名和非对称加解密功能,其交互图以下:

image.png 

 

HTTP报文包括请求报文和响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成。而响应报文由状态行、响应头部、空行和响应体四个部分组成。下图是一个具体HTTP报文例子:

image.png 

 

HTTP请求类型包括:

image.png 

 

HTTP状态码包括:

image.png 

 

 

image.pngspacer.gif 

image.png 

 image.png

HTTP/1.1种规定了47种首部字段(图表参考《图解HTTP》)

1通用首部字段

image.png 

2请求首部字段

image.png 

3响应首部字段

image.png 

4实体首部字段

image.png 

5其余首部字段

CookieSet-CookieContent-DispositionConnectionKeep-AliveProxy-AuthenticateProxy-AuthorizationTrailerTETransfer-EncodingUpgrade etc...

 

5、在Java EE中测试Servlet

这里提供GETPOST表单请求的例子,步骤以下:

(1)新建web项目

使用STS4建立Dynamic Web新项目:

image.png 

下一步以下:

image.png 

New Runtime”:

image.png 

 

选择Tomcat7而后Next,再点击Browse选择tomcat安装目录:

image.png 

选择目录后回到先前的界面,而后再选择JRE

image.png 

而后选择两次Next,以下:

image.png 

finish。到左边的Project Explorer

image.png 

选中src,右键菜单new-->servlet,进入以下界面:

image.png 

填写包和类名后,两次next后:

image.png 

Finish。生成TestPostMethod.java文件,内容以下:

image.png 

修改doGet,以下:

image.png 

修改doPost,以下:

image.png 

image.png 

Project Explorerweb content目录下新建目录:HTML。而后,选中HTML,右键菜单new-->html file,弹出“New HTML File”窗口,在File Name中填写:index.htm,以下:

image.png 

FinishIndex.html代码以下:

image.png 

修改成:

image.png 

选中WEB-INF目录,右键菜单new-->

image.png 

Next,以下:

image.png 

File Name中,输入web.xml,点FinishWeb.xml内容为:

image.png 

修改成:

image.png

 

(2)构建和测试

选中项目,右键菜单Run As-->Run on Server:

image.png 

Finish

 

这时候,STS4在右上角自动显示首页:

image.png 

在上面输入:googlewww.google.com,点提交:

image.png 

 

返回后再下面选中物理,点“选择学科”:

image.png 

 

过程当中遇到一个问题:

[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TestPost' did not find a matching property.

image.png 

解决:在STS4的右下角,选中Server,再选中Tomcat,以下图:

image.png 

而后,右键菜单Open,在右上角窗口,把“Publish module contexts to separate XML files”打钩,以下:

image.png 

关闭并保存。

 

6Servlet请求

Servlet请求类是javax.servlet.http.HttpServletRequest

每当Web浏览器请求一个页面时,Web服务器就会产生一个新的request对象来表明这个请求。 request对象提供了一系列方法来获取HTTP请求头,包括表单数据,cookiesHTTP方法等等。

经常使用的HTTP请求头以下:

头信息

描述

Accept

这个头信息指定浏览器或其余客户端能够处理的 MIME 类型。值 image/png 或 image/jpeg 是最多见的两种可能值。

Accept-Charset

这个头信息指定浏览器能够用来显示信息的字符集。例如 ISO-8859-1。

Accept-Encoding

这个头信息指定浏览器知道如何处理的编码类型。值 gzip 或 compress 是最多见的两种可能值。

Accept-Language

这个头信息指定客户端的首选语言,在这种状况下,Servlet 会产生多种语言的结果。例如,en、en-us、ru 等。

Authorization

这个头信息用于客户端在访问受密码保护的网页时识别本身的身份。

Connection

这个头信息指示客户端是否能够处理持久 HTTP 链接。持久链接容许客户端或其余浏览器经过单个请求来检索多个文件。值 Keep-Alive 意味着使用了持续链接。

Content-Length

这个头信息只适用于 POST 请求,并给出 POST 数据的大小(以字节为单位)。

Cookie

这个头信息把以前发送到浏览器的 cookies 返回到服务器。

Host

这个头信息指定原始的 URL 中的主机和端口。

If-Modified-Since

这个头信息表示只有当页面在指定的日期后已更改时,客户端想要的页面。若是没有新的结果可使用,服务器会发送一个 304 代码,表示 Not Modified 头信息。

If-Unmodified-Since

这个头信息是 If-Modified-Since 的对立面,它指定只有当文档早于指定日期时,操做才会成功。

Referer

这个头信息指示所指向的 Web 页的 URL。例如,若是您在网页 1,点击一个连接到网页 2,当浏览器请求网页 2 时,网页 1 的 URL 就会包含在 Referer 头信息中。

User-Agent

这个头信息识别发出请求的浏览器或其余客户端,并能够向不一样类型的浏览器返回不一样的内容。

 

Servlet请求类详细状况以下:

序号

方法 & 描述

1

Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的全部的 Cookie 对象。

2

Enumeration getAttributeNames()
返回一个枚举,包含提供给该请求可用的属性名称。

3

Enumeration getHeaderNames()
返回一个枚举,包含在该请求中包含的全部的头名。

4

Enumeration getParameterNames()
返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。

5

HttpSession getSession()
返回与该请求关联的当前 session 会话,或者若是请求没有 session 会话,则建立一个。

6

HttpSession getSession(boolean create)
返回与该请求关联的当前 HttpSession,或者若是没有当前会话,且建立是真的,则返回一个新的 session 会话。

7

Locale getLocale()
基于 Accept-Language 头,返回客户端接受内容的首选的区域设置。

8

Object getAttribute(String name)
以对象形式返回已命名属性的值,若是没有给定名称的属性存在,则返回 null。

9

ServletInputStream getInputStream()
使用 ServletInputStream,以二进制数据形式检索请求的主体。

10

String getAuthType()
返回用于保护 Servlet 的身份验证方案的名称,例如,"BASIC" 或 "SSL",若是JSP没有受到保护则返回 null。

11

String getCharacterEncoding()
返回请求主体中使用的字符编码的名称。

12

String getContentType()
返回请求主体的 MIME 类型,若是不知道类型则返回 null。

13

String getContextPath()
返回指示请求上下文的请求 URI 部分。

14

String getHeader(String name)
以字符串形式返回指定的请求头的值。

15

String getMethod()
返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。

16

String getParameter(String name)
以字符串形式返回请求参数的值,或者若是参数不存在则返回 null。

17

String getPathInfo()
当请求发出时,返回与客户端发送的 URL 相关的任何额外的路径信息。

18

String getProtocol()
返回请求协议的名称和版本。

19

String getQueryString()
返回包含在路径后的请求 URL 中的查询字符串。

20

String getRemoteAddr()
返回发送请求的客户端的互联网协议(IP)地址。

21

String getRemoteHost()
返回发送请求的客户端的彻底限定名称。

22

String getRemoteUser()
若是用户已经过身份验证,则返回发出请求的登陆用户,或者若是用户未经过身份验证,则返回 null。

23

String getRequestURI()
从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。

24

String getRequestedSessionId()
返回由客户端指定的 session 会话 ID。

25

String getServletPath()
返回调用 JSP 的请求的 URL 的一部分。

26

String[] getParameterValues(String name)
返回一个字符串对象的数组,包含全部给定的请求参数的值,若是参数不存在则返回 null。

27

boolean isSecure()
返回一个布尔值,指示请求是否使用安全通道,如 HTTPS。

28

int getContentLength()
以字节为单位返回请求主体的长度,并提供输入流,或者若是长度未知则返回 -1。

29

int getIntHeader(String name)
返回指定的请求头的值为一个 int 值。

30

int getServerPort()
返回接收到这个请求的端口号。

31

int getParameterMap()
将参数封装成 Map 类型。

 

 

修改前面的servlet入门项目”,以下:

image.png 

测试:

image.png 

7Servlet应答

 Web服务器处理Servlet请求后向Web浏览器发送Servlet应答消息,设置HTTP状态和向WEB浏览器发送数据,如CookieHTTP文件头信息等。

经常使用的应答头信息以下:

头信息

描述

Allow

这个头信息指定服务器支持的请求方法(GET、POST 等)。

Cache-Control

这个头信息指定响应文档在何种状况下能够安全地缓存。可能的值有:public、private 或 no-cache 等。Public 意味着文档是可缓存,Private 意味着文档是单个用户私用文档,且只能存储在私有(非共享)缓存中,no-cache 意味着文档不该被缓存。

Connection

这个头信息指示浏览器是否使用持久 HTTP 链接。值 close 指示浏览器不使用持久 HTTP 链接,值 keep-alive 意味着使用持久链接。

Content-Disposition

这个头信息可让您请求浏览器要求用户以给定名称的文件把响应保存到磁盘。

Content-Encoding

在传输过程当中,这个头信息指定页面的编码方式。

Content-Language

这个头信息表示文档编写所使用的语言。例如,en、en-us、ru 等。

Content-Length

这个头信息指示响应中的字节数。只有当浏览器使用持久(keep-alive)HTTP 链接时才须要这些信息。

Content-Type

这个头信息提供了响应文档的 MIME(Multipurpose Internet Mail Extension)类型。

Expires

这个头信息指定内容过时的时间,在这以后内容再也不被缓存。

Last-Modified

这个头信息指示文档的最后修改时间。而后,客户端能够缓存文件,并在之后的请求中经过 If-Modified-Since 请求头信息提供一个日期。

Location

这个头信息应被包含在全部的带有状态码的响应中。在 300s 内,这会通知浏览器文档的地址。浏览器会自动从新链接到这个位置,并获取新的文档。

Refresh

这个头信息指定浏览器应该如何尽快请求更新的页面。您能够指定页面刷新的秒数。

Retry-After

这个头信息能够与 503(Service Unavailable 服务不可用)响应配合使用,这会告诉客户端多久就能够重复它的请求。

Set-Cookie

这个头信息指定一个与页面关联的 cookie。

 

Servlet应答类是javax.servlet.http.HttpServletResponse类,而Response对象是HTTP应答类的一个实例。Web服务器处理Request对象后会建立Response对象。

Response对象定义了处理建立HTTP信息头的接口。经过这个对象处理cookie,时间戳,HTTP状态码等等。

HTTP应答类的详细状况以下:

序号

方法 & 描述

1

String encodeRedirectURL(String url)
为 sendRedirect 方法中使用的指定的 URL 进行编码,或者若是编码不是必需的,则返回 URL 未改变。

2

String encodeURL(String url)
对包含 session 会话 ID 的指定 URL 进行编码,或者若是编码不是必需的,则返回 URL 未改变。

3

boolean containsHeader(String name)
返回一个布尔值,指示是否已经设置已命名的响应报头。

4

boolean isCommitted()
返回一个布尔值,指示响应是否已经提交。

5

void addCookie(Cookie cookie)
把指定的 cookie 添加到响应。

6

void addDateHeader(String name, long date)
添加一个带有给定的名称和日期值的响应报头。

7

void addHeader(String name, String value)
添加一个带有给定的名称和值的响应报头。

8

void addIntHeader(String name, int value)
添加一个带有给定的名称和整数值的响应报头。

9

void flushBuffer()
强制任何在缓冲区中的内容被写入到客户端。

10

void reset()
清除缓冲区中存在的任何数据,包括状态码和头。

11

void resetBuffer()
清除响应中基础缓冲区的内容,不清除状态码和头。

12

void sendError(int sc)
使用指定的状态码发送错误响应到客户端,并清除缓冲区。

13

void sendError(int sc, String msg)
使用指定的状态发送错误响应到客户端。

14

void sendRedirect(String location)
使用指定的重定向位置 URL 发送临时重定向响应到客户端。

15

void setBufferSize(int size)
为响应主体设置首选的缓冲区大小。

16

void setCharacterEncoding(String charset)
设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。

17

void setContentLength(int len)
设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头。

18

void setContentType(String type)
若是响应还未被提交,设置被发送到客户端的响应的内容类型。

19

void setDateHeader(String name, long date)
设置一个带有给定的名称和日期值的响应报头。

20

void setHeader(String name, String value)
设置一个带有给定的名称和值的响应报头。

21

void setIntHeader(String name, int value)
设置一个带有给定的名称和整数值的响应报头。

22

void setLocale(Locale loc)
若是响应还未被提交,设置响应的区域。

23

void setStatus(int sc)
为该响应设置状态码。

 

修改前面的servlet入门项目”,以下:

image.png 

 

测试:

image.png

相关文章
相关标签/搜索