Step1.情景概要

Hello,小伙伴们,好久不见,之前跟大家分享了三层架构与MVC思想,相信大家对于这两块内容有了相对清晰的个人认识了,既然我们讲到了MVC,这里我们接着这块内容继续往下深入,今天我们来看看MVC 中的V-VIEW 即我们所说的视图层。

Step2.视图技术

对于我们WEB开发人员来说,视图的概念应该都不会很陌生了,我们在浏览网页时见到的各种形式的页面内容,背后都离不开我们所用的视图技术,对于JAVA Web 开发人员来讲,页面展示实际上就是模板+数据=页面内容,所有的web页面基本离不开这两点,而我们常用的视图表现层技术不考虑这种H5页面的话,目前市面上用的比较多的基本上是JSP、Freemarker,或者Velocity,对于这三种常见的视图表现层技术,这里先来说说JSP。

Step3.JSP概念与应用场景

JSP(java server page ),故名思议,即在服务器端执行的页面,其实质为一个简化的servlet 它是在传统的网页HTML文件中插入Java程序段和JSP标记,从而形成JSP文件,后缀名为(*.jsp)。说了这么多实际上就是在HTML基础上加入JAVA 代码,运行在Tomcat(servlet)容器中的页面,最终项目发布后通过浏览器访问该页面后在浏览器输出的内容就是html ,是不是很简单呢。
   这里对于JSP ,概念中提到JSP 实质上就是Servlet ,只是JSP的出现解决了Servlet 的一个痛点问题,就是Servlet 页面内容输出是相对麻烦,特别是涉及到复杂的页面样式控制与JS 时,这时Servlet 就相对变的心有余而力不足了哦,这时JSP的出现,解决了Serlvet 的这一痛点问题,即:JSP 作为视图展示层显示页面内容更加方便!那说到这,JSP既然是Servlet ,那JSP 究竟是怎么执行的呢?

Step4.JSP执行过程剖析

这里在分析JSP 原理前,先来看下Serlvet 内部执行原理

  1. 客户端通过HTTP提出请求.
  2. Web服务器接收该请求并将其发给servlet。如果这个servlet尚未被加载,Web服务器将把它加载到Java虚拟机并且执行它。
  3. servlet将接收该HTTP请求并执行某种处理。
  4. servlet将向Web服务器返回应答。
  5. Web服务器将从servlet收到的应答发送给客户端。

运行简图如下:


看到这,大家应该对Servlet 执行过程一目了然了吧,然后我们继续往下看JSP 的运行原理


 
服务器具体是如何做到的?

  1. 用户通过浏览器发送请求
  2. tomcat服务器收到*.jsp请求,会到org.apache.jasper.servlet.JspServlet处理,(tomcat  web.xml) 里有对应处理jsp 请求具体配置


test01.jsp页面未被访问时,查看tomcat 下work 目录 截图如下:

当JSP页面第一次被请求时,JSP引擎会将JSP原始文件转换成Servlet源代码,然后调用Java编译器,编译成Servlet,并在Servlet引擎中执行。当再次有请求的时候,JSP引擎会见差异编译好的JSP是否比原来的JSP原始文件要新,如果是,运行Servlet;如果不是,表示文件已经更新的了,就会从新执行转换和编译的过程。
test01.jsp访问成功后进入文件再次查看

查看目录下具体生成的文件
 

简要查看生成的 test01_jsp.java 文件内容
 
查看tomcat 源码,查看HttpJspbase到底是什么???


 
至此,可以发现 HttpJspBase 就是继承了HttpServlet!!!
所以,到现在为止,我们可以这样理解,可以把jsp 看做一个servlet来对待!!!
既然jsp 就是一个servlet ,为何还要使用jsp?

我们在使用servlet 时,大家应该能够体会到在使用servlet 向浏览器输出页面内容时,并没有那么容易,同时当servlet 中涉及到的逻辑很复杂的时候,既要处理业务逻辑,又要控制页面数据的显示形式,这时候仅仅使用servlet来完成这些功能理论上可以实现,但对于项目的后期维护来说,工程量可能就是巨大的,于是业界就催生出了jsp(当然还有其他的技术 .net,php等)的技术,通过使用jsp技术,我们可以结合servlet ,将要显示的数据通过jsp 来进行展现,总结来说就是:

Servlet:
优点:逻辑处理方便 
缺点:页面表现麻烦
Jsp:
优点:页面表现方便
缺点:逻辑处理麻烦

所以要互补使用.一般项目采用:jsp+servlet+javabean 开发方式进行项目开发哦
好了,说到这,相信大家对JSP 视图展示层技术有了很清晰的认识,那另外的Velocity同样作为视图层技术又是怎么实现与使用的呢,哈哈,且听下次与大家分享。

JAVAEE企业级应用开发浅谈之MVC 中的V-VIEW视图的更多相关文章

  1. JAVAEE企业级应用开发浅谈第二辑:MVC和三层架构

    上海尚学堂警句:一份信心,一份努力,一份成功:十分信心,十分努力,十分成功. Step1.情景概要 Hello,小伙伴们,昨天跟大家分享了JAVA EE 企业级应用开发中大家耳熟能详的概念-三层架构, ...

  2. JAVAEE企业级应用开发浅谈第一辑

    不积跬步无以至千里,不积小流无以成江海 Step1.情景概要 作为一个JAVA WEB 开发人员,在开发web 项目时项目大家都有自己的一些新的体会,对于web 开发出现的一些比较经典的名词大家都会有 ...

  3. Android开发-浅谈架构(二)

    写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...

  4. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  5. 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...

  6. 浅谈 Swift 2 中的 Objective-C 指针

    浅谈 Swift 2 中的 Objective-C 指针 2015-09-07  499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...

  7. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  8. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  9. 转载 浅谈C/C++中的static和extern关键字

    浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T   static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...

随机推荐

  1. VS2008打上SP1的补丁后安装了silverlight后出现未将对象引用设置到对象实例的解决办法

    新建silverlight项目失败,提示 未将对象设置到实例 的解决办法: 1.打开 visual studio 命令提示 输入一下命令:2.devenv /resetskippkgs ,这条命令会启 ...

  2. 盯着这where or 终于出了点感觉

    AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录. 如果第一个条件和第二个条件中只要有 ...

  3. python 数据库mysql、redis及发送邮件

    python 关系型数据库链接使用--mysql import pymysql # 引用mysql模块 # 创建连接,指定数据库的ip地址,账号.密码.端口号.要操作的数据库.字符集coon = py ...

  4. Mac使用笔记大全

    1.mac中,怎么直接在当前文件夹打开终端? 步骤:(1)在键盘-快捷键-服务,勾选“新建位于文件夹位置的终端窗口”.(2)然后在需要打开终端的文件夹上,右键,“新建位于文件夹位置的终端窗口”即可. ...

  5. Gym - 101848B Almost AP 暴力

    题目链接:http://codeforces.com/gym/101848/problem/B 给出一串数字要你最多改动三个数字使这一串数字成为等差数列.因为最多改动三个数字所以可以先求出相邻两项的差 ...

  6. Unity3D 在Update中不要过多地修改Transform 信息

    前文说到碰撞检测时候,不要在Update内部尝试移动GameObject 来检查碰撞检测,这样是徒劳无功.但是 说到 因为你移动的过程中其实并没有将实际的移动位置更新到物理引擎,只是做了个缓存而已, ...

  7. Java--druidAPI查询

    maven依赖<dependency> <groupId>in.zapr.druid</groupId> <artifactId>druidry< ...

  8. 关于get和post请求的区别

    1.标准答案 GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被Bookmark,而POST不可以. GET请求会被浏览器主动cache,而POST不会,除非手动设 ...

  9. unittest_API自动化脚本应用

    import urllib.request import urllib.parse import json import unittest from HTMLTestRunner import HTM ...

  10. 手写简单PE

    环境工具:Windows 10 010Editor 目标程序功能: 调用MessageBoxA弹出消息框. 1.构造DOS头 typedef struct _IMAGE_DOS_HEADER { // ...