一Servlet概述
(1)什么是Servlet
先有JSP还是先有Servlet呢?对于这个问题,我们只需要知道JSP的前身就是Servlet。因此我们乐意清楚的知道
Servlet是JSP的基础。
Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过"请求-响应"编程模型来访问的
这个驻留在服务器内存里的Servlet程序。
Servlet为创建基于Web的应用程序提供了基于组件、独立于平台的方法,可以不受CGI程序的性能限制。Servlet
有权限访问所有的Java API,包括访问企业级数据库的JDBC API。
Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和
HTTP服务器上的数据库或应用程序之间的中间层。
使用Servlet,可以收集来自表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Servlet通常情况下与使用CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效
果。但是相比于 CGI,Servlet 有以下几点优势:
1)性能明显更好。
2)Servlet在Web服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
3)Servlet是独立于平台的,因为它们是用Java编写的。
服务器上的Java安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet是可信的。
4)Java类库的全部功能对Servlet来说都是可用的。它可以通过Socket和 RMI机制与Applet、数据库或其他软件
进行交互。
(2)Servlet包
Servlet是运行在带有支持Servlet规范的解释器的web服务器上的Java类。
Servlet可以使用 javax.servlet 和 javax.servlet.http 包创建,它是Java企业版的标准组成部分,Java企业版是支持大
型开发项目的Java类库的扩展版本。这些类实现Servlet和JSP规范。
Servlet就像任何其他的Java类一样已经被创建和编译。
(3)Servlet任务
Servlet执行以下主要任务:
1)读取客户端(浏览器)发送的显式的数据。这包括网页上的HTML表单,或者也可以是来自Applet或自定义的
HTTP客户端程序的表单。
2)读取客户端(浏览器)发送的隐式的HTTP请求数据。这包括cookies、媒体类型和浏览器能理解的压缩格式等
等。
3)处理数据并生成结果。这个过程可能需要访问数据库,执行RMI或CORBA调用,调用Web服务,或者直接计
算得出对应的响应。
4)发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTM 或XML)、
二进制文件(GIF图像)、Excel等。
5)发送隐式的HTTP响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如HTML,设置
cookies和缓存参数,以及其他类似的任务。
二Servlet的运行过程
下图显示了Servlet在Web应用程序中的位置:
Servlet调用图:
三在Eclipse中开发Servlet
(1)Servlet接口实现类
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比
Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service()方法,该方法体内的代码会自动判断用户的请求方式,如为
GET请求,则调用HttpServlet的doGet()方法,如为Post请求,则调用doPost()方法。因此,开发人员在编写Servlet
时,通常只需要覆写doGet()方法或doPost()方法,而不要去覆写service()方法。
(2)实例开发
1)在Eclipse中新建一个web project工程,Eclipse会自动创建下图所示目录结构:
2)在com.servlet包右键下创建一个Servlet:
3)在弹出的对话框中填写Servlet的名称,就像创建一个Java类一样:
4)创建完成之后,我们就开始编写一些代码,在这里只是重写了doGet()方法,代码为:
package com.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; /** * Servlet implementation class HelloServlet */ @WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("<h1>Hello Servlet</h1>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
5)在浏览器中输入;http://localhost:8080/ServletDemo1/HelloServlet,我们就可以访问这个Servlet:
6)我们再编写一个测试的index.jsp页面,需要注意的是我们输入的URL地址必须与Servlet中注解中URL地址的一
致,其中输入的代码为:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Servlet编程</title> </head> <body> <h1>Servlet小程序</h1> <hr/> <a href="HelloServlet">get方式请求HelloServlet</a> <hr/> <form action="HelloServlet" method="post"> <input type="submit" value="post方式请求HelloServlet"/> </form> </body> </html>
7)在浏览器中输入:http://localhost:8080/ServletDemo1/index.jsp,点击两个请求的方式,我们也可以得到
结果:
这是最新的创建Servlet的方法,过去的我们在Eclipse中开发Servlet,需要手动编写一个web.xml配置文件,完
成Servlet的创建。那么我们也来手动编写一个Servlet程序。
四过去的做法
(1)直接使用类继承HttpServlet抽象类
具体的步骤为:
1)就像创建一个普通的Java类一样,这个类继承自HttpServlet类,
2)我们在类中右键选择下图的选项:
3)在出现的对话框中选择重写下图中的两个方法:
代码为:
package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletOld1 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.print("<h1>Hello Servlet</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doGet(req, resp); } }
4)完成后我们就需要在web.xml文件中配置Servlet:
5)在浏览器中输入:http://localhost:8080/ServletDemo1/ServletOld1的结果:
(2)Servlet3.0之前的做法
具体的步骤:
1)创建一个Servlet,不使用注解
package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletDemo */ public class ServletDemo extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ServletDemo() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("<h1>Hello Servlet</h1>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
2)在web.xml配置文件中配置:
3)在浏览器中输入:http://localhost:8080/ServletDemo1/ServletDemo的结果:
综上这三个方法,使用注解的是最简单的,也是Serlet3.0的新特性,具体的可以参
考:http://blog.csdn.net/xiazdong/article/details/7208316