本系列博客汇总在这里:JavaWeb_servlet 汇总
一、第一个例子
-
实现一个 servlet
servlet 是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。也就是说,Servlet 是由我们自己来完成的!但 Servlet 一定要实现 javax.servlet.Servlet 接口,并且还要在 web.xml 文件中部署!不然 Tomcat 是找不到我们写的 Servlet 的,点击下载API。 -
Servlet 接口
javax.servlet.Servlet 接口中方法如下:
(1)void init(ServletConfig servletConfig):当 Tomcat 创建 Servlet 实例后,马上调用 init() 方法。这个方法只在创建后调用一次!用来做 Servlet 初始化工作!一个 Servlet 实例只被创建一次,所以 init() 方法也只被调用一次!(本方法编写对 Servlet 的初始化代码)
(2)void service(ServletRequest request, ServletResponse response):Servlet 实例在每次处理请求时都调用 service() 方法。
(3)void destroy():当 Tomcat 要销毁 Servlet 实例时,会先调用 destroy() 方法,再销毁它。所谓销毁Servlet,其实就是在 Servlet 缓存池中把 Servlet 移除!一般只有 Tomcat 关闭时,才会销毁 Servlet 实例!
(4)ServletConfig getServletConfig():这个方法返回 ServletConfig 对象,但我们不能自己去创建ServletConfig 对象,所以一般我们会在 init() 方法中把 init() 方法的参数保存起来,然后再在本方法中返回它。ServletConfig 对象对应 web.xml 中当前 Servlet 实例的配置信息。
(5)String getServletInfo():这个方法只是返回一个字符串,用来说明当前 Servlet。基本没用!
- 第一步:创建 web project 实现 Servlet 的接口
- 第二步:配置 servlet 的访问路径
- 新建工程
- 建包建类
- 编码(实现 Servlet 的接口,实现接口中的方法)(完整源码见文末)
- 配置 servlet 的访问路径(完整源码见文末)
- 部署项目到 tomcat 服务器
- 启动 tomcat
- 测试,在浏览器地址栏输入 http://localhost:8080/servlet_demo1/hello 的结果图
- 当 Tomcat 接收到请求(http://localhost:8080/servlet_demo1/hello )后,Tomcat 会找到 servlet_demo1 项目中的 web.xml 文件,然后通过 hello 这个请求路径,查找处理这个请求的 Servlet 类型。这刚好与<url-pattern>/hello</url-pattern> 匹配,这说明存在一个可以通过这个请求的 Servlet。然后再通过<url-pattern>/hello</url-pattern> 查找到 <servlet-name>helloServlet</servlet-name>,然后再通过<servlet-name>helloServlet </servle-name>查找到<servlet-class>com.rl.servlet/demo1</servlet-class>。这时 Tomcat 已经得到了一个 Servlet 类名字(一个字符串而已)。
- Tomcat 通过 Servlet 类名字去查找内存中是否存在 Servlet 对象,如果存在,那么就不用再去创建,直接获取这个 Servlet 实例,调用它的 service() 方法完成请求!
- 如果这个 Servlet 不存在,那么 Tomcat 会通过反射来创建 Servlet 实例,并把 Servlet 实例存放到 Servlet 池中,再去调用 Servlet 的 service 方法处理请求。
- 以上操作完整源码
demo1.java
web.xmlpackage com.wyx.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class demo1 implements Servlet { /** * 执行时机是 Servlet 的实例对象被销毁的时候调用,主要做一些收尾或清理的工作 */ public void destroy() { System.out.println("servlet 销毁了"); } /** * 获得 ServletConfig 的配置对象 */ public ServletConfig getServletConfig() { return null; } /** * 获得当前的 Servlet 的一些属性信息(了解) */ public String getServletInfo() { return null; } /** * 执行时机是当 Servlet 实例被创建的时候被调用,做初始化工作 ServletConfig:Servlet的配置对象,初始化的时候可以进行配置 */ public void init(ServletConfig arg0) throws ServletException { System.out.println("servlet组件被创建了"); } /** * 执行时机是当一个请求来请求当前的 Servlet 的时候被调用,处理当前的 Servlet 的业务逻辑并且把相应返回给浏览器 */ public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("相应请求"); response.getOutputStream().write("<font color='red'>你好,陌生人!</font>".getBytes()); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>servlet_demo</display-name> <servlet> <!-- 设置servlet的名字 --> <servlet-name>helloServlet</servlet-name> <!-- 具体的servlet的类 --> <servlet-class>com.wyx.servlet.demo1</servlet-class> </servlet> <servlet-mapping> <!-- 指定要映射 的servlet的名字 --> <servlet-name>helloServlet</servlet-name> <!-- servlet的具体映射路径 --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
如有错误,欢迎指正!