浅谈一下Servlet的定义以及运行原理

目录
  • 1.什么是servlet?
    • 1.1 扩展web服务器端功能
    • 1.2 servlet组件
  • 2.如何写一个servlet?
  • 3.servlet是如何运行的?
  • 4.常见问题
    • 4.1 状态码
    • 4.2 404
    • 4.3 500
    • 4.4 405

1.什么是servlet?

sun(oracle)公司制订的一种用来扩展web服务器端功能的组件规范。

背景:

常用的web服务器:

  • apache http Server
  • nginx:俄罗斯小伙子写的
  • IIS

以上服务器只能处理静态的资源请求。网页要提前写好,不能动态生成。

web服务器需要处理动态的资源请求。页面并不是提前写好,需要计算。我们的web服务器不能做到这一点,所以需要扩展。

1.1 扩展web服务器端功能

web服务器端(比如apache http webServer,nginx,iis等)只能够处理静态资源的请求,不能够处理动态资源的请求。所以需要扩展web服务器的功能来处理动态资源的请求。

注:静态资源,指的是需要事先将网页写好。动态资源:指的是需要经过计算,动态生成相应的网页。

注:servelet出现之前,如何处理这些动态的请求呢?早期使用CGI(Common GateWay Interface-通用网关接口)程序来扩展。CGI程序开发复杂,移植性差,很少用了

1.2 servlet组件

符合相应的规范,具有部分功能的,并且需要部署到相应的容器里面才能运行的软件模块。比如servlet就是一个组件,需要符合servlet规范,并且需要部署到servlet容器里面才能运行。

注:容器:符合相应的规范,提供组件运行环境的程序。比如Tomcat就是比较有名的servlet容器。jetty jboss weblogic都是servlet容器。这些servlet把网络相关的问题已经全部处理好,我们写servlet只需要关注业务逻辑即可。

2.如何写一个servlet?

写一个java类,需要实现Servlet接口或者继承HttpServlet类。编译。打包(将这个java类变成servlet组件)

注:创建一个具有如下结构的文件夹:

appname(文件夹名字,可以自定义) WEB-INF(appname下面的子文件夹,是固定的) classes(该文件夹放之前写好的java类的字节码文件)lib(里面放的是一些需要用到的jar包)web.xml(用来描述servlet)

部署:将第三部创建好的文件夹拷贝到servlet容器指定的文件夹下面。(注:可以将第三步创建好的文件夹先使用jar命令压缩成以".war"结尾的文件,然后再拷贝。)启动servlet容器,访问servlet。

http://ip:port/appname(文件夹的名字)/servlet-url(或者url-pattern,会在web.xml中描述)

3.servlet是如何运行的?

打开浏览器,输入http://ip:port/servlet01/hello

  1. 浏览器依据ip,port建立与容器(同时也是一个简单的web server)之间的连接。
  2. 浏览器将相关数据打包(按照http协议将相关数据创建一个请求数据包),然后发送请求。
  3. 容器 将请求数据包解析出来,然后将解析到的数据放到请求对象里面,同时还会创建一个响应对象response。
  4. 容器创建servlet对象,然后调用该对象的service方法。(注:容器会将request对象和response对象作为参数传进来。可以通过request对象获得请求参数值,并将处理结果写到response对象中。)
  5. 容器通过response获取处理结果,然后打包(响应数据包)发送给浏览器。
  6. 浏览器解析响应数据包,生成响应的页面。

4.常见问题

4.1 状态码

是一个三位数字,由http协议指定,表示服务器处理请求的状态。

4.2 404

  • 含义:服务器依据请求路径,找不到对应的资源。
  • 原因:

a.没有部署该应用。

b.servlet-name不一致。

c.路径写错。

4.3 500

  • 含义:系统出错(应用程序在运行中出错了)。
  • 原因: a.servlet类没有继承HttpServletb.servlet类出错,例如将不合法的字符串转换成数字。b.servlet类出错,例如将不合法的字符串转换成数字。

4.4 405

  • 含义:找不到service方法。
  • 原因:没有service方法。

到此这篇关于浅谈一下Servlet的定义以及运行原理的文章就介绍到这了,更多相关Servlet定义和运行原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaWeb ServletConfig作用及原理分析讲解

    目录 基本概念 servlet 关系 servletconfig 作用 使用 获取 config 基础信息 携带信息 基本概念 servlet 关系 servlet 和 servletconfig 是一对一的关系: servletconfig 作用 它存储 web.xml 内的 servlet 标签内的所有信息: tomcat 在解析 web.xml 中的标签时,就会自动把 servlet 标签包装到 servletconfig 里面去: 使用 获取 config 基础信息 首先我们手动创建一个

  • JavaWeb通过IDEA配置Servlet操作流程详解

    目录 创建项目 引入外部 jar 安装 mysql-connector 编写 servlet 文件 编写 student.html 文件 配置 tomcat 服务器 运行并查看服务器 创建项目 首先创建一个空项目!!!注意是空项目!!! 点击 文件->新建->新模块 ,新建一个名称为 servlet02 的模块(注意该模块的生成位置应该在我们刚刚新建的空项目下面!!!) 之后右键点击新模块 servlet02,选择 “添加框架支持” 勾选 “web 应用程序” ,之后直接点击完成即可自动生成

  • Java Servlet线程中AsyncContext异步处理Http请求

    目录 AsyncContext AsyncContext使用示例及测试 示例 测试结果 AsyncContext应用场景 背景 AsyncContext解决生产问题 AsyncContext AsyncContext是Servlet 3.0使Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet线程.在接收到请求之后,Servlet线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器.针对业务处理较耗时的情况,这将大大减少服务器

  • Java Servlet实现表白墙的代码实例

    目录 一.表白墙简介 二.代码实现 1.约定前后端交互的接口 2.后端代码实现 3.前端代码实现 三.效果演示 总结 一.表白墙简介 在表白墙页面中包含三个文本框,分别表示表白者,表白对象,表白内容,在文本框中输入内容之后,内容能够保存,并且在下次启动页面的时候也能显示出之前所保存的内容. 二.代码实现 1.约定前后端交互的接口 要实现表白墙,首先就需要约定前后端的交互接口,在实际开发过程中,前端人员只负责前端开发,后端人员负责后端开发,那么就需要约定前端发送什么样的请求,后端处理请求之后再以什

  • Java中Servlet的生命周期详解

    目录 Web基础和HTTP协议 什么是Servlet Servlet的生命周期 Web基础和HTTP协议 ┌─────────┐ ┌─────────┐ │░░░░░░░░░│ │O ░░░░░░░│ ├─────────┤ ├─────────┤ │░░░░░░░░░│ │ │ ├─────────┤ │ │ │░░░░░░░░░│ └─────────┘ └─────────┘ │ request 1 │ │─────────────────────>│ │ request 2 │ │───

  • ServletWebServerApplicationContext创建Web容器Tomcat示例

    目录 正文 创建Web服务 一.获取Web服务器工厂 1.1 选择导入Web工厂 二.getWebServer:获取Web服务 2.1 创建TomcatEmbeddedContext 2.2. 创建TomcatWebServer 2.2.1 启动Tomcat 初始化小结 startInternal:启动Internal NamingResources启动 Service启动 启动Engine 启动TomcatEmbeddedContext 启动Executor 启动MapperListener

  • JavaWeb Servlet生命周期细枝末节处深究

    目录 生命周期速览 优先级 servlet生命周期完整过程 servlet 所有核心方法解析 无参构造方法 init service destroy 适配器模式去除冗余接口 GenericServlet.java 生命周期速览 优先级 servlet 的声明周期由 tomcat 服务器自行管辖,程序员无法插手: 只要没有通过 url 访问 servlet,那他就永远不会先行实例化: 除非我们通过在 web.xml 的 servlet 标签下加上以下标签,即可立即实例化: </load-on-st

  • 浅谈PHP eval()函数定义和用法

    eval() 函数把字符串按照 PHP 代码来计算. 该字符串必须是合法的 PHP 代码,且必须以分号结尾. 如果没有在代码字符串中调用 return 语句,则返回 NULL.如果代码中存在解析错误,则 eval() 函数返回 false. 语法 eval(phpcode) 参数 描述 phpcode 必需.规定要计算的 PHP 代码.  提示和注释 注释:返回语句会立即终止对字符串的计算. 注释:该函数对于在数据库文本字段中供日后计算而进行的代码存储很有用. 例子 <?php $string

  • 浅谈shell数组的定义及循环

    shell中数组的定义及遍历,先直接看示例: #!/bin/sh #定义方法一 数组定义为空格分割 arrayWen=(a b c d e f) #定义方法二 arrayXue[0]="m" arrayXue[1]="n" arrayXue[2]="o" arrayXue[3]="p" arrayXue[4]="q" arrayXue[5]="r" #打印数组长度 echo ${#arr

  • 浅谈Java线程池是如何运行的

    异步编程工具在Android开发中目前最被推荐的就是Kotlin协程,在引入Kotlin协程机制前,除了响应式扩展(RxJava)兼任异步编程工具外,Java API中线程与线程池就是最重要异步编程手段.而对于Android平台的Kotlin协程实现来说,依然使用的是线程池来作为任务执行的载体,所以可以将Android平台的Kotlin协程简单的理解是对线程池的一种高度封装. Executors.newFixedThreadPool(10).asCoroutineDispatcher() Dis

  • 浅谈Java中的atomic包实现原理及应用

    1.同步问题的提出 假设我们使用一个双核处理器执行A和B两个线程,核1执行A线程,而核2执行B线程,这两个线程现在都要对名为obj的对象的成员变量i进行加1操作,假设i的初始值为0,理论上两个线程运行后i的值应该变成2,但实际上很有可能结果为1. 我们现在来分析原因,这里为了分析的简单,我们不考虑缓存的情况,实际上有缓存会使结果为1的可能性增大.A线程将内存中的变量i读取到核1算数运算单元中,然后进行加1操作,再将这个计算结果写回到内存中,因为上述操作不是原子操作,只要B线程在A线程将i增加1的

  • 浅谈Mybatis版本升级踩坑及背后原理分析

    1.背景 某一天的晚上,系统服务正在进行常规需求的上线,因为发布时,提示统一的pom版本需要升级,于是从 1.3.9.6 升级至 1.4.2.1. 当服务开始上线后,开始陆续出现了一些更新系统交互日志方面的报警,属于系统辅助流程,报警下图所示, 具体系统数据已脱敏,内容是Mybatis相关的报警,在进行类型转换的时候,产生了强转错误. 更新开票请求返回日志, id:{#######}, response:{{"code":XXX,"data":{"call

  • 浅谈Spring IoC容器的依赖注入原理

    本文介绍了浅谈Spring IoC容器的依赖注入原理,分享给大家,具体如下: IoC容器初始化的过程,主要完成的工作是在IoC容器中建立 BeanDefinition 数据映射,并没有看到IoC容器对Bean依赖关系进行注入, 假设当前IoC容器已经载入用户定义的Bean信息,依赖注入主要发生在两个阶段 正常情况下,由用户第一次向IoC容器索要Bean时触发 但我们可以在 BeanDefinition 信息中通过控制 lazy-init 属性来让容器完成对Bean的预实例化,即在初始化的过程中就

  • 浅谈SpringBoot内嵌Tomcat的实现原理解析

    一.序言 使用SpringBoot经常会使用内嵌的tomcat做为项目的启动容器,本文将从源码的角度出发,剖析SpringBoot内嵌Tomcat的实现原理,讨论Tomcat何时创建.何时启动以及怎么启动. 二.引入Tomcat组件 导入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId&

  • 浅谈Spring Cloud zuul http请求转发原理

    spring cloud 网关,依赖于netflix 下的zuul 组件 zuul 的流程是,自定义 了ZuulServletFilter和zuulServlet两种方式,让开发者可以去实现,并调用 先来看下ZuulServletFilter的实现片段 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) thr

  • 浅谈Scrapy网络爬虫框架的工作原理和数据采集

    今天小编给大家详细的讲解一下Scrapy爬虫框架,希望对大家的学习有帮助. 1.Scrapy爬虫框架 Scrapy是一个使用Python编程语言编写的爬虫框架,任何人都可以根据自己的需求进行修改,并且使用起来非常的方便.它可以应用在数据采集.数据挖掘.网络异常用户检测.存储数据等方面. Scrapy使用了Twisted异步网络库来处理网络通讯.整体架构大致如下图所示. 2.由上图可知Scrapy爬虫框架主要由5个部分组成,分别是:Scrapy Engine(Scrapy引擎),Scheduler

  • 浅谈利用JavaScript进行的DDoS攻击原理与防御

    分布式拒绝服务攻击(DDoS)攻击是一种针对网站发起的最古老最普遍的攻击.Nick Sullivan是网站加速和安全服务提供商CloudFlare的一名系统工程师.近日,他撰文介绍了攻击者如何利用恶意网站.服务器劫持和中间人攻击发起DDoS攻击,并说明了如何使用HTTPS以及即将到来的名为"子资源一致性(Subresource Integrity,简称SRI)"的Web新技术保护网站免受攻击. 现代网站的大部分交互都来自于JavaScript.网站通过直接向HTML中添加JavaScr

随机推荐