资讯专栏INFORMATION COLUMN

JavaWeb从0开始学(一)-----第一个Web应用程序与JSP工作原理

CloudDeveloper / 3122人阅读

摘要:当后继请求相同的页面时,容器加载之前生成的类,并且通知去执行已经存在的字节码,从而省去了转换的过程,这也是第一次执行页面时间较长的原因。

以往学习的时候大多是看完书或者看完视频,动手实践一下就OK了。然而过了一段时间我发现东西都忘差不多了,需要复习才能重新掌握。现在开始学习JavaWeb了,我将在这里记录自己的学习的一点一滴,不仅便于自己以后回顾知识点,也希望能对JavaWeb初学者有所帮助。文章的内容主要是我对李刚老师的《轻量级JavaEE企业应用实战》一书的学习总结。本系列文章为Java新手的学习总结,大神请自动路过。

JSP/Servlet是Java EE规范的两个基础成员,也是Java EE开发的基础知识,同时也是Java Web开发的重点知识。JSP与Servlet的本质相同,JSP最终必须编译成Servlet才能运行。JSP的特点就是在HTML代码中嵌入Java代码或者使用各种JSP标签,动态的提供页面内容。

(一)创建第一个Web应用

在开始学习之前首先需要搭建Tomcat服务器,关于服务器的搭建请自行百度。我选择的集成开发环境是Idea。下面我将手动建立一个Web应用:

在任一目录下新建名为myFirstWebApp的文件夹

在myFirstWebApp文件夹内新建一个名为WEB-INF的文件夹(注意区分大小写)

在WEB-INF文件夹下新建一个名为class和一个名为lib的文件夹

打开Tomcat的webapps文件夹,将任一示例的Web应用的WEB-INF下的web.xml文件复制到WEB-INF目录下

将该文件根元素内的其他节点全部删除,修改后的XML文件如下所示:



在myFirstWebApp目录下新建一个index.jsp文件,注意是jsp格式,使用记事本打开该文件添加以下内容:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

  
    我的第一个Web应用
  
  
        Hello,my first WebApp!
  

这个文件实际上就是一个静态HTML页面但与之略有不同,项目部署成功以后,我们可以通过浏览器访问这个页面。

至此,我们就构建完成了一个基本的Web应用。myFirstWebApp是Web项目对应文件夹的名字。classes与lib文件夹的作用一致,都是用于保存Web应用所需要的Java类文件,其中classes文件夹用于保存单个的.class文件,lib文件夹用于保存打包的JAR文件。web-xml文件被称为配置描述符,它的作用将在下面作详细介绍。index.jsp是Web项目在有多个JSP页面时首先访问的页面,它其实就是一个静态页面,我们可以通过浏览器访问它。

下面我们将在Tomcat服务器上部署这个这个应用:

将该Web应用复制到Tomcat的webapps路径下,这样Web应用就可以自动部署到Tomcat服务器中。

启动Tomcat,对于Windows平台,只需要双击Tomcat安装路径下bin目录中的startup.bat文件即可启动Tomcat。

使用浏览器访问http://localhost:8080/myFirst...。

你会看到刚才那个HTML代码被浏览器渲染了

如果看到如下显示则表示我们的已经成功把Web应用部署到Tomcat上了。

(二)配置描述符web.xml

web.xml文件对于整个项目十分重要。在servlet2.5之前,每个Java Web应用必须包含一个web.xml文件且必须是在WEB-INF目录下。但是从servlet3.0开始,此文件夹不再是必须的,但是为了同一性,通常我们还是保留这个文件。web.xml有很多配置管理作用,以后会逐步学到。

web.xml文件的根元素是,在Servlet3.0中新增了metadata-complete属性:该属性接受true和false两个值,为true时,该Web应用将不会加载注解配置的Web组件(Servlet、Filter、Listener)。

在web.xml文件中配置首页使用welcome-file-list元素,该元素包含多个welcome-file子元素,每个元素匹配一个首页。

    
    index.html
    index.htm
    index.jsp

依次匹配每个页面,不存在就使用下一个,以此类推。

其实每个Web容器都会提供一个系统的web.xml文件,用于描述所有Web应用共同的配置属性。在Tomcat中,web.xml文件放在了conf路径下。

(三)JSP的基本原理

JSP的本质就是Servlet。当用户向指定的Servlet发送请求时,Servlet利用输出流动态的生成HTML页面。其实,在每次的输出流中存在大量的静态文本,这些都极大的拖累了Servlet的开发效率。随着JSP的出现,JavaWeb的开发效率大大提高:JSP通过在HTML代码中嵌套java代码,从而使静态的部分不再需要Java程序控制,Java只控制那些需要从数据库读取或者需要动态生成的内容页面。

所以,一个JSP页面内容一般由静态和动态两个部分组成。静态的部分就是一般的HTML代码,动态的就是<% %>包裹的Java代码,看起来JSP页面与Java类没有任何关系,其实JSP的本质依然是Servlet(一个特殊的类)。JSP页面由系统编译成Servlet,由Servlet响应用户的请求。由此可见,每个JSP页面就是一个Servlet实例,是Servlet的简化,因为每个页面都会被Servlet容器生成对应的Servlet类。

JSP页面的基本工作原理如下:
首先由客户端发起请求,JSP服务器判断被请求的页面是否是第一次收到请求,如果是,则先编译JSP文件,生成对应的Servlet来响应请求,返回标准的HTML页面。如果不是,那么表示该JSP页面已有对应的Servlet,则会根据请求动态的生成HTML代码返回给客户端。

下面深入学习一下JSP的运行原理:
一个JSP运行体系至少包括Web服务器、JSP引擎和JVM三个部分,其运行过程如下图所示:

用户从客户端向Web服务器发送请求时,服务器端首先判断该请求是否包含JSP内容,如果只是请求HTML页面,则直接把结果返回给客户端,完成服务器端的响应工作。如果请求还包含JSP内容,那么先传递给JSP/Servlet引擎,该引擎解释请求页面中的JSP标记和脚本,把源代码转换为以".java"为后缀的Servlet代码,并且传送给JVM;JVM把这些Servlet代码编译成以".class"为后缀的可执行字节码文件,并且存放在服务器上,接着执行字节码,然后把结果传送给JSP引擎,JSP引擎再把结果传递给Web服务器,最后Web服务器把结果以HTML页面的形式传送给客户端,完成服务器端的响应工作。

当后继请求相同的JSP页面时,JSP容器加载之前生成的Servlet类,并且通知JVM去执行已经存在的字节码,从而省去了转换的过程,这也是第一次执行JSP页面时间较长的原因。在JSP执行期间,JSP容器会检查JSP文件,看是否有更新,如果有更新,JSP容器会再次编译JSP或Servlet。

现在我们学会了如何建立一个web项目和了解了JSP的基本工作原理,接下来我们将学习JSP的基本语法和编译指令。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66754.html

相关文章

  • JavaWeb0开始(二)-----JSP基本语法编译指令

    摘要:下面我们再打开对应的文件,我们会看到如下部分内容静态测试调用我是文件,我被文件调用了我们发现,在该包含文件被引入处那条语句被执行了。 在上一节中我们学习了如何搭建一个简单的Web应用,并且已经知晓了一个JSP页面主要由静态的HTML内容和动态的Java脚本共同组成。JSP的基本语法共有JSP注释、JSP声明、输出JSP表达式与JSP程序片段四种,用来控制动态向页面输出内容的。现在我们就...

    fancyLuo 评论0 收藏0
  • 终于,我还是下决心Java后台了

    摘要:我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了。最近计划学习后台,因为最近接了私活的问题,好多都要后台和前端一起做。 我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了。最近计划学习Java后台,因为最近接了私活的问题,好多都要Java后台和前端一起做。平常我在做什么,当然是忙着赚钱了 除了敲代码,你还有什么副业吗?接了活自己还要找开发Java后台开发的,为什么我自己不会呢...

    Zoom 评论0 收藏0
  • 终于,我还是下决心Java后台了

    摘要:我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了。最近计划学习后台,因为最近接了私活的问题,好多都要后台和前端一起做。 我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了。最近计划学习Java后台,因为最近接了私活的问题,好多都要Java后台和前端一起做。平常我在做什么,当然是忙着赚钱了 除了敲代码,你还有什么副业吗?接了活自己还要找开发Java后台开发的,为什么我自己不会呢...

    BlackHole1 评论0 收藏0
  • 终于,我还是下决心Java后台了

    摘要:我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了。最近计划学习后台,因为最近接了私活的问题,好多都要后台和前端一起做。 我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了。最近计划学习Java后台,因为最近接了私活的问题,好多都要Java后台和前端一起做。平常我在做什么,当然是忙着赚钱了 除了敲代码,你还有什么副业吗?接了活自己还要找开发Java后台开发的,为什么我自己不会呢...

    Null 评论0 收藏0
  • 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    摘要:系列文章请查看超详细的面试题总结一之基础知识篇超详细的面试题总结二之基础知识篇超详细的面试题总结三之集合篇常见问题下面的都是自己之前在学习的时候总结的,对于巩固的基础知识应该有很大帮助。注意多线程的并发的读写类属性会导致数据不同步。 系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(...

    Leo_chen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<