--------------------------servlet的概述-------------------------------------
- Servlet概述
1 JavaWeb三大组件
Servlet是JavaWeb三大组件之一,它是我们学习JavaWeb最为基本的组件,也就是说你一定要100%的掌握它。
其它两种:Filter(拦截器)、Listener(观察者模式),后续讲解
2 Servlet的作用
Servlet,即Server Let的意思,用来处理用户请求。当客户端发出请求后,由Tomcat去找到可以处理这一请求的Servlet来处理。
也就是说,用户的请求是由Servlet来处理的!例如用户发出登录请求,那么就应该由处理登录的Servlet来处理;用户发出登录请求,那么就应该有登录Servlet来处理。
2·实现一个servlet
servlet 是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。也就是说,Servlet是由我们自己来完成的!但Servlet一定要实现javax.servlet.Servlet接口,并且还要在web.xml文件中部署!不然Tomcat是找不到我们写的Servlet的。
Servlet接口
javax.servlet.Servlet接口中方法如下:
- void init(ServletConfig servletConfig):当Tomcat创建Servlet实例后,马上调用init()方法。这个方法只在创建后调用一次!用来做Servlet初始化工作!一个Servlet实例只被创建一次,所以init()方法也只被调用一次!(本方法编写对Servlet的初始化代码)
- void service(ServletRequest request, ServletResponse response):Servlet实例在每次处理请求时都调用service()方法。
- void destroy():当Tomcat要销毁Servlet实例时,会先调用destroy()方法,再销毁它。所谓销毁Servlet,其实就是在Servlet缓存池中把Servlet移除!一般只有Tomcat关闭时,才会销毁Servlet实例!
- ServletConfig getServletConfig():这个方法返回ServletConfig对象,但我们不能自己去创建ServletConfig对象,所以一般我们会在init()方法中把init()方法的参数保存起来,然后再在本方法中返回它。ServletConfig对象对应web.xml中当前Servlet实例的配置信息。
- String getServletInfo():这个方法只是返回一个字符串,用来说明当前Servlet。基本没用!
- 第一步:常见HelloServlet实现Servlet的接口,实现接口中的方法
package com.rl.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 LoginServlet implements Servlet { /** * servlet的销毁方法 */ @Override public void destroy() {
}
/** * servlet的 */ @Override public ServletConfig getServletConfig() { return null; }
/** * 获得servlet的基本信息 */ @Override public String getServletInfo() { return null; }
/** * servlet的初始化方法 */ @Override public void init(ServletConfig arg0) throws ServletException {
}
@Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { response.getOutputStream().write("I am login...".getBytes()); }
} |
- 第二步:配置servlet的访问路径
<servlet> <servlet-name>login</servlet-name> <servlet-class>com.rl.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/logon</url-pattern> </servlet-mapping> |
当我们写好了LoginServlet类后,还需要在web.xml文件中添加上面的内容。
JavaWeb请求响应原理如下:
当Tomcat接收到请求(http://localhost:8080/servlet_pro/logon)后,Tomcat会找到servlet_pro项目中的web.xml文件,然后通过logon这个请求路径,查找处理这个请求的Servlet类型。这刚好与<url-pattern>/logon</url-pattern>匹配,这说明存在一个可以通过这个请求的Servlet。然后再通过<url-pattern>/logon </url-pattern>查找到<servlet-name>login</servlet-name>,然后再通过<servlet-name>login </servle-name>查找到<servlet-class>com.rl.servlet.LoginServlet</servlet-class>。这时Tomcat已经得到了一个Servlet类名字(一个字符串而已)。
Tomcat通过Servlet类名字去查找内存中是否存在Servlet对象,如果存在,那么就不用再去创建,直接获取这个Servlet实例,调用它的service()方法完成请求!
如果这个Servlet不存在,那么Tomcat会通过反射来创建Servlet实例,并把Servlet实例存放到Servlet池中,再去调用Servlet的service方法处理请求。
实现servlet例子:
首先创建servlet实现类
package com.rl.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 ServletDemo1 implements Servlet {
/** * 执行时机:是Servlet的实例对象被销毁的时候调用 * 做一些收尾或清理的工作 */ @Override public void destroy() { System.out.println("Servlet组件销毁了"); }
/** * 获得当前的ServletConfig的配置对象 * @return */ @Override public ServletConfig getServletConfig() { return null; }
/** * 获得当前的Servlet的一些属性信息(了解) * @return */ @Override public String getServletInfo() { return null; }
/** * 执行时机:当Servlet实例被创建的时候被调用,做初始化工作 * @param arg0 * @throws ServletException:Servlet的配置对象,初始化的时候可以配置 */ @Override public void init(ServletConfig arg0) throws ServletException { System.out.println("servlet组件被创建了"); }
/** * 执行时机:当一个请求来请求当前Servlet的时候被调用 * 处理当前Servlet的业务逻辑并且把响应返回给浏览器 * @param request 请求对象 * @param response 响应对象 * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("响应请求"); //响应一段字符串 response.getOutputStream().write("<font color='red'>hello Servlet</font>".getBytes()); }
} |
再配置web.xml文件信息
<?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_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>servlet_demo1</display-name> <servlet> <!-- 设置servlet的名字 使用英文 --> <servlet-name>helloServlet</servlet-name> <!-- 具体的servlet的类 --> <servlet-class>com.rl.servlet.ServletDemo1</servlet-class> </servlet>
<!-- servlet映射 注意的是servlet和servlet-mapping两个元素是成对出现的 --> <servlet-mapping> <!-- 指定要映射的Servlet的名字 必须和servlet中的名字保持一致 --> <servlet-name>helloServlet</servlet-name> <!-- servlet的具体映射路径 --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> |
启动tomcat服务器,会打印出init方法和service方法的信息
在浏览器中访问servlet_demo1项目,http://localhost:8080/项目名/web.xml中映射下的<url-pattern>/hello</url-pattern>