Servlet是J2EE的13个规范之一,最初由SUN公司制定,规定了Web应用与Web服务器进行协作的一系列标准Java接口(Java Servlet API)和规约。
包括规定了:
Web服务器可以访问任意一个Web应用中实现Servlet接口的类。
Web应用中用于被Web服务器动态调用的程序代码位于Servlet接口的实现类中。
准确的说是Servlet容器,在Servlet规范中,把能够发布和运行JavaWeb应用的Web服务器称为Servlet容器,他的最主要特征是动态执行Servlet的实现。Servlet容器有Tomcat,Weblogic,Jboss等等。
对于开发人员,Servlet是用Java编写的服务器程序(按照Servlet规范),运行在服务端上的,它没有main方法(详见下面的实例),不能够独立的运行,需要由Servlet容器调用和执行。
所以对于Java程序的Servlet要运行在Servlet容器中,并由容器管理从创建到销毁的整个过程。
我们来实现一个简单的Servlet,HelloServlet类,简单的输出"HelloServlet"。(通过Tomcat实现,Tomcat的配置这里就不在详解了。)
package examples.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name="helloServlet", urlPatterns="/servlet/example") public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("Hello Servlet"); out.flush(); out.close(); } public void destroy() { System.err.println(getServletName()+"生命周期结束");; } public void init() throws ServletException { System.out.println(getServletName()+"执行初始化"); } }
@WebServlet(name="helloServlet",urlPatterns="/servlet/example")
Servlet3.0后的新特性,Servlet3.0支持使用注解配置Servlet。我们只需在Servlet对应的类上使用@WebServlet进行标注,我们就可以访问到该Servlet了,而不需要再在web.xml文件中进行配置。
Servlet容器将Servlet动态地加载到服务器上。HTTP Servlet使用HTTP请求和HTTP响应与客户端进行交互。
全过程详解(结合上面代码):
Servlet容器负责加载和实例化Servlet,这个过程就是Servlet容器要知道Servlet类的位置,然后加载到容器中,容器在创建Servlet的实例。(其实就是类的实例化)
实例化之后,容器将调用Servlet的init()方法初始化这个对象。
初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。(对于每一个Servlet实例,init()方法只被调用一次。)
首先Servlet容器调用Servlet的service()方法对请求进行处理。
然后service()方法根据不同的请求类型进行处理,常用的处理方法有doGet()、doPost()。
ServletRequest:得到客户端的相关信息和请求信息,对请求进行处理;
ServletResponse:设置响应信息。
容器通过调用Servlet实例的destroy()方法。调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。
Servlet和JSP经常放在一起讨论,主要是它们都可以动态的生成页面内容;
--就其代码的表现形式看,JSP是在HTML中插入了Java代码实现的动态页面,Servlet是通过Java动态添加HTML实现的;
--从发展上看,JSP是Servlet技术的扩展,JSP的出现弥补了Servlet效率低下的问题。本质上是Servlet的简易方式。
具体的JSP实现会在后面的学习中继续研究。
Servlet给我的感觉就是ASP.NET里的.ashx,它们都可以动态的生成页面内容。
.ashx在IIS下运行,利用其编译器运行,执行生成html代码,以http方式传送到客户端,客户端浏览器来解析执行。
而Servlet则是在Servlet容器下(如Tomcat)运行,过程还都是一样的。
Servlet作为J2EE的规范之一,对于实现动态网页,是用于Web开发的基本技术。弄明白Servlet对于J2EE的学习是非常重要的。Servlet的规范也在更新,我们的学习也要跟上,从.NET过渡到J2EE,新事物不断映入(当然很多东西只是表现的不同,实现的原理是很相似的),J2EE真的打开了另一片新的Sky。
开启 J2EE(三)—Servlet,布布扣,bubuko.com
原文地址:http://blog.csdn.net/akkzhjj/article/details/30224837