Servlet 工作原理解析
- 格式:pdf
- 大小:1.27 MB
- 文档页数:17
1、jsp和servlet的区别、共同点、各自应用的范围??JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。
JSP编译后是“类servlet”。
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑。
在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.2、cookie和session的作用、区别、应用范围,session的工作原理Cookie:主要用在保存客户端,其值在客户端与服务端之间传送,不安全,存储的数据量有限。
Session:保存在服务端,每一个session在服务端有一个sessionID作一个标识。
存储的数据量大,安全性高。
占用服务端的内存资源。
3、jstl是什么?优点有哪些??JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,由四个定制标记库(core、format、xml和sql)和一对通用标记库验证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。
优点有:最大程序地提高了WEB应用在各应用服务器在应用程序服务器之间提供了一致的接口,最大程序地提高了1、在应用程序服务器之间提供了一致的接口,之间的移植。
2、简化了JSP和WEB应用程序的开发。
3、以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet 代码的程序。
在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。
4、允许JSP设计工具与WEB应用程序开发的进一步集成。
相信不久就会有支持JSTL的IDE 开发工具出现。
4、j2ee的优越性主要表现在哪些方面?MVC模式a、J2EE基于JAVA技术,与平台无关b、J2EE拥有开放标准,许多大型公司实现了对该规范支持的应用服务器。
Struts的原理和优点.Struts工作原理MVC即Model—View—Controller的缩写,是一种常用的设计模式。
MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。
MVC的工作原理,如下图1所示:Struts 是MVC的一种实现,它将Servlet和JSP 标记(属于J2EE 规范)用作实现的一部分。
Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展.Struts的工作原理,视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
控制:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。
ActionServlet是一个通用的控制组件。
这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。
它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。
另外控制组件也负责用相应的请求参数填充Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。
动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。
最后动作类把控制权传给后续的JSP 文件,后者生成视图。
所有这些控制逻辑利用Struts-config.xml文件来配置。
模型:模型以一个或多个java bean的形式存在。
这些bean分为三类:Action Form、Action、JavaBean or EJB.Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。
Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
jsp的运行原理
JSP(Java Server Pages)是一种用于动态生成网页的技术,其运行原理如下:
1. 客户端(浏览器)发送一个HTTP请求到服务器,请求访问一个JSP页面。
2. 服务器接收到请求后,通过Web容器(如Tomcat)将JSP 页面转化为一个Servlet。
3. Servlet容器编译并加载Servlet,并创建一个Servlet实例。
4. Servlet实例执行JSP页面的代码,生成动态内容。
5. 生成的动态内容被发送回服务器。
6. 服务器将生成的动态内容作为HTTP响应发送回客户端。
7. 客户端接收到HTTP响应并将其显示在浏览器中。
在JSP运行过程中,以下是一些关键点:
- JSP页面中的Java代码会被编译并转化为相应的Servlet类。
这个过程只发生一次,即在第一次请求JSP页面时发生。
之后的请求会直接使用已编译的Servlet类。
- JSP页面中的HTML、JavaScript等静态内容会直接返回给客户端,而不需要进行编译。
- JSP页面中的动态内容是通过嵌入的Java代码和JSP标签来实现的,这些代码会在运行时被执行。
- Servlet容器负责管理和执行Servlet的生命周期,并处理与客户端的通信。
- JSP支持标签库(Taglib)的使用,可以方便地封装和重用一些常见的功能。
总之,JSP通过将Java代码嵌入在HTML页面中,使得开发人员可以方便地生成动态内容,并以网页形式呈现给用户。
jsp工作原理是什么
JSP(Java Server Pages)是一种基于Java技术的动态网页开发技术,其工作原理如下:
1. 首先,Web服务器接收到一个请求,该请求需要由JSP处理。
例如,一个用户在浏览器中输入了一个URL,指向一个JSP页面。
2. 服务器接收到请求后,JSP引擎将请求传递给JSP编译器。
JSP编译器将JSP页面编译成一个Java Servlet。
3. 编译得到的Java Servlet代码被JSP引擎加载到内存中,并创建一个实例对象。
4. 每当有一个新的请求到达时,服务器会创建一个新的线程来处理该请求。
该线程会调用JSP的_service()方法来处理请求。
5. 执行服务方法时,JSP引擎将生成的Servlet代码逐行解释执行。
JSP页面中的Java代码会被转换成Java语句,这些语句会在运行时被执行。
6. JSP引擎将动态生成的内容转换为HTML,并将响应返回给客户端。
客户端可以是浏览器,也可以是其他应用程序。
总结来说,JSP工作原理是将JSP页面转换为Java Servlet,并由Java Servlet来处理请求和生成动态的内容。
通过动态生成的HTML,JSP能够根据不同的请求生成不同的响应。
servlet的init方法一、init()方法的作用init()方法是Servlet生命周期中的一个阶段,在Servlet被容器初始化时调用。
它的主要作用是进行一些初始化工作,例如加载配置文件、建立数据库连接等。
通过init()方法,我们可以在Servlet启动时完成一些必要的准备工作,确保Servlet在处理请求时能够正常运行。
二、init()方法的使用方式在Servlet类中,我们需要重写init()方法,以实现自定义的初始化操作。
init()方法有一个参数,类型为javax.servlet.ServletConfig,用于获取Servlet的配置信息。
在init()方法中,我们可以通过调用getInitParameter()方法获取web.xml文件中配置的初始化参数,从而获取一些必要的配置信息。
例如,我们可以在web.xml中配置数据库的连接信息,然后在init()方法中读取这些配置信息,建立数据库连接。
这样,在Servlet启动时,我们就可以预先建立好数据库连接,以提高后续处理请求的效率。
三、init()方法的注意事项1. init()方法在Servlet的整个生命周期中只会被调用一次。
当Servlet第一次被请求时,容器会调用init()方法进行初始化工作。
之后,只要Servlet处于运行状态,容器就不会再次调用init()方法。
2. init()方法在处理请求之前被调用,因此在init()方法中执行的操作不会对每个请求产生影响。
例如,在init()方法中建立的数据库连接是共享的,多个请求可以共享同一个连接。
3. init()方法的执行顺序是由Servlet容器决定的,并不是我们可以控制的。
因此,在编写代码时,不要依赖于init()方法的执行顺序。
4. 如果需要在每个请求中进行一些初始化操作,可以考虑使用service()方法。
service()方法会在每个请求到达时被调用。
5. init()方法在Servlet启动时执行,因此如果存在一些耗时的操作,应该尽量避免在init()方法中执行。
request.getScheme() 返回当前链接使用的协议,比如,一般应用返回http或https。
这是基于网络协议的规定和HTTP/HTTPS的使用原理。
HTTP(Hypertext Transfer Protocol)是一种应用层协议,用于在网络中传输超文本(例如网页)。
它最早于1980年代开发,经过多年的发展,目前版本是HTTP/2。
HTTPS(Hypertext Transfer Protocol Secure)则是HTTP的安全版本,它在HTTP的基础上通过SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议进行加密,以保护传输的数据的安全性。
当一个网页请求被发起时,浏览器会向服务器发送一个包含请求头(Request Header)的请求,其中就包含了请求的协议类型。
服务器接收到请求后,会解析请求头,根据协议类型来处理请求。
在Java的Servlet中,可以使用HttpServletRequest对象的getScheme()方法来获取当前链接使用的协议类型。
在程序中的应用如下:
```java
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
```
这样就可以根据不同的协议类型来生成相应的URL,从而适应不同的需求。
servlet执⾏流程和⽣命周期⼀、servlet执⾏流程:⼆、⽣命周期:Servlet的⽣命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。
1、初始化阶段调⽤init()⽅法 2、响应客户请求阶段。
调⽤service()⽅法,由service()⽅法根据提交的⽅式选择执⾏doGet()或者doPost()⽅法 3、终⽌阶段 调⽤destroy()⽅法1、创建servlet实例:在默认情况下Servlet实例是在第⼀个请求到来的时候创建,以后复⽤。
如果有的Servlet需要复杂的操作需要载初始化时完成,⽐如打开⽂件、初始化⽹络连接等,可以通知服务器在启动的时候创建该Servlet的实例。
具体配置如下:<servlet><servlet-name>TimeServlet</servlet-name><servlet-class>com.allanlxf.servlet.basic.TimeServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>创建servlet对象的相关类结构:2、初始化⼀旦Servlet实例被创建,Web服务器会⾃动调⽤init(ServletConfig config)⽅法来初始化该Servlet。
其中⽅法参数config中包含了Servlet 的配置信息,⽐如初始化参数,该对象由服务器创建。
I.如何配置Servlet的初始化参数?在web.xml中该Servlet的定义标记中,⽐如:<servlet><servlet-name>TimeServlet</servlet-name><servlet-class>com.allanlxf.servlet.basic.TimeServlet</servlet-class><init-param><param-name>user</param-name><param-value>username</param-value></init-param><init-param><param-name>blog</param-name><param-value>http://。
简述web的工作原理。
Web 的工作原理可以被概括为六个步骤,分别是:1. 请求 (Request):当用户在浏览器中输入网址并按下“Enter”键时,浏览器会向服务器发送 HTTP 请求。
2. 响应 (Response):服务器接收到请求后,会生成一个 HTTP 响应,响应中包含请求的文件,如 HTML 文件、图像文件、CSS 文件、JavaScript 文件等。
3. 缓存 (Cache):浏览器会缓存已经获取的文件,以便在下一次请求时更快地响应。
4. 解析 (Parsing):浏览器会解析 HTML、CSS 和 JavaScript 文件,并将其渲染在屏幕上。
5. 渲染 (Rendering):浏览器会根据 HTML、CSS 和 JavaScript 文件的内容,生成页面,并将其渲染在屏幕上。
6. 交互 (Interaction):用户可以与页面进行交互,例如点击链接、输入文本、查看图片等。
下面是 Web 工作原理的详细解释:1. 请求 (Request):当用户在浏览器中输入网址并按下“Enter”键时,浏览器会向服务器发送 HTTP 请求。
浏览器首先查找地址栏,如果找到相应的网址,则会使用 HTTP 协议向服务器发送请求。
HTTP 请求通常包括请求方法 (例如GET、POST、PUT、DELETE 等)、请求头 (包括请求类型、请求 URI、User-Agent 等) 和请求体 (包括数据)。
2. 响应 (Response):服务器接收到请求后,会生成一个 HTTP 响应。
HTTP 响应包括状态码 (例如 200 表示成功,404 表示找不到文件等)、响应头 (包括响应类型、响应 URI、Content-Type 等) 和响应体 (包括文件内容)。
服务器通常会在响应中包含一些元数据,如文件大小、创建时间、修改时间等,以便浏览器可以更好地渲染页面。
3. 缓存 (Cache):浏览器会缓存已经获取的文件,以便在下一次请求时更快地响应。
DispatcherServlet作⽤DispatcherServlet作⽤DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,⽽且负责职责的分派,⽽且与 Spring IoC 容器⽆缝集成,从⽽可以获得 Spring 的所有好处。
DispatcherServlet 主要⽤作职责调度⼯作,本⾝主要⽤于控制流程,主要职责如下:1. ⽂件上传解析,如果请求类型是 multipart 将通过 MultipartResolver 进⾏⽂件上传解析;2. 通过 HandlerMapping,将请求映射到处理器(返回⼀个 HandlerExecutionChain,它包括⼀个处理器、多个 HandlerInterceptor 拦截器);3. 通过 HandlerAdapter ⽀持多种类型的处理器(HandlerExecutionChain 中的处理器);4. 通过 ViewResolver 解析逻辑视图名到具体视图实现;5. 本地化解析;6. 渲染具体的视图等;7. 如果执⾏过程中遇到异常将交给 HandlerExceptionResolver 来解析DispathcherServlet配置详解<servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!-- servlet-mapping --><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping>load-on-startup:表⽰启动容器时初始化该 Servlet;url-pattern:表⽰哪些请求交给 Spring Web MVC 处理, "/" 是⽤来定义默认 servlet 映射的。
1 / 17 Servlet工作原理解析 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产的结果。从技术角度来说是为了解耦,通过标准化接口来相互协作。既然接口是连接 Servlet 与 Servlet 容器的关键,那我们就从它们的接口说起。 前面说了 Servlet 容器作为一个独立发展的标准化产品,目前它的种类很多,但是它们都有自己的市场定位,很难说谁优谁劣,各有特点。例如现在比较流行的 Jetty,在定制化和移动领域有不错的发展,我们这里还是以大家最为熟悉 Tomcat 为例来介绍 Servlet 容器如何管理 Servlet。Tomcat 本身也很复杂,我们只从 Servlet 与 Servlet 容器的接口部分开始介绍。 Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。 图 1 . Tomcat 容器模型
从上图可以看出 Tomcat 的容器分为四个等级,真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程,在 Tomcat 的配置文件中可以很容易发现这一点,如下: 清单 1 Context 配置参数 reloadable="true" /> 下面详细介绍一下 Tomcat 解析 Context 容器的过程,包括如何构建 Servlet 的过程。
Servlet 容器的启动过程
Tomcat7 也开始支持嵌入式功能,增加了一个启动类 org.apache.catalina.startup.Tomcat。创建一个实例对象并调用 start 方法就可以很容易启动 Tomcat,我们还可以通过这个对象来增加和修改 Tomcat 的配置参数,如可以动态增加 2 / 17
Context、Servlet 等。下面我们就利用这个 Tomcat 类来管理新增的一个 Context 容器,我们就选择 Tomcat7 自带的 examples Web 工程,并看看它是如何加到这个 Context 容器中的。 清单 2 . 给 Tomcat 增加一个 Web 工程 Tomcat tomcat = getTomcatInstance(); File appDir = new File(getBuildDirectory(), "webapps/examples"); tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath()); tomcat.start(); ByteChunk res = getUrl("http://localhost:" + getPort() + "/examples/servlets/servlet/HelloWorldExample"); assertTrue(res.toString().indexOf("
接下去将会调用 Tomcat 的 start 方法启动 Tomcat,如果你清楚 Tomcat 的系统架构,你会容易理解 Tomcat 的启动逻辑,Tomcat 的启动逻辑是基于观察者模式设计的,所有的容器都会继承 Lifecycle 接口,它管理者容器的整个生命周期,所有容器的的修改和状态的改变都会由它去通知已经注册的观察者(Listener),关于这个设计模式可以参考《 Tomcat 的系统架构与设计模式,第二部分:设计模式》。Tomcat 启动的时序图可以用图 2 表示。
上图描述了 Tomcat 启动过程中,主要类之间的时序关系,下面我们将会重点关注添加 examples 应用所对应的 StandardContext 容器的启动过程。 当 Context 容器初始化状态设为 init 时,添加在 Contex 容器的 Listener 将会被调用。ContextConfig 继承了 LifecycleListener 接口,它是在调用清单 3 时被加入到 StandardContext 容器中。ContextConfig 类会负责整个 Web 应用的配置文件的解析工作。 4 / 17
ContextConfig 的 init 方法将会主要完成以下工作: 1. 创建用于解析 xml 配置文件的 contextDigester 对象 2. 读取默认 context.xml 配置文件,如果存在解析它 3. 读取默认 Host 配置文件,如果存在解析它 4. 读取默认 Context 自身的配置文件,如果存在解析它 5. 设置 Context 的 DocBase ContextConfig 的 init 方法完成后,Context 容器的会执行 startInternal 方法,这个方法启动逻辑比较复杂,主要包括如下几个部分: 1. 创建读取资源文件的对象 2. 创建 ClassLoader 对象 3. 设置应用的工作目录 4. 启动相关的辅助类如:logger、realm、resources 等 5. 修改启动状态,通知感兴趣的观察者(Web 应用的配置) 6. 子容器的初始化 7. 获取 ServletContext 并设置必要的参数 8. 初始化“load on startup”的 Servlet
Web 应用的初始化工作
Web 应用的初始化工作是在 ContextConfig 的 configureStart 方法中实现的,应用的初始化主要是要解析 web.xml 文件,这个文件描述了一个 Web 应用的关键信息,也是一个 Web 应用的入口。 Tomcat 首先会找 globalWebXml 这个文件的搜索路径是在 engine 的工作目录下寻找以下两个文件中的任一个 org/apache/catalin/startup/NO_DEFAULT_XML 或 conf/web.xml。接着会找 hostWebXml 这个文件可能会在 System.getProperty("catalina.base")/conf/${EngineName}/${HostName}/web.xml.default,接着寻找应用的配置文件 examples/WEB-INF/web.xml。web.xml 文件中的各个配置项将会被解析成相应的属性保存在 WebXml 对象中。如果当前应用支持 Servlet3.0,解析还将完成额外 9 项工作,这个额外的 9 项工作主要是为 Servlet3.0 新增的特性,包括 jar 包中的 META-INF/web-fragment.xml 的解析以及对 annotations 的支持。 接下去将会将 WebXml 对象中的属性设置到 Context 容器中,这里包括创建 Servlet 对象、filter、listener 等等。这段代码在 WebXml 的 configureContext 方法中。下面是解析 Servlet 的代码片段: 清单 4. 创建 Wrapper 实例 for (ServletDef servlet : servlets.values()) { Wrapper wrapper = context.createWrapper(); String jspFile = servlet.getJspFile(); if (jspFile != null) { wrapper.setJspFile(jspFile); } if (servlet.getLoadOnStartup() != null) { wrapper.setLoadOnStartup(servlet.getLoadOnStartup().intValue()); }