初识Java Web
长风破浪会有时,直挂云帆济沧海。
李白·《行路难》
一、Servlet
Servlet可以看做是在服务器上运行的一个小程序,一个Servlet就是一个继承了Servlet的Java类。通过Servlet的doPost或者doGet方法对客户端发出的请求作出处理,服务器中只会存在一个Servlet实例,若多个请求同时指向一个Servlet资源,这些请求会作为同一个Servlet的单独线程处理(即单实例多线程)。
public class TestServlet extends HttpServlet {//创建了一个Servlet
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//处理Post方法
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//处理Get方法
}
}
二、容器
Servlet没有main方法,它们受控于另一个Java应用——容器(比如Tomcat)。
Servlet的生命周期方法由容器调用:
- 当服务器应用得到一个指向某Servlet的请求时,服务器首先将这个请求交给容器。然后容器根据请求中的URL找到正确的Servlet,为这个请求创建或分配一个线程,并把请求和响应(即doPost和doGet传入的参数request、response)传递给这个Servlet线程。接下来容器调用Servle的service方法,根据请求的不同,service调用doPost或doGet等方法。
- 当线程结束后,容器将响应对象转换为一个HTTP响应并发给客户端,然后删除请求以及响应对象。
注:
Servlet或者Web应用的其他部分通过容器创建的请求对象和响应对象得到有关请求的信息
三、容器如何找到Servlet?——部署描述文件
为了灵活性以及安全性考虑,一个Servlet有3个名字:
- 客户端知道的公共URL名。该名字只是一个虚构的名字,面向客户端,不代表Servlet名和服务器上的目录以及文件的映射关系;
- 部署人员知道的秘密的内部名。该名字也是一个虚构的名字,面向部署人员,只用于部署Servlet;
- 实际的完全限定类名。该名字代表Servlet类文件的实际路径,面向开发人员。
部署描述文件(DD)是一个XML文档,用于告诉容器如何运行Servlet,其中包括将URL映射到Servlet的映射关系,该映射通过以下两个元素实现:
- < servlet-mapping >:公共URL名映射到内部名
- < servlet >:内部名映射到完全限定类名
<servlet><!--<servlet>元素告诉容器哪些类文件属于一个特定的Web引用-->
<!--
<servlet-name>元素用于将一个<servlet>元素绑定到一个<servlet-mapping
>元素。这个名字作为内部名只在部署描述文具的其他部分使用,客户端用户看不到这个
-->
<servlet-name>InternalName</servlet-name>
<!--
此处放置类的完全限定名(不要加.class扩展名)
-->
<servlet-class>TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>InternalName</servlet-name>
<!--
此处放置客户端用户看到并使用的公共URL名
-->
<url-pattern>/PublicURLName</url-pattern>
</servlet-mapping>