一、servlet简单介绍
是由sun公司制订的一种用来扩展web服务器功能的组件规范。
(1)扩展web服务器功能
当请求到达web服务器(apache提供的webserver,微软的iis)时,这些web服务器只能够处理静态资源(即需要事先将html文件写好,并且保存到服务器特定的文件夹下面)的请求,如果是一个动态资源(需要计算,然后动态生成相应的html)的请求,web服务器不能够处理,需要扩展其功能。
(2)组件
1)什么是组件?
符合特定的规范,并且实现了部分功能的,可以单独部署的软件模块。
2)什么是容器?
符合特定的规范,并且提供组件的运行环境的程序。
3)serlvet容器是什么?
servlet就是一个组件,需要部署到servlet容器才能运行。 比如Apache
二、开发一个servlet
step1,先写一个java类,实现Servlet接口或者继承HttpServlet抽象类。
step2,编译
step3,打包
即需要建立一个具有如下结构的文件夹
appname(应用名称)
WEB-INF
classes(放.class文件)
lib(可选,放.jar文件)
web.xml(描述文件)
step4,部署
将step3生成的整个文件夹拷贝到容器特定的文件夹底下,比如,tomcat容器对应的是webapps。
另外,也可以使用jar命令将step3生成的整个文件夹压缩(.war)。
step5, 访问
http://ip:port/appname/url-pattern
注:使用myeclipse来开发servlet(略)
三、servlet是如何运行的?
比如,在浏览器地址栏输入http://ip:port/web01/greeting
step1, 浏览器依据ip,port建立与服务器之间的连接。
step2,浏览器将请求数据打包(按照http协议)。
step3,浏览器发送请求。
step4,服务器解析请求数据包,将解析的结果写到request对象上(为了方便servlet读取请求数据)。同时,服务器还会创建一个response对象(为了方便servlet输出处理的结果)。
step5, 服务器依据请求资源路径(/web01/greeting) 找到应用所在的文件夹,并且依据"/greeting"找到对应的servlet类名。接下来要创建servlet对象。
step6, 服务器要调用servlet的service方法,会将事先创建好的request,response对象作为参数传递进来。所以,可以通过request对象获得请求数据,也可以通过response对象输出处理的结果。
step7,服务器通过response对象获得处理结果,然后将处理结果打包,发送给浏览器。
step8,浏览器解析服务器返回的处理结果,然后生成相应的界面。
图示
小知识点:
第三步浏览器发送请求有get方式和post方式两种:
1)哪一些情况下,浏览器使用get方式发请求:
a,直接在浏览器地址栏输入某个地址
b,点击链接
c,表单默认的提交方式
2)get请求的特点
a,如果有请求参数,会将这些参数添加在请求资源路径的后面(所以,get方式能够提交的参数大小有限制)。
b,get方式还会将请求参数显示在浏览器地址栏,不安全。
3)哪一些情况下,浏览器会使用post方式发请求:
只有一种方式:设置了表单的method="post"。
4)post请求的特点
a,请求参数会添加到实体内容里面,参数大小没有限制。
b,请求参数不会显示在浏览器地址栏,相对安全(并不会对请求参数加密)。
第五步的时候,servlet容器(web服务器,比如tomcat)如何处理请求资源路径?
比如,我们在浏览器地址栏输入:http://ip:port/web01/abc.html,则"/web01/abc.html"为请求资源路径。
step1, 容器依据应用名("/web01")找到应用所在的文件夹。
step2, 容器会假设这是一个servlet,会匹配web.xml配置文件里面的url-pattern:
精确匹配: 要求url-pattern必须是"/abc.html"。
通配符匹配: 使用"*"来代替任意的零个、一个或者多个字符。
比如 <url-pattern>/*</url-pattern>
后缀匹配:使用"*."开头,接一个任意的字符串。
比如 <url-pattern>*.do</url-pattern>
以上会匹配所有以".do"结尾的请求。
(优先级:精确匹配>通配符匹配>后缀匹配)
step3,如果以上匹配均不成功,容器会认为这是一个资源文件(比如是一个html文件),然后查找相应的资源文件,如果找到则返回,找不到返回404。