什么是Servlet 在Web服务器端加载并运行的Java应用程序具体运行在Servlet引擎管理的JVM上。Servlet容器负责Servlet和用户的通信以及调用Servlet的方法。Servlet和用户的通信采用请求/响应模式。用于以动态响应客户机请求形式扩展Web服务器(Web Container)的功能。
Servlet是开发服务器端应用程序的一个很好选择, Servlet与JSP结合使用,能提供更强大的服务器端功能。
三种基本的Servlet引擎 大多数的J2EE服务器,如:BEA WebLogic,WebSphere Application, JBoss等。具有内置Servlet容器的Web服务器,如:Tomcat。使用Servlet引擎插件的产品,如JRun、 Apache Web服务器、Microsoft IIS等,这些产品都需要安装Web插件来集成Java运行时环境
工作原理
Servlet 处理请求的过程
用户从客户机将HTTP请求发送给Web服务器。Web容器实例化Servlet,并创建线程。Web服务器将该请求发送给Servlet。Servlet处理该请求。Servlet将响应发送给Web服务器。Web服务器将响应转发送给客户机。Servlet被发来的第一个请求激活,然后继续运行于后台,以线程形式处理请求,速度非常快,直到Servlet被修改时才再次加载。一个Servlet在同一时刻只有一个实例,并且它在Sevlet的使用期间将一直保留。
多线程处理多请求
Servlet的生命周期 (1)初始化阶段 在下列情形下Web容器装入Servlet,创建一个Servlet实例,调用Servlet的init()方法对Servlet实例初始化:
Servlet容器启动时。 在Servlet容器启动后,客户首次向Servlet发出请求。Servlet的类文件被修改后,重新加载。(2)服务阶段 如果容器接收到对此Servlet的请求,那么它根据配置文件Web.xml中URL与Servlet映射关系将请求转发至此Servlet的service()方法。 service()方法中调用doGet()或doPost()。
(3)终止阶段
实例被销毁,通过调用Servlet的destory()方法来销毁Servlet,关闭数据库连接、中断后台线程等。
实例1.
// ==================== Program Description ========================== // 程序名称: HelloWorldServlet.java // 参考网址: http://www.8isp.cn/news.jsp?id=165 // 程序目的: 编写最简单的Servlet程序,熟悉其过程 // ============================================================== import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws IOException{ res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html><head><title>Hello World!</title></head>"); out.println("<body>"); out.println("<p><img src="images/build_bea_web.gif" mce_src="images/build_bea_web.gif" align=right>"); out.println("<h1>Hello World!</h1></body></html>"); } }
将HelloWorldServlet .java编译后得到.class文件,
将HelloWorldServlet.class文件拷贝到intall_dir/webapps/ROOT/WEB-INF/classes中,
打开intall_dir/webapps/ROOT/WEB-INF/路径下的web.xml文件,在<web-app>...</web-app>之间添加如下内容:
<servlet><servlet-name>HelloWorldServlet</servlet-name><servlet-class>HelloWorldServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloWorldServlet</servlet-name><url-pattern>/HelloWorldServlet/*</url-pattern></servlet-mapping>
保存web.xml 文件,注意,备份修改前的web.xml 。
重新启动Tomcat 服务器,在地址栏输入http://localhost:8080/HelloWorldServlet 访问HelloWorldServlet .class 即可。
注意:如果Tomcat已经启动,需要重启Tomcat
目录结构如下所示:
程序解释:
这个程序用service()方法实现对客户端的响应。在这个响应中,首先是调用了setContextType("text/html")设置响应内容类型。因为要发送文本,用getWriter( )方法获得了PrintWriter对象,第15~18行就是发送给客户端的信息,一个字符串"Hello World",一个几乎在每种语言中都要出现的程序。我们并没有显式地关闭PrintWriter对象,Servlet引擎会自动地关闭它,这样会提高性能
可能出现的问题 :
编译时提示servlet包不存在
产生这些错误的原因是Java编译器没有找到javax.servlet包中的类。
要解决这个问题,我们需要让Java编译器知道Servlet API库所在的位置。Tomcat在其发行版中已经包含了Servlet API库,是以JAR文件的形式提供的,这个JAR文件的完整路径名是: