servlet:
它是web应用程序的核心类,可以直接处理和相应用户请求,又或者将处理工作委托给应用中的其他部分的类。
让servlet继承HttpServlet的原因是:
1.HttpServlet继承了javax.servlet.GenericServlet,并实现了只接收Http请求的service()方法。
2.HttpServlet提供了每种http请求的空实现
3.当用户以http的方法提交请求时,我们可以在HttpServlet的基础上,根据请求的类型,把处理工作放入重写的相应方法中。假如用户以post的方法提交表单数据,那么可以重写HttpServlet中的doPost()方法,然后编写处理逻辑。
servlet的生命周期:
1.初始化状态:调用init()方法
时间:第一种情况:当servlet构建完成后,并在第一个请求到达之前
第二种情况:若servlet被设置在web应用部署和启动时自动启动,那么它的init()方法也会被调用;这种设置有两种实现方式,一是在部署描述文件/WEB-INF/web.xml中为该servlet添加一项说明<load-on-startup>level</load-on-startup>,level表示启动顺序的优先级;二是在servlet类中使用注解,在注解中添加一项说明 loadOnStartup = level;
2.处理请求:调用service()方法,或者根据请求类型分别调用相关的doXXX()
时间:用户的请求到达
3.销毁:调用destory()方法
时间:当servlet不再接收请求后,立即调用;通常发生在web应用被停用或卸载或web容器关闭
例子:创建一个简单的servelt,在用户以get的方式发出请求时,在用户的浏览器中显示“Hello World”
1 package cn.example; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class HelloServlet extends HttpServlet{ 12 13 /* 14 * 处理Http中的Get请求 15 */ 16 @Override 17 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 18 // 获取字符输出流 19 PrintWriter writer = resp.getWriter(); 20 // 向字符输出流中输入一段文字 21 writer.write("Hello, world"); 22 23 } 24 25 /* 26 * 初始化方法,当servlet构建完成后,在第一个请求到达之前调用 27 * 在调用init()时,servlet中的所有属性都已经设置完成,并提供了对ServletConfig和javax.servlet.ServletContext对象的访问 28 */ 29 @Override 30 public void init() throws ServletException { 31 // 向终端输入一段文字,表示该方法被调用 32 System.out.println("Servlet " + this.getServletName() + " has started"); 33 } 34 35 /* 36 * 销毁方法,当Servlet不再接收请求之后立即调用,这种情况通常发生在Web应用被停止或者卸载,或者web容器关闭。 37 */ 38 @Override 39 public void destroy() { 40 // 向终端输入一段文字,表示该方法被调用 41 System.out.println("Servlet " + this.getServletName() + " has stopped"); 42 } 43 }
编写完servlet后,需要告诉web容器如何部署应用程序中的servlet,有两种方式:
1.在web.xml中部署
2.使用注解
在web.xml中部署servlet:
<?xml version="1.0" encoding="UTF-8"?> <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"> <!-- web.xml文件将指示web容器如何部署应用程序 --> <!-- 应用程序在服务器中显示的名字 --> <display-name>Hello-World</display-name> <!-- 声明servlet,包括servlet的名字,在哪里可以定位到该servlet --> <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>cn.example.HelloServlet</servlet-class> </servlet> <!-- 该servlet应该对哪些请求URL做出相应 所有访问应用程序相对URL/greeting,URL/salutation,URL/wazzup的请求都可以被helloServlet处理,在这里的请求URL可以有多个 --> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/greeting</url-pattern> <url-pattern>/salutation</url-pattern> <url-pattern>/wazzup</url-pattern> </servlet-mapping> </web-app>
完成这两项工作之后,就可以运行servlet