达内广州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 区分
下一篇:Java 基础知识

友情链接:
  • 全球最大晶圆代工半导体制造厂,台积电斥资订购艾斯摩尔机器设备
  • 英特尔依然是那个英特尔,且看英特尔的城防体系
  • 支持双 DRAM 内存接口,慧荣企业级 SSD 主控方案披露
  • 在全球被反垄断罚款,冤!高通到底哪里得罪了欧盟?
  • 强强联合!万业、微电子所和芯鑫共同打造全新半导体设备
  • 复旦大学校长称:对于集成电路产业发展,大学应该主动担当
  • 技术再升级!无锡中科芯攻克晶圆级再布线及晶圆级凸点制备关键技
  • 聚力!万业企业设立集成电路装备集团,提供自主可控设备
  • 德州仪器C2000微控制器增强连通性和控制性
  • 英特尔打出降价策略,以免被竞争对手 AMD 打败?
  • 贸易摩擦的闹剧没有赢家,苹果有勇气离开中国吗?
  • 图像信号与视觉处理器的发展趋势
  • 真干快消品定位方案班(第二期)火热开班
  • Java集合 ArrayList原理及使用
  • TDD(测试驱动开发)死了吗?
  • JAVA基础之XML相关
  • javaweb项目搭建ehcache缓存系统
  • 每日一码——字符串统计
  • 一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生
  • 九:模板方法模式
  • 十二:命令模式(人员解耦和)
  • Java 转PPT为图片、PDF、SVG、XPS、ODP以及PPT和PPTX互转
  • SpringCloud学习(SPRINGCLOUD微服务实战)一
  • 记一次微信网页授权后获取用户信息并重定向
  • 速途新营销五点实战洞察解码“品效合一”
  • 十一:外观模式详解(Service,action与dao)
  • 手把手教你学会 基于JWT的单点登录
  • mysql锁机制总结,以及优化建议
  • 解决多个版本jar包冲突【jar内包名重命名】
  • 中国首张5G终端电信设备进网许可证 华为Mate 20 X 5G版入网
  • RPC之Thrift
  • 高级Java工程师必备 ----
  • 天猫618期间实物支付GMV增长38.5%
  • 换季了,老板你的库存处理好了吗?
  • 从“618”大数据看中国消费新活力
  • 小米生态链:贵在格局感与收放度
  • CODING 2.0 企业级持续交付解决方案
  • 老铁奇趴“新京济” 快手*京东618战报出炉
  • 中小企业新媒体运营基本技能
  • 上汽大通房车再度携手LINE FRIENDS 魔都巡游顺利开启
  • 华为高端手机国内市场份额超苹果夺得榜首
  • 中国智能制造分析报告
  • iPlus艾加营销助力腾讯广告牵手吴晓波 推进商业IP变现
  • 2019世界新能源汽车大会7月1日将在海南举行
  • 区域酒企如何转型突围
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载