下面的内容都是基础的Servlet知识,如果你想打好基础,就别急着学习JSP,而是从Servlet开始学习。因为JSP页面最终会被转译为Servlet,掌握了Servlet,JSP也就学会了一半,而且在写JSP页面时也能更准确地定位错误。
开发环境的搭建我就不说了,百度一搜一大堆,说一下我的开发环境:MyEclipse + Tomcat 7.0 + JDK 7
编写一个基本的Servlet
我们使用最原始的方式编写一个Servlet,首先遇到建一个类,然后继承HttpServlet,并实现其中的某些方法。HttpServlet位于servlet-api.jar中,这个jar包是大名鼎鼎的web容器——Tomcat提供的,我们来看一下jar包里有啥:
下面是核心的类关系图:
通过这个类关系图我们知道,Servlet接口定义了基本行为,例如与Servlet生命周期有关的init()、destroy(),以及提供服务时调用的service()方法;然后抽象类GenericServlet实现了Servlet接口、ServletConfig接口,将容器调用init()方法时传入的ServletConfig实例封装起来,而service()方法直接标示为abstract而没有任何实现。
我们注意到GenericServlet没有规范任何有关HTTP的相关方法,而是由继承它的HttpServlet来定义,这也容易理解,因为不只有HTTP一种协议,还有FTP等其它协议。然后HttpServlet里面实现了service()方法,判断HTTP的请求方式并交给doGet、doPost等方法去处理,所以我们要在继承HttpServlet类时需要重写doGet或doPost方法。
在web.xml中注册Servlet程序
这是最传统的方式,首先我们需要写一个类并继承HttpServlet,重写相应的方法后,打开web.xml注册该Servlet,下面是一个注册Servlet的例子:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet> <description>该Servlet的描述信息</description> <display-name>显示的名称</display-name> <servlet-name>SimpleServlet</servlet-name> <servlet-class>com.web.SimpleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SimpleServlet</servlet-name> <url-pattern>/servlet/SimpleServlet</url-pattern> </servlet-mapping> </web-app>
上面注册的意思是,用户可以通过”../servlet/SimpleServlet.view”来请求该Servlet,web容器会将该Servlet请求交给名称为SimpleServlet(由<servlet-name>匹配)的Servlet来处理,该Servlet对应的类是com.web.SimpleServlet。具体流程如下图所示:
这里需要注意的一点是,当应用程序启动后,默认情况下不会创建所有的Servlet实例。当这个Servlet第一次被请求时,他会被Web容器转译为Servlet并编译为.class文件,存放在指定目录中(具体啥目录由Web容器决定),并创建相应的实例,这个过程叫做Servlet的初始化;若以后再请求该Servlet,则不会触发转译和编译操作。如果想在应用程序启动时就进行编译和转译的操作,需要在web.xml中的<servlet>标签中,指定<load-on-startup>的值大于0(小于等于0为不随程序启动而初始化),其值的大小决定了初始化的顺序。
使用@WebServlet注册Servlet程序
在Servlet 3.0中,可以使用标注(Annotation)来告诉web容器哪些是需要注册的servlet,例如下面的例子:
这个例子等同于在web.xml中这样配置:
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.web.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello.view</url-pattern> </servlet-mapping>
我们看到使用标注的形式比使用web.xml配置servlet简单多了,除此之外,@WebSevlet还可以配置name, urlPatterns(默认), loadOnStartup等,能在web.xml中配置的,使用@WebServlet也能配置。
虽然使用web.xml方式比较麻烦,但是web.xml中的配置会覆盖@WebServlet标注的配置,所以我们可以使用@WebServlet来作为默认值,然后使用web.xml方式作为日后更改设置值使用。
Servlet高级配置和部署,放在以后时机合适了再讲吧!