Servlet(服务端小程序)是使用Java语言编写的服务端小程序,能够用于生成动态的Web页面。html
在整个Servlet程序中,最重要的就是Servlet接口,在此接口下定义了一个GenericServlet的子类,可是通常不会直接继承这个子类,而是根据不一样的协议选择GenericServlet的子类来继承,例如:java
首先咱们要明确的一件事是:在处理HTTP请求的Servlet程序中,确定要继承HttpServlet类,那么在自定义的Servlet中至少要覆写HttpServlet中提供的doGet()
方法。web
javapackage servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.print("<html><head><title>First Servlet</title></head>"); out.println("<body>"); out.println(" <h1>Hello world</h1> "); out.println("</body></html>"); out.close(); } }
写好这个Servlet而后编译,还不能访问,由于咱们还须要找到一个钩子让网页跟咱们的Servlet联系起来。那么这个“钩子”就是配置web.xml的路由映射:数据库
xml<servlet> <servlet-name>hello</servlet-name> <servlet-class>servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping>
这样,就能够经过../helloServlet
查看效果:小程序
若是表单使用的是post
的方式提交的,因此在编写Servlet程序时要使用doPost()
方法。
input.html:服务器
html<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>信息录入</title> </head> <body> <form action="inputServlet" method="post"> 输入内容: <input type="text" name="info"/> <input type="submit" value="提交"/> </form> </body> </html>
InputServlet.java:app
javapackage servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * Created by mcbird on 14/11/24. */ public class InputServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String info = req.getParameter("info"); PrintWriter out = resp.getWriter(); out.println("<html><body>"); out.println(" <h1>" + info + "</h1> "); out.println("</body></html>"); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
一样,咱们也须要在web.xml下添加一条路由映射规则:
web.xml:ide
xml<servlet> <servlet-name>input</servlet-name> <servlet-class>servlet.InputServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>input</servlet-name> <url-pattern>/inputServlet</url-pattern> </servlet-mapping>
这样咱们在input.html
中输入信息后就会跳转到InputServlet
,这样InputServlet就能够经过req对象获取到info变量的值。post
Servlet的生命周期包括加载程序、初始化、服务、销毁、卸载5个部分,以下图所示。this
当Web容器
启动时或者是在第一次使用这个Servlet时,容器会负责建立Servlet实例,可是必须在web.xml中指定Servlet的位置,成功加载后,Web容器会经过反射的方式对Servlet进行实例化
。
当一个Servlet被实例化后,容器将调用init()
方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一系列初始化的工做,像创建数据库的链接、读取资源文件信息等,若是初始化时失败了,那么Servlet将被直接卸载。
当有请求提交时,Servlet将调用service()方法(经常使用的是doGet()
或doPost()
)进行处理。
当Web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()
方法,以便让实例释放掉所占用的资源。
当一个Servlet调用完destroy()
方法后,此实例将等待被垃圾收集器所回收,若是须要再次使用此Servlet时,会从新调用init()
方法进行初始化。
在默认状况下,初始化方法是在第一次使用时才调用,你也能够经过在web.xml中配置
servlet
的<load-on-startup>1</load-on-startup>
这样在容器启动时Servlet就会被初始化。