使用STS4新建一个空的POM项目:html
(1)建立包com.edisonjava
(2)建立类ServletTest,继承自HttpServlet,代码以下:web
(3)使用mvn compile编译数据库
(4)到本项目的target目录下数组
拷贝classes目录到tomcat的webapps\ROOT\WEB-INF目录下:
浏览器
(5)打开这个目录下的web.xml,并增长以下几行(阴影部分):缓存
(6)到tomcat的bin目录下,执行startup.battomcat
(7)使用浏览器测试:安全
Java Servlet 是运行在 HTTP Server或应用服务器(例如:Tomcat)上的程序,它是做为来自 Web browser和 HTTP server应用程序之间的中间层。服务器
Servlet收集来自网页表单的用户输入,呈现来自数据库或者其余源的记录,还能够动态建立网页,这些功能和 CGI(Common Gateway Interface,公共网关接口)程序相同。
相比于 CGI,Servlet更容易开发,还有以下特色:
l Servlet 在 Web 服务器的地址空间内执行。
l Servlet 用 Java 编写。
l Java 安全管理器能保护Servlet。
l Java 类库能支撑 Servlet。
JAVA Web开发框架大部分都是创建在Servlet基础之上的,好比Structs和Spring MVC,前者的ActionServlet和后者的DispatcherServlet都是Servlet。
Servlet是处理web请求的基本单元,而Filter则是围绕着Servlet,用于在web请求被处理以前或者以后对web请求(Request)和应答(Response)修改,Filter工做机制以下图:
Servlet Filter 具备以下特色:
l Filter既能够做用于Servlet以前、又能够做用于Servlet以后。而Spring Security做用于Servlet以前
l Filter在Request到达Servlet以前,能够直接将Response返回,此功能用于诸如在未登陆的状况下直接向用户展现登陆页面这样的功能。
l 多个Filter起做用时有前后顺序。
Servlet依赖环境包括Web服务器(应用服务器、容器)、servlet规范、JSP规范。
Java Servlet 运行在带有支持 Java Servlet 规范的Web服务器或者容器上,而Tomcat就是一种支持servlet容器功能的应用服务器。
Servlet须要 javax.servlet 和 javax.servlet.http 包支持。
Servlet必须符合Java Servlet 规范和 JSP 规范,不一样容器实现的规范版本不一样。
Servlet用于替代CGI,所以具备CGI相似的功能:
l 获取浏览器上传的用户数据,例如网页上的 HTML 表单(也能够是来自 applet 或自定义的 HTTP 客户端程序的表单)。
l 获取浏览器上传的HTTP请求数据,包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
l 处理这些上行数据并生成结果,包括访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务。
l 下发用户响应数据到浏览器,例如文本文件(HTML 、XML、JSON)、图片、流媒体等。
l 下发 HTTP响应数据到浏览器,包括返回文档类型(例如 HTML),设置 cookies 和缓存参数,以及其余相似的任务。
Servlet 生命周期是从建立直到毁灭的整个过程,过程包括:
l init () 方法:初始化,只调用一次。
l service() 方法:处理客户端的请求,每收到一次请求,服务器新产生一个线程来处理。
l destroy() 方法: 终止,只调用一次。
l 垃圾回收:JVM 的垃圾回收器负责最后的垃圾回收。
生命周期示意图以下:
service() 方法能够调用的HTTP请求方法:
l doGet() 方法
对应HTTP GET 请求,来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单:
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码}
l doPost() 方法
对应HTTP POST 请求,来自于一个特别指定了 METHOD 为 POST 的 HTML 表单:
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码}
HTTP(HyperText Transfer Protocol超文本传输协议),是WWW(World Wide Web,万维网)的传输协议,是TCP/IP模型的应用层协议,负责Web浏览器和Web服务器之间传输超文本信息(Hypertext),超文本信息能够描述超媒体( Hypermedia),而超媒体包括文本、图形、视频、音频等多媒体(Multimedia)信息,这些信息以web页面(Web Page)为单位,他们之间经过超连接(Hyperlink)相互链接。
HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行做为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP1.0采用普通交互流程,屡次交互才能完成信息传输,以下:
(1)Web浏览器链接到Web服务器
Web浏览器与Web服务器的HTTP端口(默认为80)创建一个TCP套接字链接。
(2)发送HTTP请求
经过TCP套接字,Web浏览器向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据等组成。
(3)Web服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。Web服务器将资源复本写到TCP套接字,由Web浏览器读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
(4)释放链接TCP链接
若链接模式为close,则Web服务器主动关闭TCP链接,Web浏览器释放TCP链接;若链接模式为keepalive,则该链接会保持一段时间,在该时间内能够继续接收请求;
(5)Web浏览器解析HTML内容
Web浏览器首先解析状态行,查看代表请求是否成功的状态代码。而后解析每个响应头,响应头告知如下为若干字节的HTML文档和文档的字符集。Web浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在Web浏览器窗口中显示。
HTTP1.1采用持久链接(HTTP Persistent Connections),也称为 HTTP keep-alive 或 HTTP connection reuse,只要任意一端没有明确提出断开链接,则保持TCP链接状态,其交互流程以下:
上图的“客户端”实际上就是Web浏览器,或者定制的特殊Web浏览器,上图的“服务器”就是Web服务器,“创建TCP链接”包括三个子步骤,“断开TCP链接”包括四个子步骤。
持久链接使得多数请求以管线化(pipelining)方式发送成为可能,HTTP1.1支持管线化传输。管线化技术支持并行发送多个请求。以下图:
HTTPS在HTTP基础上增长了数字签名和非对称加解密功能,其交互图以下:
HTTP报文包括请求报文和响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成。而响应报文由状态行、响应头部、空行和响应体四个部分组成。下图是一个具体HTTP报文例子:
HTTP请求类型包括:
HTTP状态码包括:
在HTTP/1.1种规定了47种首部字段(图表参考《图解HTTP》):
(1)通用首部字段
(2)请求首部字段
(3)响应首部字段
(4)实体首部字段
(5)其余首部字段
Cookie、Set-Cookie、Content-Disposition、Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade etc...
这里提供GET和POST表单请求的例子,步骤以下:
(1)新建web项目
使用STS4建立Dynamic Web新项目:
下一步以下:
点“New Runtime”:
选择Tomcat7,而后Next,再点击Browse选择tomcat安装目录:
选择目录后回到先前的界面,而后再选择JRE:
而后选择两次Next,以下:
点finish。到左边的Project Explorer:
选中src,右键菜单new-->servlet,进入以下界面:
填写包和类名后,两次next后:
点Finish。生成TestPostMethod.java文件,内容以下:
修改doGet,以下:
修改doPost,以下:
在Project Explorer的web content目录下新建目录:HTML。而后,选中HTML,右键菜单new-->html file,弹出“New HTML File”窗口,在File Name中填写:index.htm,以下:
点Finish。Index.html代码以下:
修改成:
选中WEB-INF目录,右键菜单new-->
点Next,以下:
在File Name中,输入web.xml,点Finish。Web.xml内容为:
修改成:
(2)构建和测试
选中项目,右键菜单Run As-->Run on Server:
点Finish。
这时候,STS4在右上角自动显示首页:
在上面输入:google和www.google.com,点提交:
返回后再下面选中物理,点“选择学科”:
过程当中遇到一个问题:
[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TestPost' did not find a matching property.
解决:在STS4的右下角,选中Server,再选中Tomcat,以下图:
而后,右键菜单Open,在右上角窗口,把“Publish module contexts to separate XML files”打钩,以下:
关闭并保存。
Servlet请求类是javax.servlet.http.HttpServletRequest。
每当Web浏览器请求一个页面时,Web服务器就会产生一个新的request对象来表明这个请求。 request对象提供了一系列方法来获取HTTP请求头,包括表单数据,cookies,HTTP方法等等。
经常使用的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() |
2 |
Enumeration getAttributeNames() |
3 |
Enumeration getHeaderNames() |
4 |
Enumeration getParameterNames() |
5 |
HttpSession getSession() |
6 |
HttpSession getSession(boolean create) |
7 |
Locale getLocale() |
8 |
Object getAttribute(String name) |
9 |
ServletInputStream getInputStream() |
10 |
String getAuthType() |
11 |
String getCharacterEncoding() |
12 |
String getContentType() |
13 |
String getContextPath() |
14 |
String getHeader(String name) |
15 |
String getMethod() |
16 |
String getParameter(String name) |
17 |
String getPathInfo() |
18 |
String getProtocol() |
19 |
String getQueryString() |
20 |
String getRemoteAddr() |
21 |
String getRemoteHost() |
22 |
String getRemoteUser() |
23 |
String getRequestURI() |
24 |
String getRequestedSessionId() |
25 |
String getServletPath() |
26 |
String[] getParameterValues(String name) |
27 |
boolean isSecure() |
28 |
int getContentLength() |
29 |
int getIntHeader(String name) |
30 |
int getServerPort() |
31 |
int getParameterMap() |
修改前面的“servlet入门项目”,以下:
测试:
Web服务器处理Servlet请求后向Web浏览器发送Servlet应答消息,设置HTTP状态和向WEB浏览器发送数据,如Cookie、HTTP文件头信息等。
经常使用的应答头信息以下:
头信息 |
描述 |
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) |
2 |
String encodeURL(String url) |
3 |
boolean containsHeader(String name) |
4 |
boolean isCommitted() |
5 |
void addCookie(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) |
15 |
void setBufferSize(int size) |
16 |
void setCharacterEncoding(String charset) |
17 |
void setContentLength(int len) |
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入门项目”,以下:
测试: