Servlet的执行流程
1. 从浏览器输入地址(发起请求)开始分析: http://localhost:80/xx/hello
- localhost 也可能是ip 或者域名 ---》定位服务器主机
- 80 定位到tomcat
- xx 上下文路径,tomcat/conf/server.xml 中的
<Context docBase=”F:\workspace\day11-servlet\webapp” path=”xx” /> 中的path
通过上面的步骤找到了 docBase后面的项目的真实路径
根据约定去找到项目中的配置文件 web.xml
2. web.xml内容分析:
- 找到url-pattern的值为 /hello
- 通过上一步中对应servlet-name 找到对应的servlet标签
- 找到对应的Servlet的全限定类名(包名+类名), com.gs.controller.HelloServlet
仅仅是一个字符串而已,交给Tomcat进行处理, 并通过反射来创建对象并调用方法
3. Tomcat对Servlet的创建:
- 通过上获得 servlet的完全限定名为参数使用反射来创建一个对象
Class clz = Class.forName(“com.gs.controller.HelloServlet”)
Clz.newInstance() 要求自己的Servlet类必须有公共的无参数的构造方法,否则会包NoSuchMethodException异常
2.如果是第一次访问,就会创建一个Servlet的对象,并缓存起来
3. 如果是第二次访问 (或者 n 次访问) 直接先从缓存中看有没有,有直接使用调用service方法
<welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <!-- 给servlet可以任意取名,一般类名相同 --> <servlet-name>HelloServlet</servlet-name> <!-- servlet的全限定类名,也就是servlet的位置 --> <servlet-class>com.gs.controller.HelloServlet</servlet-class> </servlet> <servlet-mapping> <!-- 跟上面的servlet名字相同 --> <servlet-name>HelloServlet</servlet-name> <!-- 浏览器通过该url找到servlet,斜杠别丢 --> <url-pattern>/helloServlet</url-pattern> </servlet-mapping>
Servlet的生命周期
javax.servlet.Servlet接口中的方法:
public void init(ServletConfig config): 初始化方法
public void service(ServletRequest req, ServletResponse res):服务方法
public void destroy():销毁方法
public ServletConfig getServletConfig():返回当前Servlet的配置信息对象.
public String getServletInfo():该方法返回Servlet的信息(作者,版权等).
--------------------------------------------------------------------
Servlet的生命周期方法:
public void init(ServletConfig config):初始化方法,在第一次请求时调用,只在最初的时候调用一次.
public void service(ServletRequest req, ServletResponse res):服务方法
public void destroy():销毁方法
Servlet生命周期可分为5个步骤
- 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
- 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
- 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
- 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
- 卸载。当Servlet调用完destroy()方法后,等待 jvm 垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。
细节注意点:
1:构造器先执行,创建Servlet对象:init,service,destory方法,都是非static方法,都得使用对象调用.
2:一个Servlet类在整个生命周期中最多只有一个对象.
3:init在构造器执行之后,立马执行,只执行一次,为对象做初始化操作.
4:service方法在每次请求都会执行.
5:destroy方法只有在正常关闭Tomcat时,才会执行,不要期望该方法一定执行,不要在该方法编写扫尾操作.
6:Servlet类必须使用public修饰,Servlet的构造器,必须是公共无参数的。(上面执行流程提到过)
get方式和post方式有何区别
1. 数据长度上:
- GET方式:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
- POST方式:可以在请求的实体内容中向服务器发送数据,传送的数据量无限制。
2.请求参数的位置上:
- GET方式:请求参数放在URL地址后面,以?的方式来进行拼接
- POST方式:请求参数放在HTTP请求包中
3.用途上:
- GET方式一般用来获取数据,多用于超链接请求,(因为提交的数据在地址栏可见,所以不安全)
- POST方式一般用来提交数据,多用于HTML的表单提交,等用于录入数据,并传递给Web服务器,提交的数据在地址栏不可见,安全。(处理订货表单、在数据库中加入新数据行)