达内广州C++学院|c++培训|广州达内科技C++/C#培训|.NET培训|IT培训|达内广州岗顶中心 达内广州C++学院|c++培训|广州达内科技C++/C#培训|.NET培训|IT培训|达内广州岗顶中心
java程序员
 当前位置:主页 > 高端课程 > java程序员 >

Servlet

时间:2019-06-12  来源:未知  作者:广州达内培训

Servlet

服务器在接收到浏览器的请求后,会自动调用对应的逻辑代码进行请求处理。但是逻辑代码是由程序员编写并放到服务器中,那么服务器怎么知道该怎么调用并调用哪个类和哪个方法来进行请求处理?

程序员在编写代码的时候如果能够按照服务器能够识别的规则进行编写, 浏览器按照指定的规则进行发送请求,那么服务器就可以调用并执行响应的逻辑代码进行请求处理了。

Servlet 技术

狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。Servlet 运行于支持 Java 的应用服务器中。从原理上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。

s=>start: 请求
o1=>operation: Tomcat
o2=>operation: Servlet(封装的类)
e=>end: 响应输出 txt/html/json

s->o1->o2->e

特点

  • 运行在支持 java 的应用服务器上
  • Servlet 的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的servlet 进行请求处理。
  • 简单方便,可移植性强

使用

  1. 创建普通的 java 类并继承 HttpServlet
  2. 覆写 service 方法
  3. 在 service 方法中书写逻辑代码即可

URL 组成

服务器地址:端口号/虚拟项目名 /servlet注解的路径(配置的路径)

URI:虚拟项目名 /servlet 的别名

浏览器发送请求到服务器,服务器根据请求 URL 地址中的 URI 信息在 webapps 目录下找到对应的项目文件夹,然后在 web.xml 中检索对应的 Servlet,找到后调用并执行 Servlet。

  • DoGet 方法用于 GET 请求
  • DoPost 方法用于 POST 请求

Servlet 路径配置

通过对 Servlet 的调用流程学习,我们知道 web.xml 文件的配置是为了保护servlet。其实服务器应该调用哪个 servlet 进行请求的处理, 在浏览器的请求地址中写的很清楚。

注解配置

通过修改 Servlet 类上的注解,配置访问路径

  1. 精确匹配,一般作用于站点独特的几个路径,首页、登录、注册等等
    java @WebServlet("/hello")
  2. 路径匹配,一般用于产品页,新闻页面,百科页面一般用于大量相类似的页面
    java @WebServlet("/product/*")
  3. 扩展名匹配
    java @WebServlet("*.json")
  4. 匹配多个路径
    java @WebServlet(urlPatterns= {"/morepath","*.do","/more/*"})

web.xml 配置

web.xml 配置的作用是保护 Servlet。web.xml 位于 WebContent/WEB-INF/ 下。

  1. 配置方式一: 精确匹配
    ```xml

    my3
    com.bjsxt.servlet.MyServlet3


    my3
    /my3

    ```
  2. 配置方式二: 路径匹配
    ```xml

    my3
    com.bjsxt.servlet.MyServlet3


    my3
    /news/*

    ```
  3. 配置方式三: 扩展名匹配
    ```xml

    my3
    com.bjsxt.servlet.MyServlet3


    my3
    *.do

    ```

一个 Servlet 可有拥有多个 url-pattern 配置,但是一个 url-pattern 配置只能对应一个 servlet。
路径和扩展名匹配无法同时设置,比如 <url-pattern>/kata/*.jsp</url-pattern> 是非法的,如果设置,启动tomcat服务器会报错。

加载时机

服务器启动的时候会将 webapps 中部署好的项目统一进行加载,并完成对每个项目的 web.xml 文件的加载。

当一个 url 与多个 servlet 的匹配规则可以匹配时,则按照 "精确路径 > 最长路径>扩展名" 这样的优先级匹配到对应的servlet。

Servlet 生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

s=>start: Servlet 通过调用 init () 方法进行初始化。
o=>operation: Servlet 调用 service() 方法来处理客户端的请求。
e=>end: Servlet 通过调用 destroy() 方法终止(结束)。

s->o->e

最后,servlet 是由 JVM 的垃圾回收器进行垃圾回收的。接着让我们详细讨论生命周期的方法。

init() 方法

init() 方法被设计成只调用一次。它在第一次创建 servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。

servlet 创建于用户第一次调用对应于该 servlet 的 URL 时,但是您也可以指定 servlet 在服务器第一次启动时被加载。

当用户调用一个 servlet 时,就会创建一个 servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 servlet 的整个生命周期。

public void init() throws ServletException {
  // 初始化代码...
}

service() 方法

service() 方法是执行实际任务的主要方法。servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
      
}

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

doGet()

GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

doPost()

POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

destroy() 方法

destroy() 方法只会被调用一次,在 servlet 生命周期结束时被调用。destroy() 方法可以让您的 servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:

public void destroy() {
// 终止化代码...
}

构架图

下图显示了一个典型的 servlet 生命周期方案。

第一个到达服务器的 HTTP 请求被委派到 servlet 容器。servlet 容器在调用 service() 方法之前加载 servlet。然后 servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 servlet 实例的 service() 方法。




上一篇:length 和 size 区分
下一篇:没有了

友情链接:
  • 为Khronos OpenGL Registry提出的GL
  • KDE Plasma 5.17 开发升温,5.16 功能冻结
  • LLVM增加对IBM MASS库的支持,支持POWER向量化
  • KDE Frameworks 5.59 发布,带来更多修复
  • Ubuntu Touch即将更新Unity 8 + Mir,但还没有完全实现
  • RPM 4.15将以更好的性能和新功能将进入Fedora 31
  • Git 2.22 发布,围绕合并处理的改进
  • iOS 13将使删除已安装的应用程序变得非常容易
  • Linux Kernel 5.2-rc4 发布,相当平静的版本
  • Ubuntu MATE 19.10将默认使用GNOME MPV替换VLC播放器
  • Canonical发布所有支持的Ubuntu版本的Linux内核安全更新 - 适用
  • Qt 5.13进入发布候选阶段
  • 十字绣设计软件 KXStitch 2.2.0 发布,Ubuntu下安装方法
  • 2019亚洲天然及营养保健品展/HNC将于上海开幕
  • 一个妹子的美团面试经历,已成功拿到Offer
  • 做到如下4点,让用户不再讨厌你的广告
  • 类图的6大关系详解
  • 中国奢侈品消费者调研的关键发现
  • LibreOffice 6.3 Beta测试版发布,不再支持32位Linux发行版
  • springMVC -
  • Android Q Beta 4完成了开发者API SDK的开发
  • 【TIDB】4、业界使用情况
  • 如何配置Spring Boot Tomcat
  • 坑爹的 Java 可变参数,把我整得够惨。。
  • 《大型网站系统与Java中间件》读书笔记(上)
  • 乐字节Java8核心特性之Optional类
  • Java IO 输入和输出流
  • Guava Cache
  • 经典营销理论和跨国公司面临中国式挑战
  • 力软未来产品发展方向
  • 在印度销售、购买或持有虚拟货币可能导致最高10年的监禁
  • Oracle Java SE 组件概念图
  • Google Chrome 75.0.3770.80 发布,修复了42个安全问题
  • 2019最新Java教程 免费赠送
  • Spring框架的AOP编程,最通俗的语言解释,易懂易学
  • Java开发桌面程序学习(八)——启动浏览器或者打开资源管理器操
  • 笔记-JavaWeb学习之旅10
  • SpringBoot2.0 基础案例(02):配置Log4j2,实现不同环境日志打印
  • JDK动态代理
  • 利用idea创建一个基本的smm项目(带增删改查)
  • SpringBoot2.0 基础案例(03):配置系统全局异常映射处理
  • Java常见设计模式学习(非原创)
  • Java 总结篇1
  • 单例模式
  • 基于IDEA实现SSM整合框架的搭建配置流程
  • RabbitMQ 从入门到精通(二)
  • 工信部发放5G牌照,中国正式迈入5G商用元年
  • Java开发桌面程序学习(五)——文件选择器和目录选择器的使用
  • 2018年送彩金网站大全
  • 斗牛秘籍
  • 捕鱼游戏
  • 天下娱乐网
  • 捕鱼大作战
  • 免费注册送59元体验金
  • 葡京网站