文章目录
Servlet的基本概念
什么是Servlet?
Servlet是运行在服务端的java小程序,是由Sun公司提供的一个接口。
基本功能?
Servlet用来处理客户端发送来的请求,并根据请求处理这些请求并相应给浏览器的一组动态资源。
实质
就是 java代码,通过javaAPI动态向客户端输出内容。
Servlet的五大方法
生命周期方法
1.void init(ServletConfig var1)
- 调用时间:当Servlet对象被服务器创建之后。
- 调用者:服务器调用。
- 调用次数:仅被调用一次。
2.void service(ServletRequest var1, ServletResponse var2)
- 调用时期:每次处理请求时都会调用一次。
- 调用次数:可以调用多次。
3.void destroy()
- 调用时间:服务器关闭连接之前调用。
- 调用次数:仅调用一次。
【注意】
理解init()和destory()方法时可以这样理解:
将Servlet的生命周期形象地理解成一个人的生命历程,init()方法就相当是这个Servlet对象出生之后被调用的;而destory()方法就是相当于这个对象临死之前被调用的。
其他方法
1.ServletConfig getServletConfig()
返回ServletConfig对象(配置信息)
2.String getServletInfo();
返回有关Servlet的信息
Servlet执行的完整过程
概述:
Servlet执行的完整过程大致可以总结为:浏览器请求–>服务器创建对象–>执行init()方法–>调用service()方法–>向浏览器做出相应。
浏览器请求
!当浏览器访问Servlet的路径时,并不是直接执行Servlet对应的类的,而是先去web.xml文件中去找这个路径,这个访问过程为:
根据url-pattern–>找到Servlet对应的name–>最后找到其对应的class类。
服务器创建对象
服务器通过解析Servlet的路径并找到其对应的class类之后,就会创建一个Servlet对象,同时也创建了servletConfig,里面存放了一些初始化信息。(注意服务器只会创建一次servlet对象,所以servletConfig也只有一个)
执行init()方法
1.对象创建好之后,首先要执行init方法,但是我们发现我们自定义类下没有init方法,所以程序会到其父类HttpServlet里找
2.我们发现HttpServlet里也没有init方法,所以继续向上找,既向其父类GenericServlet中继续寻找,在GenericServlet中我们发现了init方法,则执行init方法(对接口Servlet中的init方法进行了重写)
注意:
在GenericServlet中执行public void init(ServletConfig config)方法的时候,又调用了自己无惨无方法体的init()方法,其目的是为了方便开发者,如果开发者在初始化的过程中需要实现一些功能,可以重写此方法。
调用service()方法
接着,服务器会先创建两个对象:ServletRequest请求对象和ServletResponse响应对象,用来封装浏览器的请求数据和封装向浏览器的响应数据。
1.接着服务器会默认在我们写的类里寻找service(ServletRequest req, ServletResponse res)方法,但是DemoServlet中不存在,那么会到其父类中寻找。
2.到父类HttpServlet中发现有此方法,则直接调用此方法,并将之前创建好的两个对象传入。
3.然后将传入的两个参数强转,并调用HttpServlet下的另外个service方法。
4.接着执行service(HttpServletRequest req, HttpServletResponse resp)方法,在此方法内部进行了判断请求方式,并执行doGet和doPost,但是doGet和doPost方法已经被我们自己重写了,所以会执行我们重写的方法。
为什么不直接重写service方法?
因为如果重写service方法的话,我们需要将两个对象自己进行强转,以及一系列的安全保护判断重新写一遍,会存在安全隐患。
向浏览器做出相应
最后处理完数据后,将数据响应到浏览器。
【注意】
为什么HttpServlet是一个抽象类,但是在这个类中却没有抽象方法?
理解一:
如果HttpServlet不是抽象类的话,就可以产生Httpser对象,但是单纯的HttpServlet对象时不能处理任何业务逻辑的,里边方法没有功能;所以要定义成抽象类,防止创建对象。
但是继承了HttpServlet类创建servlet就方便多了,你要根据自己需要然后重写需要的方法,让后自定义逻辑,这样就方便多了。