一、Servlet 介绍
Servlet是一个接口,定义了Java类被浏览器访问的规则,我们可以自己定义类实现Servlet接口,重写方法达到处理请求的需求。
二、Servlet 的使用
1、Servlet 的实现
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2、配置Servlet
使用 Servlet 必须要在 web.xml 文件里进行配置,给 Servlet 绑定相应的 url
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>web.servlet.myServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
3、注解配置
//@WebServlet(name = "MyServlet", urlPatterns = "MyServlet")
//value 和 urlPatterns 的作用一样,但不能同时出现
//@WebServlet(urlPatterns = "MyServlet")//省略了name
@WebServlet("/MyServlet")//默认value
public class MyServlet implements Servlet {}
- 一个 Servlet 可以定义多个访问路径:@WebServlet({"/AServlet","/BServlet","/CServlet"})
- 支持多层路径:@WebServlet("/demo/MyStar")
- 使用通配(任何目录):@WebServlet("/*")
- 使用通配(带后缀):@WebServlet("*.do")
三、Servlet 的工作原理
-
当服务器接收到 Servlet 请求后,会解析它的 url 地址
-
到 web.xml 文件,匹配对应的<url-pattern>
-
如果<url-pattern>匹配成功后,通过name找到全类名
-
Tomcat 将字节码文件加载进内存,并创建其对象
-
调用该方法
四、Servlet 的生命周期
1、被创建:执行 init 方法,只执行一次
-
默认情况下,第一次被访问时,Servlet 会被创建
-
因为init只执行一次,所以Servlet对象只有一个,是共享资源,所以是线程不安全的,尽量不要在Servlet中定义成员变量,即使定义了也不要对值进行修改
-
Servlet 创建时机可以在配置中用<load-on-startup>(负数第一次访问才创建,0或正数服务器启动就会创建)标签进行修改
2、提供服务:执行 server 方法,可以执行多次
-
每次访问 Servlet 时,Servlet 方法都会被调用一次
3、被销毁:执行 destory 方法,只执行一次
-
Servlet 销毁时执行,只有服务器正常关闭时,才会执行 destory 方法
五、Servlet 应用
在实际开发中,我们一般不会直接去实现 Servlet 接口中的方法,而是选择继承Servlet 接口的抽象子类 GenericServlet 类或者 GenericServlet 的抽象子类 HttpServlet 类,实现 service() 方法的。
1、GenericServlet 类
GenericServlet 类 将 Servlet 中除 service() 以外的方法都做了空实现,继承 GenericServlet 类只需要实现 service() 方法即可,但需要判断请求是 get 还是 post 方法。
2、HttpServlet 类
HttpServlet 类继承于 GenericServlet 类,其目的就是为了简化 GenericServlet 类每次实现service() 方法时都需要判断请求方式的繁琐操作。HttpServlet 对 HTTP 协议进行了封装,操作者只需要根据请求方式重写 doGet 或 doPost 方法。
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//具体的逻辑代码
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//具体的逻辑代码
}
}