官方阐明:Servlet 是运行在 Web 做事器或运用做事器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户真个要乞降 HTTP 做事器上的数据库或运用程序之间的中间层

大略来说,servlet是运行在web做事器如tomcat,jetty这样运用做事器上的一段程序,他可以相应http协议的要求,并且实现用户自己的逻辑,终极将结果返回到用户的客户端(浏览器)

Java Servlet 常日情形下与利用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。
但是比较于 CGI,Servlet 有以下几点上风:

jsp之前JSP的前生当代 GraphQL

1、性能明显更好。

2、Servlet 在 Web 做事器的地址空间内实行。
这样它就没有必要再创建一个单独的进程来处理每个客户端要求。

3、Servlet 是独立于平台的,由于它们是用 Java 编写的。

4、做事器上的 Java 安全管理器实行了一系列限定,以保护做事器打算机上的资源。
因此,Servlet 是可信的。

5、Java 类库的全部功能对 Servlet 来说都是可用的。
它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

Servlet的生命周期

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

1、Servlet 通过调用 init () 方法进行初始化。

2、Servlet 调用 service() 方法来处理客户真个要求。

3、Servlet 通过调用 destroy() 方法终止(结束)。

4、末了,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的

init() 方法

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

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

service() 方法

service() 方法是实行实际任务的紧张方法。
Servlet 容器(即 Web 做事器)调用 service() 方法来处理来自客户端(浏览器)的要求,并把格式化的相应写回给客户端。

每次做事器吸收到一个 Servlet 要求时,做事器会产生一个新的线程并调用做事。
service() 方法检讨 HTTP 要求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

destroy() 方法

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

在调用 destroy() 方法之后,servlet 工具被标记为垃圾回收。

JSP是什么?

JSP全称Java Server Pages,是一种动态网页开拓技能。
它利用JSP标签在HTML网页中插入Java代码
标签常日以<%开头以%>结束。

JSP是一种Java servlet,紧张用于实现Java web运用程序的用户界面部分。
网页开拓者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中通报掌握信息和共享信息。

servlet和jsp的差异

1、Servlet在Java代码中可以通过HttpServletResponse工具动态输出HTML内容。

2、JSP是在静态HTML内容中嵌入Java代码,然后Java代码在被动态实行后天生HTML内容。

servlet和jsp各自的特点

1、Servlet虽然能够很好地组织业务逻辑代码,但是在Java源文件中,由于是通过字符串拼接的办法天生动态HTML内容,这样就随意马虎导致代码掩护困难、可读性差。

2、JSP虽然规避了Servlet在天生HTML内容方面的劣势,但是在HTML中混入大量、繁芜的业务逻辑。

MVC的出身

JSP和Servlet都有自身的适用环境,那么有没有什么办法能够让它们发挥各自的上风呢?答案是肯有的,MVC模式就能够完美办理这一问题。

MVC模式,是Model-View-Controller的简称,是软件工程中的一种软件架构模式,分为三个基本部分,分别是:模型(Model)、视图(View)和掌握器(Controller):

Controller——卖力转发要求,对要求进行处理

View——卖力界面显示

Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现

在JSP/Servlet开拓的软件系统中,这三个部分的描述如下所示:

MVC模型

1、Web浏览器发送HTTP要求到做事端,然后被Controller(Servlet)获取并进行处理(例如参数解析、要求转发)

2、Controller(Servlet)调用核心业务逻辑——Model部分,得到结果

3、Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容

4、动态天生的HTML内容返回到浏览器显示

MVC模式在Web开拓中有很大的上风,它完美规避了JSP与Servlet各自的缺陷,让Servlet只卖力业务逻辑部分,而不会天生HTML代码;同时JSP中也不会充斥着大量的业务代码,这样大大提高了代码的可读性和可掩护性。

干系口试题

如何读取Servlet的初始化参数?

ServletConfig中定义了如下的方法用来读取初始化参数的信息:

public String getInitParameter(String name)

参数:初始化参数的名称。
返回:初始化参数的值,如果没有配置,返回null。

init(ServletConfig)方法实行次数

在Servlet的生命周期中,该方法实行一次。

service()方法的职责

service()方法为Servlet的核心方法,客户真个业务逻辑该当在该方法内实行,范例的做事方法的开拓流程为:

解析客户端要求-〉实行业务逻辑-〉输出相应页面到客户端

get办法和post办法有何差异

数据携带上:

GET办法:在URL地址后附带的参数是有限定的,其数据容量常日不能超过1K。

POST办法:可以在要求的实体内容中向做事器发送数据,传送的数据量无限制。

要求参数的位置上:

GET办法:要求参数放在URL地址后面,以?的办法来进行拼接

POST办法:要求参数放在HTTP要求包中

用场上:

GET办法一样平常用来获取数据

POST办法一样平常用来提交数据

缘故原由:

首先是由于GET办法携带的数据量比较小,无法带过去很大的数量

POST办法提交的参数后台更加随意马虎解析(利用POST办法提交的中文数据,后台也更加随意马虎办理)

GET办法比POST办法要快

Servlet干系 API

HttpServletRequest:封装了与要求干系的信息

HttpServletResponse:封装了与相应干系的信息

获取页面的元素的值有几种办法,分别说一下

request.getParameter() 返回客户真个要求参数的值

request.getParameterNames() 返回所有可用属性名的列举

request.getParameterValues() 返回包含参数的所有值的数组

request.getAttribute()和request.getParameter()差异

用场上:

request.getAttribute(), 一样平常用于获取request域工具的数据(在跳转之前把数据利用setAttribute来放到request工具上)

request.getParameter(), 一样平常用于获取客户端提交的参数

存储数据上:

request.getAttribute()可以获取Objcet工具

request.getParameter()只能获取字符串(这也是为什么它一样平常用于获取客户端提交的参数)

forward和redirect的差异

实际发生位置不同,地址栏不同

转发是发生在做事器的

转发是由做事器进行跳转的,细心的朋友会创造,在转发的时候,浏览器的地址栏是没有发生变革的,在我访问Servlet111的时候,纵然跳转到了Servlet222的页面,浏览器的地址还是Servlet111的。
也便是说浏览器是不知道该跳转的动作,转发是对浏览器透明的。
通过上面的转发时序图我们也可以创造,实现转发只是一次的http要求,一次转发中request和response工具都是同一个。
这也阐明了,为什么可以利用request作为域工具进行Servlet之间的通讯。

重定向是发生在浏览器的

重定向是由浏览器进行跳转的,进行重定向跳转的时候,浏览器的地址会发生变革的。
曾经先容过:实现重定向的事理是由response的状态码和Location头组合而实现的。
这是由浏览器进行的页面跳转实现重定向会发出两个http要求,request域工具是无效的,由于它不是同一个request工具

用法不同:

很多人都搞不清楚转发和重定向的时候,资源地址究竟怎么写。
有的时候要把运用名写上,有的时候不用把运用名写上。
很随意马虎把人搞晕。
记住一个原则: 给做事器用的直接从资源名开始写,给浏览器用的要把运用名写上

request.getRequestDispatcher("/资源名 URI").forward(request,response)

转发时"/"代表的是本运用程序的根目录【zhongfucheng】

response.send("/web运用/资源名 URI");

重定向时"/"代表的是webapps目录

能够去往的URL的范围不一样:

转发是做事器跳转只能去往当前web运用的资源

重定向是做事器跳转,可以去往任何的资源

通报数据的类型不同

转发的request工具可以通报各种类型的数据,包括工具

重定向只能通报字符串

跳转的韶光不同

转发时:实行到跳转语句时就会急速跳转

重定向:全体页面实行完之后才实行跳转

范例的运用处景:

转发: 访问 Servlet 处理业务逻辑,然后 forward 到 jsp 显示处理结果,浏览器里 URL 不变

重定向: 提交表单,处理成功后 redirect 到另一个 jsp,防止表单重复提交,浏览器里 URL 变了