Java Servlet总结

文章目录


Java Web 的核心底层技术是Jave Servlet (Java 服务器小程序),是一个基于Java技术的Web组件,运行在服务器端,由Servlet容器所管理(Servlet不能独立运行,它必须部署到Servlet容器中,由容器来实例化和调用Servlet的方法),用于生成动态的内容。
Servlet容器有时候也叫做 Servlet引擎。
后期JSP技术推出后,管理和运行Servlet/JSP的容器,也称为Web容器。

支持JSP的服务器很多,Tomcat,Resin,Weblogic,WebSphere等,
Tomcat,Resin 开源免费。Weblogic,WebSphere 重量级服务器,价格昂贵。

JAVA EE 规范 — Servlet开发规范

如何可以开发一个被用户进行远程调用的Java类

  1. Servlet规范中,只有【Servlet接口】的实现类才可以被用户通过浏览器进行访问;
  2. 根据当前用户使用的请求方式,重写【Servlet接口】中的doGet/doPost方法(服务方法,相当于main)
  3. 通知Tomcat,告诉它当前网站中存在了可以被用户远程访问的Java类;

【Servlet实现类】与【Servlet接口】的关系 -【源码分析】

HttpServlet 的 源码在: javax.servlet-api.3.0.1-source.jar 包中;

【Servlet实现类】extends HttpServlet
HttpServlet extends GenericServlet
GenericeServlet implements Servlet接口

Web工程中,Java类文件存放在哪里?

/WEB-INF/classes

Tomcat是如何管理【Servlet实现类】 -----【生命周期】

  1. 【Servlet实现类】的实例对象的创建
  1. 在一个Web工程中,所有的【Servlet实现类】都只能由Tomcat负责创建
    没有任何一个new xxxServlet()这种写法;
  1. Tomcat在何时创建了【Servlet实现类】的实例对象
  1. 【默认情况】,只有当第一个用户来访问当前【Servlet实现类】时,
    此时Tomcat才会创建Servlet的实例对象
  2. 【人工干预】,指定对应的【Servlet实现类】在Tomcat启动时被创建: 添加下面的配置
    作用:通知Tomcat在启动时创建该Servlet的实例对象;


    (默认为0,设置的值大于0,就会在启动的时候创建)

    ***********load-on-startup>的值越小,创建的优先级就越高
  1. 在Tomcat运行期间,如果一个【Servlet】被多个用户进行访问时,此时Tomcat会为【Servelet】创建多少个实例对象
    【结论】:在Tomcat运行期间,一个【Servelet实现类】只能被创建一个实例对象;
  2. 【Servlet实现类】的实例对象何时被销毁
    开发人员没有权利销毁Servlet,在Tomcat关闭之前,由Tomcat负责销毁掉所有的实例对象

【Servlet的请求路径写法】四种写法

  1. 具体请求路径写法:
    OneServlet
    /test/one
    【含义】:如果当前请求从网络名称后面截取的【请求路径】,与当前请求路径完全一致,说明当前用户请求的是这个Servlet
    例子:
    http://localhost:8080/myWeb/test/one ok
    http://localhost:8080/myWeb/bb/test/one 不予理睬

  2. 前置条件请求路径写法:
    OneServlet
    /test/*
    【含义】:如果当前请求从网站名称后面截取的【请求路径】以“/test/”为开头,表示本次请求是OneServlet; *代表任意字符串,包括没有;
    例子:
    http://localhost:8080/myWeb/test/meimei.jpg ok
    http://localhost:8080/myWeb/bb/test/one 不予理睬
    http://localhost:8080/myWeb/test/ ok

  3. 后置条件请求路径写法:一定不能以斜线开头,习惯把Servlet资源后缀名默认为.do
    OneServlet
    *.do
    【含义】:如果当前请求从网站名称后面截取的【请求路径】,以".do"为结尾,表示本次请求是OneServlet
    例子:
    http://localhost:8080/myWeb/test/one.do ok
    http://localhost:8080/myWeb/test/one.do?name=mike ok
    http请求协议包:
    【请求行】:
    请求地址:http://localhost:8080/myWeb/test/one.do
    请求方式:get
    【请求头】{name:mike}
    【空白行】
    【请求体】

  4. 通配符请求路径:
    OneServlet【吃瓜群众】
    /*
    【含义】:对于当前网站任何资源的请求都要交给当前的Servlet
    例子:
    http://localhost:8080/myWeb/test/one.htm ok
    http://localhost:8080/myWeb/bb/test/one.do ok
    http://localhost:8080/myWeb ok

四种请求路径执行的优先级

http://localhost:8080/myWeb/test/one.do
【具体请求路径】>【前置条件】>【通配符条件】>【后置条件】

Servlet中使用工具对象 -----------HttpServletRequest

  1. 开发人员,习惯于将【HttpServletRequest类型修饰的对象】称为【请求对象】
  2. 【请求对象】只能由Tomcat负责创建,并把它作为参数传入到当前Servlet中的服务方法(doGet/doPost)
  3. 通过【请求对象】可以读取当前【请求协议包中的内容】
  • 【请求对象】读取【请求协议包中内容】
    【请求行】:请求文件地址
    使用的请求方式
    【请求头】和【请求体】:请求参数

  • 中文参数乱码问题:
    【原因】:
    浏览器采用【GET】发送请求,请求参数保存在【请求头】,【请求头】中的内容是由Tomcat来负责组装,Tomcat 9.0默认使用的字符集utf-8
    浏览器采用【POST】发送请求,请求参数保存在【请求体】,【请求体】内容是由请求对象负责组装的。请求对象默认使用 ISO-8859-1(欧洲语境的内容)

【解决方案】:
针对【post】方式:在request进行装箱操作之前,为其指定正确的字符集: 用下面的代码
request.setCharacterEncoding(“utf-8”)
request.getParameter(“参数名”)

老版本Tomcat,【get】方式,通知Tomcat使用正确的字符集
修改Tomcat/conf/server.xml,增加一个下面红色的属性:

上一篇:有了这个 4.5 万 Star 的工具,可在浏览器中运行最强编辑器 VS Code!


下一篇:springboot-vue-demo部署笔记