Servlet简介

一、Servlet简介


Servlet是Server与Applet的缩写,是服务端小程序的意思。是SUN公司提供的一门用于开发动态Web资源的技术。注意,他是一门技术,不是协议、开发规范什么的东西。

Servlet本质上也是Java类,但要遵循Servlet规范进行编写,没有main()方法,它的创建、使用、销毁都由Servlet容器进行管理(如Tomcat)。

Servlet是和HTTP协议是紧密联系的,其可以处理HTTP协议相关的所有内容。这也是Servlet应用广泛的原因之一。

提供了Servlet功能的服务器,叫做Servlet容器,其常见容器有很多,如Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss等。

二、Servlet工作原理解析


1、 一个http请求的执行过程:servlet会运行的前提是有http请求,当一个http过来时(如: http://localhost:8080/xxx),根据web.xml文件的配置,找到url-pattern 对应的 servlet-mapping,读取servlet-mapping中servlet-name的值 ,找到servlet-name对应的servlet-class,找到该class并加载执行该class;

2、servlet执行过程:servlet程序由web服务器调用,当收到请求后,检查是否已装载并创建了该servlet对象,如果没有则加载创建。调用servlet的init()方法初始化实例,调用service()方法,处理请求并返回响应结果。在服务器被停止或者重启之前,调用destory()方法释放资源;

3、servlet接口实现类:Sun公司定义了两个实现类,GenerricServlet和HttpServlet,其中后者是前者的子类,它在原有基础上添加了一些HTTP协议处理方法,它比GenerricServlet功能更强大,所以我们一般将自己的类继承自HttpServlet,并重写doGet方法和doPost方法,不需要重写Service方法。

4、servlet的一些细节

4.1、由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序弱项被外界访问,必须把Servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用servlet元素和servlet-mapping元素完成(在Servlet3.0规范的新特性中,该功能可以使用注解完成,不要求必须使用web.xml,只用注解更简单,该特性会在后文进行详细讲解)。

servlet元素用于注册Servlet,它包含两个主要的子元素:servlet-name和servlet-class,分别用于设置Servlet的注册名称和Servlet的完整类名。

servlet-mapping元素用于映射一个已注册的Servlet的一个对外访问路径,它包含两个子元素:servlet-name和url-pattern,分别用于指定Servlet的注册名称和Servlet的对外访问路径。

<web-app>
    <servlet>
        <servlet-name>AnyName</servlet-name><!--自定义的逻辑名-->
        <servlet-class>HelloServlet</servlet-class><!--Servlet对应类的全类名-->
    </servlet>
    <servlet-mapping>
        <servlet-name>AnyName</servlet-name><!--上面定义的逻辑名-->
        <url-pattern>/demo/hello.html</url-pattern><!--匹配的URL-->
    </servlet-mapping>
</web-app>

4.2、同一个Servlet可以被映射到多个URL上,即多个servlet-mapping元素的servlet-name子元素的设置值可以是同一个Servlet的注册名。

在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式:一种是“.扩展名”。另一种是以(/)开头并以(/*)结尾。

<!--方式一用于匹配所有某一扩展名的文件-->
<servlet-mapping>
    <servlet-name>AnyName</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--方式二用于匹配某一文件夹下的所有文件-->
<servlet-mapping>
    <servlet-name>AnyName</servlet-name>
    <url-pattern>/action/*</url-pattern>
</servlet-mapping>

4.3、如果某个Servlet的映射路径只有一个(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。

凡是在web.xml文件中找不到匹配的servlet-mapping元素的URL,它们的请求访问都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

在tomcat的安装目录/conf/web.xml中,注册了一个名称org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为缺省Servlet。

当访问Tomcat服务器中的某个静态HTML文件或图片等资源时,实际上是在访问这个缺省Servlet。

5、servlet的生命周期
servlet没有main方法,不能独立运行,他的运行完全由servlet引擎来控制和调度。

针对客户端的多次servlet请求,通常情况下,服务器只会在第一次请求的时候创建一个servlet对象,并驻留在内存中,为后续的其他请求提供服务,直至web容器退出,servlet实例对象才会销毁。

在Servlet的整个生命周期内,Servlet的init()方法只被调用一次,而对于每一个请求都会调用一次Servlet的service()方法service根据请求方式调用doGet或doPost方法。

如果在servlet元素中配置了一个load-on-startup元素,那么WEB应用程序在启动时,就会装载并创建实例对象、以及调用Servlet实例对象的init()方法。可以在启动的时候为整个WEB应用创建一些必要的资源或连接。但如果所有的Servlet都启动加载,则会大大增加服务器负担,而且有些Servlet永远也不会被客户访问到,白白浪费资源,所以从性能角度,应合理利用该特性。

<servlet>
    <servlet-name>invoker</servlet-name>
    <servlet-class>
            org.apache.catalina.servlets.InvokerServlet
    </servlet-class>
    <load-on-startup>2</load-on-startup><!--数字表示启动加载的优先级,大于0-->
</servlet>

6、ServletConfig对象

在Servlet的配置文件中,可以使用一个或多个init-param标签为Servlet配置一些初始化参数。

当Servlet配置了初始化参数后,web容器在创建Servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用Servlet的init方法时,将ServletConfig对象传似给Servlet,开发者可以通过ServletConfig对象得到初始化参数信息。

7、ServletContext对象

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的Servlet对象,它代表当前web应用。

ServletConfig对象中维护了ServletContext对象的引用,开发者在编写Servlet是可以通过ServletConfig.getServletContext方法获得该对象。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为Context域对象。(难道这就是上下文?)

多个Servlet通过ServletContext对象实现数据共享。要确保注意线程安全。

可以通过ServletContext对象获取WEB应用的初始化参数。

可以实现Servlet的转发。getRequestDispatcher()方法

8、Servlet常用容器Tomcat(左图:Tomcat容器;右图:Servlet的执行流程)
在这里插入图片描述
9、Servlet体系结构

在这里插入图片描述
从上图可以看出Servlet规范是基于这几个类运转的,与Servlet主动关联的是三个类:ServletConfig、ServletRequest、ServletResponse。这三个类都是通过容器传递给Servlet的。

ServletConfig接口中的方法都是为了获取这个Servlet的一些配置属性,而这些配置属性可能在Servlet运行时被用到。

ServletContext就是这些配置属性的上下文环境。

三、Servlet中的Session与Cookie


servlet能给我们提供两部分的数据,一个是在servlet初始化的时候调用init方法设置的ServletConfig,它基本包含了Servlet本身和Servlet所运行的Servlet容器中的基本信息。另一个是ServletRequest提供的这次请求的HTTP协议信息,这部分需要很清楚HTTP协议。

Session与Cookie的作用都是为了保持访问用户与后端服务器的交互状态,各有优缺点。然而具有讽刺意味的是它们优点和它们的使用场景又是矛盾的,例如使用 Cookie 来传递信息时,随着 Cookie 个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如 Cookie 占用 200 个字节,如果一天的 PV 有几亿的时候,它要占用多少带宽。所以大访问量的时候希望用 Session,但是 Session 的致命弱点是不容易在多台服务器之间共享,所以这也限制了 Session 的使用。

Session正常工作的实现方式:
基于URL Path Parameter,默认支持
基于Cookie,若不修改Context中的cookie标识,默认支持
基于SSL,默认不支持,只有connector.getAttribute(“SSLEnabled”)为true时才支持。

四、Servlet中的Listener

整个Tomcat服务器中Listener使用的非常广泛,它是基于观察者模式的,Listener的设计对开发Servlet应用程序提供了一种快捷的手段,能够方便的从另一个纵向维度控制程序和数据,目前Servlet中提供了5中两类事件的观察者接口,他们分别是:4个EventListener类型的,ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener 和 2 个 LifecycleListeners 类型的,ServletContextListener、HttpSessionListener

它们基本上涵盖了整个Servlet生命周期中,你感兴趣的每种事件,这些Listener的实现类可以配置在web.xml中的标签中,当然也可以在应用程序中动态添加Listener,但是ServletContextListener在容器启动之后就不能再添加新的,因为它监听的事件已经不会再出现。掌握这些Listener的使用,能够让我们的程序设计的更加灵活。

五、Servlet3.0新特性注解

前面介绍过Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署描述。
开发者可以使用@WebServlet注解将一个继承于javax.servlet.http.HttpServlet的类标注为可以处理用户请求的Servlet。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值