Servlet

Servlet是在 Java Web容器中运行的小程序,通常我们用Servlet来处理一些较为复杂的服务器端的业务逻辑。ServletJava EE的核心,也是所有的MVC框架的实现的根本!

基于Web.xml配置

Servlet3.0 之前的版本都需要在web.xml 中配置servlet标签servlet标签是由servletservlet-mapping标签组成的,两者之间通过在servletservlet-mapping标签中同样的servlet-name名称来实现关联的。

Servlet的定义

定义一个 Servlet 很简单,只需要继承javax.servlet.http.HttpServlet类并重写doXXX(如doGet、doPost)方法或者service方法就可以了,其中需要注意的是重写HttpServlet类的service方法可以获取到上述七种Http请求方法的请求。

javax.servlet.http.HttpServlet:

在写Servlet之前我们先了解下HttpServlet,javax.servlet.http.HttpServlet类继承于javax.servlet.GenericServlet,而GenericServlet又实现了javax.servlet.Servletjavax.servlet.ServletConfigjavax.servlet.Servlet接口中只定义了servlet基础生命周期方法:init(初始化)getServletConfig(配置)service(服务)destroy(销毁),而HttpServlet不仅实现了servlet的生命周期并通过封装service方法抽象出了doGet/doPost/doDelete/doHead/doPut/doOptions/doTrace方法用于处理来自客户端的不一样的请求方式,我们的Servlet只需要重写其中的请求方法或者重写service方法即可实现servlet请求处理。

javax.servlet.http.HttpServlet类:

img

TestServlet示例代码:

  1. package com.anbai.sec.servlet;
  2. import javax.servlet.http.HttpServlet;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. /**
  8. * Creator: yz
  9. * Date: 2019/12/14
  10. */
  11. // 如果使用注解方式请取消@WebServlet注释并注释掉web.xml中TestServlet相关配置
  12. //@WebServlet(name = "TestServlet", urlPatterns = {"/TestServlet"})
  13. public class TestServlet extends HttpServlet {
  14. @Override
  15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
  16. doPost(request, response);
  17. }
  18. @Override
  19. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
  20. PrintWriter out = response.getWriter();
  21. out.println("Hello World~");
  22. out.flush();
  23. out.close();
  24. }
  25. }

请求TestServlet示例:

image-20191214150238924

Servlet Web.xml配置

定义好了Servlet类以后我们需要在web.xml中配置servlet标签才能生效。

基于配置实现的Servlet:

image-20191214142745856

Servlet 3.0 基于注解方式配置

基于注解的Servlet:

值得注意的是在 Servlet 3.0 之后( Tomcat7+)可以使用注解方式配置 Servlet 了,在任意的Java类添加javax.servlet.annotation.WebServlet注解即可。

基于注解的方式配置Servlet实质上是对基于web.xml方式配置的简化,极大的简化了Servlet的配置方式,但是也提升了对Servlet配置管理的难度,因为我们不得不去查找所有包含了@WebServlet注解的类来寻找Servlet的定义,而不再只是查看web.xml中的servlet标签配置。

15

Servlet 3.0 特性

  1. 新增动态注册ServletFilterListener的API(addServletaddFilteraddListener)。
  2. 新增@WebServlet@WebFilter@WebInitParam@WebListener@MultipartConfig注解。
  3. 文件上传支持,request.getParts()
  4. 非阻塞 IO,添加异步 IO
  5. 可插拔性(web-fragment.xmlServletContainerInitializer)。