参考文章:一个简单的Servlet程序 http://blog.csdn.net/a153375250/article/details/50916428
Servlet简介
Servlet是什么?简单地说,它就是一个java程序,是一个运行在web服务器上的程序。它可以对Web浏览器或其他HTTP客服端程序发出的请求进行处理。但是使Servlet能够处理以上请求的前提条件是Servlet对象要被布置在Servlet容器当中,我们这里用的Servlet容器就是我们前面用到的Tomcat服务器。
Servlet的使用和JSP不同,它需要web.xml文件的配置。当一个客户端发出HTTP请求时,服务器会根据配置文件中的配置信息将该请求的信息发送给相对应的Servlet进行处理。
Servlet的基本结构
Servlet就是一段由java编写的程序,由服务器来维护。为了方便服务器的处理,Servlet需要遵循一定的结构规范。通常我们所说的Servlet就是一个实现了HttpServlet抽象类的类的实例。代码结构如下:
1 import javax.servlet.ServletException; 2 import javax.servlet.http.HttpServlet; 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 import java.io.IOException; 6 7 public class ServTest extends HttpServlet { 8 //init method 9 public void init() throws ServletException {} 10 //handle get request 11 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 12 } 13 //handle post request 14 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 } 16 //handle put request 17 protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 18 } 19 //handle delete request 20 protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 21 } 22 //destroy 23 public void destroy() {} 24 }
7行,Servlet继承HttpServlet类。
9行,init()方法,服务器在创建Servlet实例后会调用该方法进行初始化的工作。
11~20行,Servlet就是通过这些do方法来处理对应的Http请求的。事实上,这些do方法都是从HttpServlet中继承来的,我们这里需要对这些方法进行重写以处理具体的请求。
23行,当服务器关闭时,该destroy()方法会被调用,销毁该实例。
Servlet生命周期
我们知道,Servlet是由服务器维护的。那么服务器是如何管理Servlet的呢?通常有以下几个阶段,这些阶段也就是Servlet从生到死的生命周期:
- 当某个Servlet第一次被请求的时候,服务器会加载对应的Servlet类,将其放在Servlet实例池中。
- 创建Servlet实例后,将调用该实例的init()方法进行一些初始化操作。(即Servlet的代码结构中的init())
- 服务器通过调用Servlet的service()方法来处理客户端发送的请求。实际上,上面的Servlet的代码结构中的do方法都是通过service()来调用的。代码结构中我们没有显式地看到service()方法是因为我们没有对继承的该方法进行重写。
- Servlet实例创建后会一直存在于内存中,直到服务器关闭,Servlet的destroy()方法被调用,该实例被销毁。
Servlet的xml配置
Servlet在使用之前需要进行一定的配置,来告诉服务器被请求的Servlet应该发到哪里。这其实就是一个Servlet在服务器的注册过程,这样服务器就会知道哪个Servlet请求对应哪个Servlet对象。配置过程通常分为Servlet的声明和Servlet的映射两部分。
Servlet的声明
语法格式如下:
1 <servlet> 2 <servlet-name>name</servlet-name> 3 <servlet-class>path</servler-class> 4 </servlet>
第一条语句中的name是声明的Servlet对象的名字,名字你可以自取,就像声明一个String abc一样,abc名字可以自取。
第二条语句中的path是用于指定你的Servlet的class文件的路径的。通常你把你的Servlet编译好的class文件放在Tomacat安装目录下的/webapp/ProjectName/WEB-INF/classes文件夹下,此时只需要写你的Servlet的class文件的名字就行了:
1 <servlet-class>ServTest</servler-class>
ProjectName是你的webapp文件夹,里面的WEB-INF及classes文件夹需要手动创建。
Servlet的映射
语法格式如下:
1 <servlet-mapping> 2 <servlet-name>name</servlet-name> 3 <url-pattern>path</url-pattern> 4 <servlet-mapping>
这里是对我们上面声明的Servlet的一个映射,所以这里的name要和上面声明中的name一样才行。
url-pattern用于映射你的访问URL,例如将你的访问URL映射为:
1 <url-pattern>/ServletTest<url-pattern>
你就可以通过:localhost:8080/ServletTest
来请求该Servlet了。
如果写成:* ace这种形式,则所有与ace为结尾的请求都通过本Servlet来处理
如:127.0.0.1:8080/ace.servlet/lalaace
制作简单Servlet
新建一个Dynamic Web Project,取名为SimpleServlet
在WebContent下新建jsp文件
Index.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Servlet</title> </head> <body> <center> <form action="MyServlet" name="form" method="post"> Your Name:<input type="text" name="USERNAME"><br> <input type="submit" value="SUBMIT"></form> </center> </body> </html>
新建Servlet,package为niiam,ServletTest.java
1 package niiam; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 12 * Servlet implementation class ServTest 13 */ 14 @WebServlet("/ServTest") 15 public class ServTest extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 18 /** 19 * @see HttpServlet#HttpServlet() 20 */ 21 public ServTest() { 22 super(); 23 // TODO Auto-generated constructor stub 24 } 25 26 /** 27 * @see Servlet#destroy() 28 */ 29 public void destroy() { 30 // TODO Auto-generated method stub 31 } 32 33 /** 34 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 35 */ 36 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 // TODO Auto-generated method stub 38 response.setContentType("text/html"); 39 response.setCharacterEncoding("gb2312"); 40 41 PrintWriter out = response.getWriter(); 42 String name = request.getParameter("USERNAME"); 43 44 out.println("Your Name : " + name); 45 } 46 47 }
保存,如果Eclipse设置了自动编译(Project->Build Automatically)
则在制定Build path(在本项目中为build/classes)中会出现.class文件
修改web.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>SimpleServlet</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 13 <servlet> 14 <servlet-name>ServletHandle</servlet-name> 15 <servlet-class>niiam.ServTest</servlet-class> 16 </servlet> 17 <servlet-mapping> 18 <servlet-name>ServletHandle</servlet-name> 19 <url-pattern>/MyServlet</url-pattern> 20 </servlet-mapping> 21 </web-app>
其中,第15行内容注意要体现对应package中的class
在服务器上运行Index.jsp即可