一、容器概述
Servlet是一种运行在服务器上的小插件,Servlet最常见的用途是扩展Web服务器的功能,Servlet具有以下的特点:
- 提供了可被服务器动态加载并执行的程序代码,为来自客户端的请求提供相应的服务。
- Servlet完全使用Java语言编写,因此要求运行Servlet的服务器必须支持Java语言
- Servlet完全在服务器端运行,因此他的运行不依赖于浏览器。
Tomcat作为运行Servlet的容器,其基本的功能是负责接收和解析来自客户端的请求,同时把客户端的请求传递给相应的Servlet,并把Servlet的相应结果返回给客户。
如果Web服务器应用得到一个指向某Servlet的请求,此时,服务器不是把这个请求交给Servlet本身,而是交给部署该Servlet的容器。**由容器向Servelt提供Http请求和响应,而且要由容器调用Servlet的方法,如doGet()或doPost()。**流程如下图所示:
二、容器提供什么
如前文所述,要由容器用来管理和运行Servlet,这是为什么呢?容器到底带给我们什么呢?如下所示,是容器提供给我们的,也是使用容器的原因:
- 通讯支持:利用容器提供的方法,可以轻松的让servlet与web服务器对话,无需自己建立ServerSocket、监听端口、创建流等。容器知道自己与Web服务器之间的协议。
- 生命周期的管理:控制着Servlet的生与死。
- 多线程支持:容器会自动的为其接收的每个Servlet请求创建一个新的Java线程。
- 声明方式实现安全:利用容器,可以使用XML部署描述文件来配置和修改安全性,而不必将其硬编码写入到Servlet(或其他)类代码中。
- JSP支持:将JSP翻译成Java。
总而言之,有了容器,我们可以更专注于自己的业务逻辑,而不必考虑为请求监听、线程管理、安全性及网络通讯编写代码。
下图为容器处理请求的过程:
Servlet示例代码:
/**
* 创建一个简单的Servlet类
*/
public class Ch1Servlet extends HttpServlet {
/**
* get请求
* @param request 容器创建的请求
* @param response 容器创建的响应。 Servlet从此处获取到容器创建的请求和响应。
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
Date today = new Date();
//获取到客户请求之后,响应一个HTML页面给客户
out.println("<html>
" +
"<!-- 简单的Html页面 -->
" +
"<head>
" +
" <title>A Login Page</title>
" +
"</head>" +
"<body>
" +
"<h1 align="center"> wangy login page</h1>
" +
"<br>" + today+
"</body>
" +
"
" +
"</html>");
}
}
三、 Servlet的三个名字
容器如何找到某个需要的Servlet呢?作为客户端请求的一部分,URL会以某种方式映射到服务器上的一个特定的servlet。我们需要配置这种映射,这牵扯到Servlet的三个名字:
1)客户知道的URL名(公共URL名):
Servley有一个公共的URL名,这是客户所知道的名字**,这个名字写在HTML中,当用户点击一个指向该servlet的链接时,就可以把这个公共URL名放在HTTP请求中,发送给服务器。公共URL只是一个虚构的名字,完全为客户提供的。**
2)部署人员知道的秘密内部名:
部署人员可以造一个名字,这个名字只有他自己知道,这个名字也是虚拟的,只用于部署Servlet。
3)实际的文件名:
开发人员的servlet类有一个完全限定名,其中包括类名和包名。servlet类文件有一个实际的路径和文件名。这取决于其在服务器上的文件位置。
下面是将URL映射到servle
t的部署文件(web.xml)示例:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<!-- 部署描述文件 -->
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- servlet部署 -->
<servlet>
<servlet-name>Chapter1 servlet</servlet-name> <!-- servlet 部署时的内部名 -->
<servlet-class>com.wyf.servlet.Ch1.Ch1Servlet</servlet-class> <!-- servlet实际文件名 -->
</servlet>
<!-- 将servlet与url映射 -->
<servlet-mapping>
<servlet-name>Chapter1 servlet</servlet-name>
<url-pattern>/Servl</url-pattern> <!-- servlet 客户使用的URL名-->
</servlet-mapping>
</web-app>