JAVA网站制作之困扰JSP的一些成绩
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)js|成绩Blueski编译(编者案:此文经由过程jsp和templateengines的对照,提醒了今朝jsp的一些不敷。后者也是一项基于servlets的手艺,有些相似于宏,能够简化开辟,但厥后没有失掉应有的器重和开展。)
现在每个利用servlets的开辟者都晓得JSP,一种由Sun公司创造并消费大批精神加以奉行并建构在servlet手艺之上的web手艺。JSP将servlet中的html代码离开了出来,从而能够减速web使用开辟和页面保护。实践上,由Sun公布的官方"使用开辟模子"文档上说得更远:"JSP手艺应当被视为尺度,而servlets在多半情形下可视为一种增补。"(Section1.9,1999/12/15听取定见版)。
本文的目标在于听取对该声名的公道性的评价--经由过程对照JSP和另外一项基于servlets的手艺:templateengines(模板引擎)。
间接利用Servlets的成绩
后来,servlets被创造,全部天下都看到了它的优胜。基于servlet的静态网页能够被疾速实行,能够在多个服务器之间容易转移,而且能够和背景数据库完善地集成。Servlets被普遍承受成为一种web服务器真个首选平台。
可是,一般经由过程复杂体例便可完成的html代码如今却要让程序员经由过程out.println()挪用每行HTML行,这在实践的servlet使用中成了一个严峻成绩。HTML内容不能不经由过程代码来完成,关于年夜的HTML页来讲不啻是一项沉重费时的事情。别的,卖力网页内容的职员不能不请开辟职员来举行一切的更新。为此,人们追求这一种更好的办理体例。
JSP到!
JSP0.90呈现了。在这类手艺中你能够将Java代码嵌进到HTML文件,服务器将主动为页面创立一个servlet。JSP被以为是一种写servlet的浅易体例。一切HTML能够间接失掉而不用经由过程out.println()挪用,而卖力页面内容的职员能够间接修正HTML而不用冒损坏Java代码的风险。
可是,让页面美术计划师和开辟职员在统一文件上事情其实不幻想,让Java嵌进HTML被证实是就象将HTML嵌进Java一样使人为难。读取一堆很乱的代码仍旧是一件坚苦的事变。
因而,人们在利用jsp方面变得成熟,更多地利用了JavaBeans。Beans包括了jsp所需的营业逻缉代码。JSP中的年夜多半代码都能够掏出来放到bean中往,而只留下少少的标志用于挪用bean。
比来,人们入手下手以为这类体例下的JSP页面真的很象是视图(view)。它们成为一个用于显现客户端哀求的了局的组件。因而人们会想,为何不间接对view发送哀求呢?方针view假如对该哀求分歧适又将怎样?说究竟,良多的哀求有多种大概来获得了局view视图。比方,统一哀求大概发生乐成的页面,数据库破例堕落呈报,大概是短少参数的堕落呈报。统一哀求大概发生一个英文页面也多是西班牙文页面,这取决于客户真个locale。为何客户端必需间接将哀求发送给view?为何客户端不该该将哀求发送给一些通用的服务器组件并让服务器来决意JSPview的前往?
这使良多人承受了已被称为"Model2"的计划,这是在JSP0.92中界说的基于model-view-controller的模子。在这类计划中,哀求被发送到一个servlet把持器,它实行了贸易逻缉并发生一个邻近的数据"model"来用于显现。这一数据随后经由过程外部送到一个JSP"view"来举行显现,如许看起来JSP页就象是一个一般的嵌进的JavaBean。能够依据卖力把持的servlet的外部逻辑来选择得当的JSP页面举行显现。如许,JSP文件成了一个大度的templateview。这就是另外一种开展,并被别的一些开辟者所推许至今--->>
进进TemplateEngines
利用templateengine来取代一般目标的JSP,接下往的计划将变得复杂,语法更复杂,堕落信息更容易读,工具也更用户化。一些公司已做了如许的引擎,最出名的多是WebMacro(http://webmacro.org,fromSemiotek),他们的引擎是收费的。
开辟者应当了然,选定一个templateengine来代替JSP供应了这么一些手艺上风,这也恰是jsp的一些不敷的地方:
成绩#1:Java代码太模板化了
固然被以为是欠好的计划,JSP仍试图将Java代码到场web页面。这有些象是Java已经做的,即对C++的简化修正,templateengines也经由过程将jsp中的较低层的源码移往来使之简化。Templateengines实施了更好的计划。
成绩#2:请求Java代码
在JSP页中请求写一些Java代码。比方,假定某页要决意以后web使用中根的高低文从而导向其主页,
在JSP中最好利用以下Java代码:
<ahref="<%=request.getContextPath()%>/index.html">Homepage</a>
你能够试图制止Java代码,而利用<jsp:getProperty>标志但这将给你六下难以浏览的字串:
<ahref="<jsp:getPropertyname="request"
property="contextPath"/>/index.html">HomePage</a>
利用templateengine则没有Java代码和丢脸的语法。这里是一样请求下在WebMacro中的写法:
<ahref="$Request.ContextPath;/index.html">Homepage</a>
在WebMacro中,ContextPath作为$Request变量的一个属性,利用相似Perl的语法。别的ertemplateengines利用了别的的语法范例。
再看另一个例子,假定一个初级的"view"必要设定一个cookie来纪录用户缺省的色彩设置--这类义务看起来也许只能由view而不是servlet把持器来完成。在JSP中要有如许的Java代码:
<%Cookiec=newCookie("colorscheme","blue");response.addCookie(c);%>
在WebMacro中则没有Java代码:
#set$Cookie.colorscheme="blue"
作为最初一个离子,假设又要从头找回本来的cookie中的色彩设置。关于JSP,我们能够以为也有一个响应的工具类来供应匡助,由于用getCookies()间接做如许低层的会变得好笑并且坚苦。在JSP中:
<%Stringcolorscheme=ServletUtils.getCookie(request,"colorscheme");%>
在WebMacro中没有对工具类的必要,一般是:
$Cookie.colorscheme.Value
对写jsp的图形艺术师,又是哪种语法更简单进修呢?
JSP1.1引进了自界说标志(customtags)同意恣意的和HTML类似的标志在JSP页面中在背景实行Java代码,这将具有必定的代价,但条件是要有一个普遍晓得的,全功效的,能够收费失掉的,尺度化的标志库。今朝还没有呈现如许的标志库。
成绩#3:复杂事情仍旧很累人
即便是很复杂的事情,比方包括header和footer,在JSP中仍旧很很坚苦。假定有一个"header"和一个"footer"模板要包括到一切页面,而每个模板要在content中包括以后的页题目。
在JSP中最好举措是:
<%Stringtitle="ThePageTitle";%>
<%@includefile="/header.jsp"%>
...你的页面内容...
<%@includefile="/footer.jsp"%>
页面计划者要记着不克不及漏掉第一行的分号并要将title界说为一个字符串。别的,/header.jsp和/footer.jsp必需在根目次下而且必需是可存取的完全文件。
在WebMacro中包括headers和footers做起来对照复杂:
#set$title="ThePageTitle"
#parse"header.wm"
Yourcontenthere
#parse"footer.wm"
这里对计划者来讲没有要切记的分号或对title的界说,.wm文件能够放在可自界说的搜刮路径下。
成绩#4:很粗的轮回
在JSP中轮回很坚苦。这里是用JSP反复打印出每个ISP对象名字。
<%
Enumeratione=list.elements();
while(e.hasMoreElements()){
out.print("Thenextnameis");
out.println(((ISP)e.nextElement()).getName());
out.print("<br>");
}
%>
大概甚么时分会有效户自界说标志来做这些轮回。对"if"也是云云。JSP页大概看上往成了很乖僻的java代码。而同时,webmacro轮回很大度:
#foreach$ispin$isps{
Thenextnameis$isp.Name<br>
}
假如需要的话,#foreach指令可被自界说的#foreach-backwards指令很简单地代替。
用jsp的话极可能变如许:(这里是一个大概的<foreach>标志)
<foreachitem="isp"list="isps">
Thenextnameis<jsp:getPropertyname="isp"property="name"/><br>
</foreach>
计划者固然地回选择前者。
成绩#5:无用的堕落信息
JSP常有一些使人惊奇的堕落信息。这是由于页面起首被转换成为一个servlet然后才举行编译。好的JSP工具能够绝对增添找到堕落地位的大概性,但即便是最好的工具也没法使一切堕落信息都能简单地被读懂。因为转化的历程,一些毛病对工具来讲大概基本不成能被辨认。
比方,假定JSP页面必要创建一个对一切页通用的题目。以下代码并没有错:
<%staticStringtitle="Globaltitle";%>
但Tomcat会供应以下堕落信息:
work/%3A8080%2F/JC_0002ejspJC_jsp_1.java:70:Statementexpected.
staticintcount=0;
^
此信息以为以上剧本被放进_jspService()办法而静态变量不同意放进办法中。该语法应当是<%!%>。页面计划者很难读懂这些堕落信息。即便最好的平台在这方面也做得很不敷。即便一切Java代码都从页中移出也没法办理成绩。别的,以下表达式有甚么错?
<%count%>
tomcat给出:
work/8080/_0002ftest_0002ejsptest_jsp_0.java:56:Classcountnotfoundin
typedeclaration.
count
^
work/8080/_0002ftest_0002ejsptest_jsp_0.java:59:Invaliddeclaration.
out.write("
");
^
换句话说,只是丢失了一个标志罢了。应当是<%=count%>。
因为templateengine能够在template文件中间接发生而没有任何戏剧性的向代码转化,以是能够十分简单地给出得当的堕落呈报。顺次类推,当c言语的命令被打进Unixshell的命令行,你其实不但愿shell会天生一个C程序来运转这个命令,而只是必要shell复杂地注释命令并加以实行,若有毛病也间接给出。
成绩#6:必要一个编译器
JSP必要一个置放在webserver中的编译器。因为Sun回绝保持包括了他们的javac编译器的tools.jar库,这个中就变得有成绩了。Web服务器能够包括进一个第三方的编译器如ibm的jikes。但如许的编译器其实不能在一切平台上顺遂事情(用C++写成的)也倒霉于创建纯Java的web服务器。JSP有一个预编译选项能够起到必定感化,只管其实不完善。
成绩#7:空间的华侈
JSP损耗了分外的内存和硬盘空间。对服务器上每30K的JSP文件,必需要有响应的年夜于30K的类文件发生。实践上使得硬盘空间更加。思索到JSP文件随时能够很简单地经由过程<%@include>包括一个年夜的数据文件,如许的存眷有着很实际的意义。同时,每个JSP的类文件数据必需加载到服务器的内存中,这意味着服务器的内存必需永久地将全部JSP文档树保留下往。多数一些JVM有才能将类文件数据从内存中移往;可是,程序员一般没法把持如许的划定规矩来从头声名,并且对年夜的站点来讲从头声名大概不是很无效。对templateengines因为没有发生第二个文件,以是节俭了空间。Templateengines还为程序员供应对templates在内存中举行缓存的完整把持。
利用templateengine也有一些成绩:
Template的成绩#1:没有严厉界说
templateengine该怎样事情并没有严厉界说。但是,但绝对jsp来讲,实在这其实不很主要,和JSP分歧的是,templateengines对web服务器没有任何特别请求--任何撑持servlet的服务器都能够撑持templateengines(包含API2.0服务器如Apache/JServ,它们其实不能完整撑持JSP)!假如为最好的templateengine计划供应安康的合作本能够引发一场刺眼的刷新,出格是有开放源码的增进,(可让头脑互相推进和增进),那末明天的WebMacro就会象Perl一样,没有严厉界说但公然源码构造的推进就是它的尺度。
Template的成绩#2:没有取得公认
Templateengines并未被普遍晓得。JSP已占有了极年夜的贸易市场,而且不得人心。而利用gtemplateengines只能是一种未被懂得的替换手艺。
Template的成绩#3:还没有分配好
Templateengines还没有被高度地分配好。没有对templateengine和JSP二者举行功能测试和对照。实际上说一个分配无缺的templateengine完成应当和一个分配好的JSP相婚配;可是,思索到第三方为jsp已作出了这么深远的推进,了局只要jsp被很好地分配好了。
JSP的脚色
固然地,JSP在未来一定会有其位置。即便从称号上也能够看出JSP和ASP的类似性,它们只要一个字母的不同。以是假如要让利用asp的人们转向java,十分类似的jsp情况将对此起到很年夜的推进感化,和asp坚持这类对应干系所能起到的感化应当也是被推出jsp的计划者重点思索到的。
但是这里想要夸大的一点是:有益于转进新情况的事情者,和实践上是不是是利用该情况的最好体例,这二者是有很年夜分歧的。
JSP日趋显现出它正成为最主要的java手艺之一,它让人们分开ASP的天下--由此,Sun将撑持这一强无力的贸易case,Java相干手艺撑持者也将赐与更鼎力的撑持。
但是,这并不是java平台的最好办理计划。这将使java办理计划变得好象是没有java的办理计划了。
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 是一种使网页(Web Page)产生生动活泼画面的语言 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 Java 编程语言的风格十分接近C、C++语言。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 是一种使用者不需花费很多时间学习的语言 是一种使网页(Web Page)产生生动活泼画面的语言 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
页:
[1]