码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Servlet面试题


    Servlet面试题

      • servlet的生命周期
      • servlet的线程安全问题
        • 如何解决?
      • get 与 post 区别

    servlet的生命周期

    1. servlet初始化—init()方法
      ①第一次创建Servlet时调用,只会执行一次初始化
      ②默认是第一次处理请求时创建Servlet,也可以设置为服务器第一次启动时就创建Servlet

      public void init() throws ServletException {
      	// 初始化代码...
      }
      
      • 1
      • 2
      • 3
    2. servlet处理请求:service()方法
      ①处理来自浏览器的请求,将处理后的结果响应给浏览器
      ②servlet接收到请求后,调用service方法来进行处理,service中针对不同的请求进行匹配,选择调用doPost或doGet等方法
      ③在编写servlet时,需要实现doPost/doGet等方法

      protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          String method = req.getMethod();
          long lastModified;
          if (method.equals("GET")) {
      		//处理get请求
              }
          } else if (method.equals("HEAD")) {
             
          } else if (method.equals("POST")) {
              this.doPost(req, resp);
          } else if (method.equals("PUT")) {
              this.doPut(req, resp);
          } else if (method.equals("DELETE")) {
              this.doDelete(req, resp);
          } else if (method.equals("OPTIONS")) {
              this.doOptions(req, resp);
          } else if (method.equals("TRACE")) {
              this.doTrace(req, resp);
          } else {
          	//其他
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    3. servlet长时间没有被调用或服务器关闭,会调用destroy()方法销毁servlet,由JVM垃圾回收器来回收servlet
      destroy方法只会执行一次
      执行后,该servlet被标记为垃圾,等待回收

    servlet的线程安全问题

    servlet不是线程安全的

    servlet是单例的,初始化后,只有长时间不再接受请求或容器关闭时,这个servlet才会销毁,多个请求线程都访问的是这一个servlet

    一个servlet在处理第一次请求前进行实例化,初始化。或在容器启动时初始化(需要设置)
    后续调用这个servlet的请求,都是独立的线程来调用service方法,存在线程安全问题

    如何解决?

    1. 不在servlet中使用成员变量,线程之间没有资源竞争,线程安全

    2. 使用ThreadLocal为每个线程提供一份独立的变量

    3. 给处理请求的方法加锁;造成阻塞

      protected synchronized void doGet(HttpServletRequest req, HttpServletResponse resp) 
      								throws ServletException, IOException {
      }
      
      • 1
      • 2
      • 3
    4. 实现SingleThreadModel接口;会为每个用户创建一个servlet实例,性能差(已弃用)

      public class DormServlet extends HttpServlet implements SingleThreadModel
      
      • 1

    get 与 post 区别

    HTTP请求默认使用get

    getpost
    参数在url中参数在 resquest body 请求体中
    有长度限制没有长度限制
    暴露在url中,不安全隐藏在请求体中,安全
    只能url编码支持多种编码
    产生一个TCP数据包产生两个TCP数据包
    获取服务器中的数据修改服务器上的数据

  • 相关阅读:
    mybatis-plus异常:dynamic-datasource can not find primary datasource
    靠差异化上了短剧“牌桌”后,百度准备怎么做生态?
    【分布式技术专题】「架构实践于案例分析」盘点高并发场景的技术设计方案和规划
    哪些PHP开源作品值得关注
    [python][flask] Flask 图片上传与下载例子(支持漂亮的拖拽上传)
    vagrant设置磁盘大小
    Linux操作系统使用及C高级编程
    sqlflow简介,在线版:使用sqlflow,本地版:在windows上安装sqlflow
    【蓝桥杯冲击国赛计划第7天】模拟和打表 {题目:算式问题、求值、既约分数、天干地支}
    哈希表搜索简介
  • 原文地址:https://blog.csdn.net/lanleihhh/article/details/125486539
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号