servlet详解
http://blog.csdn.net/TomasEdision/article/details/76059408
https://www.bysocket.com/?p=518
http://www.cnblogs.com/whgk/p/6399262.html
生命周期:
void init(ServletConfig); 出生后(1次)
void service(ServletRequest request, ServletResponse response));每次处理请求时后会被调用
void destroy();临死之前(1次)
特性:
1)单例,一个类只有一个对象,当然可能存在多个Servlet类
Servlet是单例吗?
不一定是,在一个ServeltName情况下是的。在多个ServletName匹配到一个Servlet类时,该Servlet不是单例。
2)线程非安全的,所以效率是高的
3)Servlet类由我们写,但是对象是由服务器(tomcat)创建,并且由服务器调用相应的方法
Servlet中的方法大多数不由我们来调用,而是由Tomcat来调用。并且Servlet的对象也不由我们来创建,由Tomcat来创建!
操作:
在Serlet中分为三个步骤:接受请求数据; 处理请求; 完成响应
作用: 获取并针对Web客户端的请求作出响应
实现Servlet的方式:(由我们自己来写!)
1)实现javax.servlet.Servlet接口;
2)继承javax.servlet.GenericServlet类;
3)继承javax.servlet.http.HttpServlet类;
在web.xml中配置Servlet的目的其实只有一个,就是把访问路径与一个Servlet绑定到一起,
『 根据第一天老师讲的串联起来的流程
Selevet出生:
查找:客户端首次访问服务器网址时,服务器通过查找本地文件web.xml中的“url-pattern”找到了绑定的相应映射的.java程序,
编译:然后服务器查看Servlet对象是否创建,如果没有,那么服务器才会通过反射来创建HelloServlet的实例(请记住,Servlet出生后马上就会调用init()方法,而且一个Servlet的一生。这个方法只会被调用一次,我们可以把一些对Servlet的初始化工作放到init方法中!);在服务器编译之后,把.class文件存入classes中
Servlet服务:
服务器调用Servlet类的service( )方法(service()方法是会被调用多次的),子类覆写doget/都post方法
Servlet的离去:
在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中
会调用destroy函数第一种就是关闭tomcat,第二种就是web应用reload,第三种情况就是关机
』
Servlet工作流程描述
(1)首先用户在浏览器地址栏输入网址http://localhost:8080/sgrweb/MyFirstServlet时候,浏览器会自己先解析主机名localhost,回去本地的host文件去查询主机有没有配备一个ip地址如果在host文件当中查不到的话浏览器会去dns查询。首先localhost代表的是主机,8080代表的是端口号,sgrweb代表的是web应用名称,最后的MyFirstServlet代表资源名称
(2)查到主机的ip地址之后就会转到web服务器去了。首先浏览器会先向web服务器发送一个试探包(尝试连接),如果web服务器对浏览器有响应的话,浏览器就会发出http请求。web服务器收到浏览器发出的http请求之后它会自己先解析出主机名(因为tomcat管理多个主机),然后解析出web应用。web服务器解析出web应用之后就会知道对应web应用的web.xml文件,因为我们知道每一个web应用都对应一个web.xml文件。最后web服务器解析出资源名称这里就是MyFirstServlet。
(3)完成之后web服务器去查询对应web应用的web.xml文件得知资源(MyFirstServlet)在哪一个包下面。具体web.xml关键代码如下:
- <servlet>
- <servlet-name>MyFirstServlet</servlet-name>
- <servlet-class>com.sgrweb.MyFirstServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>MyFirstServlet</servlet-name>
- <url-pattern>/MyFirstServlet</url-pattern>
- </servlet-mapping>
从下往上找。
(4)成功之后就会找到相应的Servlet了。然后web服务器就会使用反射机制,创建实例。调用init()方法将该实例装载到内存,该方法只被调用一次。web服务器把接收到的http请求封装成一个Request对象,作为service函数的参数传递进去。service函数会被调用多次,每访问一次Servlet,它的service函数就会被调用一次
(5)要返回结果给web服务器的话需要获取response对象,该对象有各种信息。web服务器获取到结果之后不是直接返回给浏览器而是先将response的信息拆解出来
形成http响应格式。然后将这个结果返回给浏览器。
(6)浏览器得到结果之后会自己能识别的格式进行解析。
(7)当在某些情况下(主要有三种)web服务器会调用该Servlet的destroy函数,将该Servlet销毁。
5 – Tomcat Server处理一个http请求的过程
http://www.cnblogs.com/duanxz/p/5264029.html
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为”"的Context去处理)
7) path=”/wsota”的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser

浙公网安备 33010602011771号