什么是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 处理请求的过程
Servlet被发来的第一个请求激活,然后继续运行于后台,以线程形式处理请求,速度非常快,直到Servlet被修改时才再次加载。
一个Servlet在同一时刻只有一个实例,并且它在Sevlet的使用期间将一直保留。
多线程处理多请求
Servlet的生命周期
(1)初始化阶段
在下列情形下Web容器装入Servlet,创建一个Servlet实例,调用Servlet的init()方法对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文件的完整路径名是:
%CATALINA_HOME%/lib/servlet-api.jar
(不知为何,我把上面的路径加进去仍不能成功,改为全路径就可以了,C:/Program Files/Apache Software Foundation/Tomcat 7.0/lib)
我们只需要在系统的CLASSPATH环境变量下添加这个JAR文件的路径名就可以了。
注意,修改系统变量后需要重启电脑