曾经风光无限的 JSP,为什么现在很少有人使用了?
来源 | 愚公要移山(ID:fdd_sxu_nwpu)
jsp技术作为曾经一度火爆的技术,在最近几年确实使用率越来越低了,这篇文章带你一块探究一下jsp的从生到死。
jsp技术的诞生
在很久很久以前,那时候我们的开发都是通过servlet来完成的,这个servlet是什么呢?我们先来认识一下:
servlet用Java语言编写的服务器端程序。主要功能是和浏览器进行交互,生成页面展示。
长下面这个样子:
我们可以看到前端所展示的页面,需要我们servlet去一个标签一个标签去生成,如果一个页面超级复杂,动不动几千行代码,那这个servlet效率也就太低了。而且整个servlet代码也会十分臃肿而且可读性非常差。
这时候怎么办呢?sun公司很早就意识到了这个问题,于是便倡导很多公司一块来创建了一种能够动态生成html的新技术,不久之后jsp便诞生了。有效率的解决了上面servlet所出现的问题。
jsp的发展
既然jsp技术能够解决刚刚servlet代码里面所出现的技术,我们来看一下是如何解决的:在这里我们举一个小例子,就是前端jsp向服务器servlet发送请求图书页面的功能。
首先我们看一下servlet:
我们会发现,现在的servlet没有一点html代码了。我们只需要把数据交给jsp。此时我们的页面展示就交给jsp来做了。现在我们来看一下jsp长什么样子:
这就是jsp,我们可以在html页面中写一些java代码。对于我们程序员来说,在开发当中静态的页面我们只需要用html和css写一些标签来展示即可,对于那些动态的部分我们就可以使用java代码。
那么jsp和servlet是不是就是这种协作的关系,本质上有什么区别呢?
其实jsp只是servlet的一种特殊形式,每一个jsp页面就是一个servlet实例,通俗一点的话来说:jsp就是servlet,只不过servlet把一些业务功能剥离开来交给了或者是形成了jsp。明白了吧。在我们的项目编译的时候就是把jsp编译成了servlet。
你们会发现,这样做其实挺好的,市场也验证了一切,很快jsp技术流行开来,可是随着时间的流逝,业务越来越复杂,jsp也开始跟不上时代了。
jsp的危机
我们先看一个对话场景:
java程序员:终于写完了功能,是时候在界面上展示了。
前端程序员:你功能写完了,我没有数据,在页面什么没法展示呀
java程序员:数据我写好了,你在jsp中调用XX方法就能获取了,
前端程序员:我已经在jsp中写好了这个方法,你为什么自己写了?
于是乎,无穷无尽的争吵还在继续当中。
这就是jsp的弊端,为什么呢?我们可以来总结一下:
(1)动态和静态资源放在一起,一旦服务器出现状况,前后台一起玩完,用户体验极差。
(2)一旦jsp出现了问题,就需要前端后端发开人员一块来分析解决,效率低。
(3)jsp无法使用nginx等。
(4)jsp页面复杂,难以修改。
(5)第一次加载jsp需要编译成servlet,时间久,而且业务量大的时候,jsp负担太大。
(6)jsp对于开发人员简直就是一个挥之不去的痛,太难了!!!
鉴于以上缺点,于是另外一套机制横空出世了,这就是前后端分离。什么是前后端分离呢?
前后端分离其实就是后端工程师只关注于后端页面的开发,不再处理前端问题。前端工程师只关注于自己的页面开发。需要数据交互的时候,两者会有一份接口文档。
就这样这种思想架构很快的流行开来,这也就是为什么jsp落寞的真正原因。从此java从jsp转向了restful结构,springMCV也开始流行开来,并逐渐占领了市场。前后端分离有什么优点呢?我们来总结一下:
(1)动态和静态资源分开存储。
(2)出现bug能很快定位是前端还是后端。
(3)支持nginx。在高并发状态下极其优秀。
(4)直接请求页面,不用编译,速度效率都提上来了。
(5)从此前端和后端是相亲相爱的一家人了!!!!
jsp的落幕
又随着时间的推移,jsp的时代基本上一去不复返了,因为我们又走入了移动互联时代,这时候的客户端可不是前端页面了,还包括手机、汽车、电视等等各种设备,这种情况下,前后端必须要分离了。jsp基本上彻底告别了它的舞台。
Java学习知识点:小白如何掌握JSP技术?
今天千锋广州小编就给大家分享零基础如何掌握JSP技术,下面一起来看看吧!
一、Java初级开发之jsp概述
1.关于jsp
JavaServer Pages简称jsp,从“server”这个词可以看出,这其实也是一门java服务端技术,其实可以简单的把jsp认为是servlet,一点错也没有。Jsp的实质,就是客户端需要的资源是通过jsp技术动态生成的。
2.jsp的技术原理
1)当客户端在访问一个jsp资源时,服务器上有相应的servlet来负责jsp资源,那么该servlet将会把jsp页面翻译成一个servlet,然后执行该servlet的service方法。
2)服务器将jsp翻译成java程序(就是一个Servlet),然后执行该Servlet的service方法,在方法内部动态地向客户端写html代码。
因此jsp就是一个servlet,也就是jsp页面将被翻译成servlet
3.jsp与servlet的选择
jsp就是servlet,那么如果碰到需要写繁多的html代码,建议使用jsp,如果需要写繁多的java代码,建议使用servlet。
二、JSP技术详解
1.JSP脚本
就是怎样在jsp页面中使用java代码,使用了脚本的地方,就不会作为输出流的内容,而是作为java代码来执行。使用方式有三种:
1) <% java代码 %>
jav代码会被作为程序的一部分来执行,而不会被翻译成out.write(),这是常用的。
2) <% java代码 %>
会被翻译成 out.print(java代码)
3) <% java代码 %>
声明成员变量。
4)jsp的注释方式
· html的注释:
用户看得到,程序员也看得到
· java的注释:// 单行注释 /多行注释/
用户看不到,但是会被翻译
· jsp的注释:
用户看不到,不会被翻译,只有程序员在写jsp页面时才看得到。
2.三大指令
1)page指令
page指令是用于告诉服务器该如何翻译此jsp页面。通过page指令的属性来指明翻译的效果。
· language: 指的是jsp页面支持哪种语言,只支持java,所以该属性可以省略
· pageEncoding和contentType写一个就行,建议使用pageEncoding,更加简单
· session:默认值是true,默认情况下服务器会为该页面开辟一个session空间
· import:用于导入该页面中的java类需要用到的包
· errorPage:当发生错误时跳转到的资源,注意,该地址是一个服务器地址。
· isErrorPage:默认值是false。当在web.xml中配置错误页面时,需要将该jsp页面的isErrorPage设为true.
404
/error.jsp
总结:一般情况下,page指令就这么写即可:
2)include指令:静态包含,file属性使用的是服务器地址。
include指令是用于在一个jsp页面中包含另一个jsp页面,两个页面组合成一个页面发送给客户端。
所谓的静态包含,在翻译时是把被包含的jsp页面写给客户端。那么此时客户端拿到的是两套html标签。
3)taglib指令:标签库
taglib指令用于引入第三方标签库,通过taglib指令中的prefix指明前缀,通过前缀来使用第三方标签库中的标签
3.四大域对象 (jsp有四个,servlet有三个(request,session,servletContext))
1) pageContext
(1)pageContext作为域对象
· 描述当前page的上下文。那么pageContext对象是一个域对象,所谓域对象,就是提供了一个区域,用来存储数据。因此当前的page就能向pageContext对象中存储数据.
pageContext域对象的作用范围:当前page(页面)
setAttribute(String key,Object value);
getAttribute(String key);
removeAttribute(String key);
· 向其他域对象中操作数据.
pageContext.setAttribute(String key,Object value, int scope);向其他域对象中存值
pageContext.getAttribute(String key, int scope);向其他域对象中取值
pageContext.removeAttribute(String key, int scope);向其他域对象中移除值
int scope来自于PageContext类的常量
REQUEST_SCOPE: 表示request域
SESSION_SCOPE: 表示session域
APPLICATION_SCOPE: 表示application域
· findAttribute(String key):Object :这是通过键,向所有域中搜索数据。
搜索的顺序:
pageContext->request->session->application
(2)可以通过pageContext对象来获取其他八个内置对象
通过pageContext的get*()来获得。
2)request
作用范围:一次请求
3)session
作用范围:一次会话
4)application
作用范围:当前web应用
4.九大内置对象
所谓的内置对象,即在jsp页面的脚本中能直接使用的java对象。
· out: 输出流
当通过out的write()写内容时,实际是往out的缓冲区(默认大小是8kb)中去写,有两种情况导致缓冲区的内容会冲刷进底层的输出流中
1)out对象被销毁
2)out的缓冲区不够用了。其实我们可以设置out缓冲区的大小。如果缓冲区是0kb,那么out就把内容直接写到response缓冲区中。
· page:this,表示当前的Servlet对象
· pageContext:重点,表示当前page的上下文对象,也是一个域对象
· session:当jsp页面的page指令的session属性为true时,才会有session对象
· request:
· response
· exception 当jsp页面的page指令的isErrorPage属性为true时,才会有exception对象
· application: 实际就是ServletContext对象
· config:实际就是ServletConfig对象
5.Jsp标签
1) jsp:include
动态包含:在一个页面中包含另一个页面的内容
和静态的区别:
静态包含会在翻译的过程中直接翻译被包含的页面,被包含的页面不会产生java文件。
而动态包含会在翻译的过程中只翻译自己页面的内容,被包含的页面的翻译交给相应的类来完成,被包含的页面会产生java文件,实际开发中更加常用动态包含。
2)jsp:forward
请求转发,与servlet中的请求转发的效果一致。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。