1、Servlet简介
Servlet是用Java语言编写的服务器端程序,是由服务器端调用和执行的、按照Servlet自身规范编写的Java类。Servlet可以处理客户端传来的HTTP请求,并返回一个响应。
2、Servlet API
编程接口大部分与Jsp内部对象对应,常用方法不再给出,可参考jsp内部对象一节。
功能 | 类和接口 |
Servlet实现 | javax.servlet.Servlet,javax.servlet.SingleThreadModel javax.servlet.GenericServlet,javax.servlet.http.HttpServlet |
Servlet配置 | javax.servlet.ServletConfig |
Servlet异常 | javax.servlet.ServletException,javax.servlet.UnavailableException |
请求和响应 | javax.servlet.ServletRequest,javax.servlet.ServletResponse javax.servlet.ServletInputStream,javax.servlet.ServletOutputStream javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse |
会话跟踪 | javax.servlet.http.HttpSession,javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionBindingEvent |
Servlet上下文 | javax.servlet.ServletContext |
Servlet协作 | javax.servlet.RequestDispatcher |
其他 | javax.servlet.http.Cookie,javax.servlet.http.HttpUtils |
3、Servlet代码结构及配置

说明:
(1)Servlet类需要继承类HttpServlet 。
(2)Servlet的父类HttpServlet中包含了几个重要方法,常根据需要重写它们:
init():初始化方法,Servlet对象创建后,接着执行该方法。
doGet():当请求的类型是“get”时,调用该方法。
doPost():当请求的类型是“post”时,调用该方法。
service():Servlet处理请求时自动执行service()方法,该方法根据请求的类型(get或post),调用doGet()或doPost()方法,因此,在建立Servlet时,一般只需要重写doGet()和doPost()方法。
destroy():Servlet对象注销时自动执行。
(3)Servlet编写好后,需要进行配置才能起作用,配置方法有xml(在web.xml中配置)和注解两种(新版本的Servlet和IDE主要使用后者),配置项有多个,其中访问地址(URL Mappings)是必不可少的。
(4)Eclipse下Servlet的建立。
在Java EE开发视图下,右击工程src—New—Servlet,确定Servlet包名和类名。
接下来的对话框中设置Servlet访问地址(URL Mappings),例如设置为Servlet1(注意起始的/一定不能去掉)。

最后确定后,会看到Servlet代码框架已经生成,类前添加了设置Servlet访问地址的注解。
@WebServlet("/Servlet1")则该servlet访问地址为:http://localhost:8080/web目录/Servlet1
4、Servlet、JavaBean、Jsp的关系
(1)Jsp是页面,Servlet和Javabean是类,Jsp在执行时会先翻译成Servlet;
(2)JavaBean供JSP或Servlet调用,不能独立运行。
(3)从功能上说,Servlet和Jsp是等价的,都可以用来执行代码处理客户端的请求,事实上Servlet出现早于Jsp,Servlet在输出页面内容时非常繁琐(用一系列的out.write()语句),为了克服这个缺点诞生了Jsp技术,但Servlet并没有因此退出历史舞台,Servlet侧重于代码设计,Jsp侧重于界面设计,两者各有所长,在一些开发模式中,如MVC模式(后面章节详细介绍),就充分利用两者的特点,让它们在开发中担任不同的角色。
5、Servlet和Jsp的等价性
(1)访问方法
jsp:http://localhost:8080/服务目录/*.jsp
servlet:需要先设置servlet的访问地址(<url-pattern>)
(2)内部对象
jsp:out,request,response,session,application等内部对象可以直接使用。
servlet:
request、response作为方法参数可直接使用。
out: PrintWriter out=response.getWriter();
session:HttpSession session=request.getSession();
application:ServletContext application= this.getServletContext();
(3)内容类型及编码
Jsp:<%@ page contentType="text/html;charset=utf-8" %>
Servlet:response.setContentType("text/html;charset=utf-8");
(4)导入包
Jsp:<%@ page import=“java.sql.*,java.net.*” %>
Servlet:import语句;
(5)转发
Jsp:<jsp:forward page=“文件的名字” />
Servlet:request.getRequestDispatcher(“”).forward(request,response)
(6)包含
Jsp:<jsp:include page=“文件的名字” />
Servlet:request.getRequestDispatcher(“”).include(request,response)
(7)页面或servlet关联的几种方式:
链接、表单提交、重定向、转发、包含。
地址关联时,建议地址以/开始,不同情况下/含义不同:
链接,表单提交、重定向时,/表示http://localhost:8080,因此/后要加上web目录,更好的写法是${pageContext.request.contextPath}。
转发、包含以及servlet映射地址中/表示http://localhost:8080/web目录,/后就不用加web目录了。
6、Jsp+Servlet实现两数求和。
思路和以前jsp练习中“计算两个数的和”类似,只有一点不同:将处理环节换成Servlet。输入和输出仍是借助于Jsp。
(1)输入页面
<%@ page pageEncoding="UTF-8" %> <html> <body> <form method="post" action="add"> 输入第一个整数:<input type="text" name="n1"><br> 输入第二个整数:<input type="text" name="n2"><br> <input type="submit" value="求和"/> </form> </body> </html>
其中action的值为Servlet的访问地址。
(2)Servlet(只保留关键代码)
package servlet;
import java.io.IOException;
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("/add")
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//。。。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
int n1=Integer.parseInt(request.getParameter("n1"));
int n2=Integer.parseInt(request.getParameter("n2"));
String result=n1+"+"+n2+"="+(n1+n2);
request.setAttribute("msg",result);
request.getRequestDispatcher("/output.jsp").forward(request,response);
}
}(3)输出页面
<%@ page pageEncoding="UTF-8" %>
<html>
<body>
${msg}
</body>
</html>