servlet初探
一、什么是servlet
servlet是服务端小程序。
访问某个网页,需要输入url,根据url定位到服务器,然后找到相对应的资源。即请求服务器,服务器接到请求,根据url,调用相对应的java类,进行一系列操作,响应给浏览器访问结果。
而这个java类,是放在web容器里的,比如说Tomcat。那么并不是所有java类都可以被Tomcat识别,并且调用。只有符合一定接口的java类才行。这个java类就叫做servlet。
其实servlet是一个接口。
二、servlet的生命周期
Tomcat作为一个web容器,存放了大量的servlet,对他进行生命周期管理。如下图servlet接口有init ,getServletConfig,service,getServletInfo,destroy五个方法。
都是供Tomcat调用。其中service是最重要的,每次访问servlet,都会调用该方法。init方法只会调用一次,根据servlet配置,有第一次访问servlet时调用,或者服务
器启动时调用。(load-on-startup)destroy方法时在服务器正常关闭前调用,用来销毁对象的。另外两个方法时访问servlet配置。由于init方法只调用一次,所以servlet
在Tomcat容器中是单例存在的,因此,就会有多线程访问问题。所以,一般不要在servlet中定义全局的变量,会导致多线程问题。常量没关系。所以一般不要用jsp的 <%!%>
脚本。而service是方法,不存在多线程问题。
三、servlet配置
有两种配置。
第一是web.xml中配置
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.itcast.web.ServletDemo1</servlet-class>
<!-- 配置servlet启动时机,小于0为访问时调用init,大于等于0为启动服务器时调用init-->
<load-on-startup></load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/abc</url-pattern>
</servlet-mapping>
第二种配置是3.1版本以后,注解
@WebServlet("/demo1")
四、servlet运行原理
浏览器根据url的ip地址,访问到服务器,根据端口号,访问到具体的服务器程序。根据资源地址,去web.xml中找url-pattern,找到对应的servlet,如果是第一次调用,然后
再servlet中找到该类的全限定名。然后Tomcat容器通过反射的方法,forName,newInstance,反射出servlet类。,
调用init方法初始化类,然后根据访问类型,执行具体操作。这些都是Tomcat的工作。servlet只是写好去干什么。
五 具体使用
可以自定义java类,然后继承servlet接口(implements)。重载五个方法。但是一般不用,因为只需要写service方法,其他四个方法一般默认,所以这么写有点麻烦
然后也可以直接继承genericServlet抽象类(extends),这个抽象类继承了servlet接口,并且重载了四个方法,我们只需要重载service方法即可。但是依旧有些麻烦,因为还需要区分访问
类型,根据不同的类型去写不同的方法。
最后直接继承HttpServlet抽象类(extends) ,该类直接将service方法写好,并且有doget,dopost抽象方法。我么直接重载这两个方法即可
最后,因为servlet没有内置对象,除了request和response以外都需要自己创建,并且输出、html都需要输出流,非常麻烦,而且需要程序员写,ui工作人员配合非常麻烦,因此
一般都用jsp,而servlet只用作控制器,与界面相关的都交给jsp来做。