Servlet

Servlet是Java Servlet的简称,Servlet可以看作是JavaEE中Web服务端开发的一个标准,主要功能在于交互式地浏览和生成数据,生成动态Web内容。可以看作Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
image.png

Servlet生命周期

  • 实例化 - 通过classLoader加载类,然后实例化该对象,对于一个符合J2EE标准的服务器,一个servlet的类,只产生一个servlet对象(也可以设置每次请求都创建一个新对象)
  • 初始化 - init()方法,init 方法被设计成只调用一次(init(servletcofig) servletconfig这个参数记录了Servlet的配置信息)
  • 处理请求- Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务
  • 销毁- destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。

    一个典型生命周期

  • 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器

  • Servlet 容器在调用 service() 方法之前加载 Servlet 对象
  • Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法

    1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/217875/1588816642251-0518a8b6-3ee3-413d-994e-17f33abf24b1.png#align=left&display=inline&height=380&margin=%5Bobject%20Object%5D&name=image.png&originHeight=380&originWidth=474&size=58696&status=done&style=none&width=474)

    Session使用

    ```java public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      // 如果不存在 session 会话,则创建一个 session 对象
      HttpSession session = request.getSession(true);
      // 获取 session 创建时间
      Date createTime = new Date(session.getCreationTime());
      // 获取该网页的最后一次访问时间
      Date lastAccessTime = new Date(session.getLastAccessedTime());
    
      //设置日期输出的格式  
      SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    
      String title = "Servlet Session 实例 - 菜鸟教程";
      Integer visitCount = new Integer(0);
      String visitCountKey = new String("visitCount");
      String userIDKey = new String("userID");
      String userID = new String("Runoob");
      if(session.getAttribute(visitCountKey) == null) {
          session.setAttribute(visitCountKey, new Integer(0));
      }
    
    // 检查网页上是否有新的访问者
    if (session.isNew()){
        title = "Servlet Session 实例 - 菜鸟教程";
         session.setAttribute(userIDKey, userID);
    } else {
         visitCount = (Integer)session.getAttribute(visitCountKey);
         visitCount = visitCount + 1;
         userID = (String)session.getAttribute(userIDKey);
    }
    session.setAttribute(visitCountKey,  visitCount);
 }

<a name="n8D8Y"></a>
### Cookie使用<br />
```java
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        Cookie name = new Cookie("name",
                URLEncoder.encode(request.getParameter("name"), "UTF-8")); // 中文转码
        Cookie url = new Cookie("url",
                      request.getParameter("url"));

        name.setMaxAge(60*60*24); 
        url.setMaxAge(60*60*24); 

        response.addCookie( name );
        response.addCookie( url );

        response.setContentType("text/html;charset=UTF-8");
    }

Filter过滤器

Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,主要有以下功能:

  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。

一般我们可以使用Filter实现以下功能

  • 身份验证过滤器
  • 数据的加密或者编码
  • 日志记录

    生命周期

  • 实例化与初始化 - 与servlet对象一样只会产生一个

  • 执行过滤操作 - 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法
  • 销毁

    异常处理

    ExceptionHandler,定义不同类型错误的默认返回

参考
https://github.com/hollischuang/Interview/blob/master/contents/4_JavaWeb.md
https://www.cnblogs.com/tengpan-cn/p/4908964.html
https://www.ibm.com/developerworks/cn/java/j-lo-servlet/
https://www.runoob.com/servlet/servlet-life-cycle.html
Destory被调用的时间
https://www.jianshu.com/p/ac09b3c52870

Tomcat

tomcat是一个servlet容器,可以把tomcat简单的认为一个用于处理连接请求,管理servlet的生命周期的进程。tomcat安装后的目录结构如下:
image.png

  • bin: 动态连接库和管理tomcat的脚本文件
  • conf: 服务器配置文件,最主要的就是service.xml,里面配置了服务器默认监听额端口号
  • lib: 存放jar包
  • log: 存放服务器log文件
  • webapps: 存放网站文件包括静态文件与servlet文件
  • work  存放JSP生成的Servlet源文件和字节码文件

Hello World

tomcat采用线程池的方式来并发处理请求,默认配置为:

  • maxThreads:处理的最大并发请求数,默认值200
  • minSpareThreads:最小线程数始终保持运行,默认值25
  • maxConnections:在给定时间接受和处理的最大连接数,默认值10000

相关主题:
Jetty:https://www.ibm.com/developerworks/cn/web/wa-lo-jetty/?mhq=jetty
Jetty: https://www.ibm.com/developerworks/cn/java/j-lo-jetty/?mhq=jetty
tomcat配置: https://www.cnblogs.com/tengpan-cn/p/4693231.html
官方文档:https://tomcat.apache.org/tomcat-9.0-doc/index.html
https://www.cnblogs.com/GtShare/p/8033637.html
http://how2j.cn/k/tomcat/tomcat-tutorial/541.html
https://www.jianshu.com/p/2f4a2bca088c