Servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
Servlet也是一组API,定义在java.servlet包下。
Servlet容器
Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。
Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器。
更通俗的理解是Servlet容器是能够解释和运行Servlet代码的工具。
目前最流行的Servlet容器主要有:
- Tomcat
- Resin
- J2EE服务器(如Weblogic)中也提供了内置的Servlet容器
Tomcat
Tomcat 是一个免费的开放源代码的 Servlet 容器,它是 Apache 软件基金会的一个顶级项目,由 Apache、Sun和其他一些公司及个人共同开发而成。由于有了 Sun 的参与与支持,最新的 Servlet 和 JSP 规范总是能在 Tomcat 中的到体现。
第一个Servlet
step1:写一个Java类,实现Servlet接口,重写所有方法,其中service方法是每次请求servlet都会执行的逻辑。
Java代码:
public class HelloServlet implements Servlet{
@Override
public void destroy() {}
@Override
public ServletConfig getServletConfig() { return null;}
@Override
public String getServletInfo() { return null;}
@Override
public void init(ServletConfig config) throws ServletException {}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Hello,Servlet...");
}
}
step2:在web.xml配置servlet信息:
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.study.web.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
step3:启动tomcat服务器,在浏览器地址栏输入http://localhost:8080/{你的web工程名称}/hello访问。
Servlet响应过程
用户通过浏览器发起的http请求会根据IP地址[域名也是通过DNS解析为一个网络上的IP地址]找到网络上的某一台主机,如果这台服务器在8080端口开启了tomcat,那么它将做为服务器的角色响应用户发起的指向它的http请求;用户发起的http请求到达某一台tomcat以后,tomcat将根据请求url在web.xml中根据url-pattern找到对应的Servlet;
- Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步;
- 装载并创建该Servlet的一个实例对象:调用该 Servlet 的构造器;
- 调用Servlet实例对象的init()方法;
- 创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去;
- WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
Servlet的注册和运行
- Servlet程序必须通过Servlet容器来启动运行,并且储存目录有特殊要求,通常需要存储在WebContent\WEB-INF\classes\目录中,Eclipse等IDE会自动把编译后的字节码文件映射到这个目录下。
- Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。
- 一个<servlet>元素用于注册一个Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名,这个相当于告诉Servlet容器要实例化哪个类的对象以及要实例化的对象的引用名称。
- 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径,这里的访问路径是相对路径,相对于Web应用的根目录。
关于url-pattern
- 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
- 在Servlet映射到的URL中也可以使用[*]通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/action/*</url-pattern>
</servlet-mapping>
两个根目录
一个Tomcat服务器就是一个Web站点,而一个Web站点可以部署多个Web应用。