仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 492|回复: 11
打印 上一主题 下一主题

[学习教程] JAVA网站制作之Template和JSP手艺

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。js(本文发于javaemag第一期)
1、劈头与近况:关于Template和JSP的劈头还要追述到Web开辟的太古年月,谁人时分的人们用CGI来开辟web使用,在一个CGI程序中写HTML标签。在这以后天下入手下手朝分歧的偏向开展:sun公司供应了相似于CGI的servlet办理计划,可是不管是CGI仍是servlet都面临统一个成绩:在程序里写html标签,不管怎样都不是一个明智的办理计划。因而sun公司于1999年推出了JSP手艺。而在另外一个天下里,以PHP和ASP为代表的scriptlet页面剧本手艺入手下手普遍使用。不外即使云云,成绩并没有停止,新的成绩呈现了:营业和HTML标签的夹杂,这个成绩不但招致页面布局的凌乱,同时也使代码自己难以保护。因而来自劈头于70年月前期的MVC形式被引进开辟。MVC的三个脚色:Model――包括除UI的数据和举动的一切数据和举动。View是暗示UI中模子的显现。任何信息的变更都由MVC中的第三个成员来处置――把持器。在以后的使用中,呈现了手艺的第一次奔腾:前真个显现逻辑和后真个营业逻辑分别,COM组件或EJB或CORBA用于处置营业逻辑,ASP、JSP和PHP被用于前真个显现。这个就是Web开辟的Model1阶段(页面把持器形式)。不外这个开辟形式有良多成绩:1.页面中必需写进Scriptlet挪用组件以取得所必须的数据。2.处置显现逻辑上Scriptlet代码和HTML代码夹杂交织。3.调试坚苦。JSP被编译成servlet,页面上的调试信息不敷以定位毛病。这统统都是由于在Model1中并没有分别视图和把持器。完整分别视图和把持器就成了必需。这就是Model2。它把Model1中未办理的成绩――分别对组件(营业逻辑)的挪用事情,把这部合作作移植到了把持器。如今仿佛完善了,不外等等,本来的把持器从页面平分离后,页面所需的数据怎样取得,谁来处置页面显现逻辑?两个举措:1.持续使用asp,php大概jsp等机制,不外因为它们是运转在web情况下的,他们所要显现的数据(后端逻辑发生的了局)就必要经由过程把持器放进request流中;2.利用老手法――模板手艺,利用自力的模板手艺因为离开的了web情况,会给开辟测试带来相称的便当。至于页面所需数据传进一个POJO就行而不是request对象。模板手艺开始入手下手于PHP的天下,呈现了PHPLIBTemplate和FastTemplate这两位好汉。不久模板手艺就被引进到javaweb开辟天下里。今朝对照盛行的模板手艺有:XSTL,Velocity,JDynamiTe,Tapestry等。别的由于JSP手艺究竟是今朝尺度,相称的体系仍是使用JSP来完成页面显现逻辑部分,在Sun公司的JSTL外,各个第三方构造也纷繁推出了本人的Taglib,一个代表是strutstablib。2、模板手艺剖析:模板手艺从实质下去讲,它是一个占位符静态交换手艺。一个完全的模板手艺必要四个元素:0.模板言语,1.包括模板言语的模板文件,2.具有静态数据的数据对象,3.模板引擎。以下就详细会商这四个元素。(在会商过程当中,我只枚举了几个分歧特性手艺,别的手艺或有相同就不反复了)1.模板言语:模板言语包含:变量标识和表达式语句。依据表达式的把持力分歧,能够分为强把持力模板言语和弱把持力模板言语。而依据模板言语与HTML的兼容性分歧,又能够分为兼容性模板言语和非兼容性模板言语。模板言语要处置三个要点:1.标量标志。把变量标识拔出html的办法良多。个中一种是利用相似html的标签;另外一种是利用特别标识,如Velocity大概JDynamiTe;第三种是扩大html标签,如tapestry。接纳何种体例有着良多思索,一个对照罕见的思索是“所见即所得”的请求。2.前提把持。这是一个很辣手的成绩。一个复杂的例子是某物流陪送体系中,物品数低于必定值的要高亮显现。不外关于一个详细庞大显现逻辑的情形,前提把持仿佛不成制止。当你把相似于<IFcondition=”$count<=40”><then><spanclass=”highlight”>count</span></then></IF>引进,就象我们现在在ASP和PHP中所做得一样,我们将不能不再一次面临scriptlet嵌进网页所碰到的成绩。我信任你和我一样其实不以为这是一个好得的编写体例。实践上并不是一切的模板手艺都利用前提把持,良多已有的使用如PHP上中的和我曾见过一个基于ASP.NET的使用,固然另有Java的JDynamiTe。如许网页上没有任何逻辑,不外如许做的价值是把高亮显现的选择把持移交给编程代码。你必须做个选择。大概你也象我一样既不想在网页中利用前提把持,也不想在代码中写html标志,可是这个显现逻辑是无可回避的(假如你不想被你的老板抄鱿鱼的话),一个可行的办法是用CSS,在编程代码中决意接纳哪一个css款式。出格是CSS2手艺,其selector机制,能够依据html范例乃至是element的attributes来apply分歧的款式。3.迭代(轮回)。在网页上显现一个数据表单是一个很基础的请求,利用汇合标签将不成制止,不外侥幸的是,它一般很复杂,并且够用。出格值得一提的是PHP的模板手艺和JDynamiTe手艺使用html的正文标签很复杂的完成了它,又坚持了“所见既所得”的特征。上面是一些手艺的对照:Velocity变量界说:用$标记表达式语句:以#入手下手强把持言语:变量赋值:#set$this="Velocity"内部援用:#include($1)前提把持:#if….#end非兼容言语JDynamiTe变量界说:用{}包装表达式语句:写在正文格局(<!--à)中弱把持言语兼容言语XSLT变量界说:xml标签表达式:xsl标签强把持言语:内部援用:import,include前提把持:if,choose…when…otherwise非兼容言语Tapestry接纳component的情势开辟。变量界说(组件界说):在html标签中加上jwcid表达式语句:ognl标准兼容言语2.模板文件:模板文件指包括了模板言语的文本文件。模板文件因为其模板言语的兼容性招致分歧了局。与HTML兼容性的模板文件只是一个资本文件,其具有优秀的复用性和保护性。比方JDynamiTe的模板文件不仅能够在分歧的项目中复用,乃至能够和PHP程序的模板文件互用。而如velocity的非兼容模板文件,因为其现实上是一个剧本程序,复用性和可保护性年夜年夜下降。3.具有静态数据的数据对象:模板文件包括的是静态内容,那末其所需的静态数据就必要别的供应。依据供应数据体例的分歧能够分为3种:1.Map:使用key/value来定位。这个是最多见的手艺。如velocity的VelocityContext就是包括了map对象。Example.vm:Hellofrom$nameinthe$projectproject.Example.java:VelocityContextcontext=newVelocityContext();context.put("name","Velocity");context.put("project","Jakarta");2.DOM:间接操纵DOM数据对象,如XSLT使用XPath手艺。3.POJO:间接使用反射获得DTO对象,使用JavaBean机制获得数据。如Tapestry。4.模板引擎:模板引擎的事情分为三步:1.获得模板文件并确认个中的模板言语切合标准。好比velocity,断定#if有对应得#end等。Xml+xslt的模子中,xml文件标签是不是完全等。在完成这些事情后,模板引擎一般会把模板文件剖析成一颗节点树(包括模板文件的静态内容节点和模板引擎所界说的特别节点)。2.获得数据对象。该数据对象一样平常经由过程程序传送援用完成。现有的大批框架在程序底层完成,处置体例也各自分歧,有两种手艺分离为推手艺和拉手艺。推手艺:controller挪用set办法把静态数据注进,模板引擎经由过程get办法取得,典范代表:Struts;拉手艺:模板引擎依据设置信息,找到与view对应的model,挪用model的get办法获得数据,典范代表:Tapestry。3.兼并模板文件(静态内容)和数据对象(静态内容),并天生终极页面。兼并的机制一样平常以下,模板引擎遍历这颗节点树的每个节点,并render该节点,碰到静态内容节点按一般输出,碰到特别节点就从数据对象中往得对应值,并实行其表达式语句(假如有的话)。以下具体申明:VelocityTemplatetemplate=Velocity.getTemplate("test.wm");Contextcontext=newVelocityContext();context.put("foo","bar");context.put("customer",newCustomer());template.merge(context,writer);当挪用Velocity.getTemplate办法时,将挪用ResourceManger的对应办法。ResourceManger先检察该模板文件是不是在cache中,假如没有就往猎取,天生resource对象并挪用process()办法,断定该模板是不是无效,假如无效,则在内存中天生一个Node树。当挪用template.merge()时,遍历这颗Node树,并挪用每一个Node的render办法。关于模板中的变量和对象Node,还将挪用execute()办法,从context中获得value。注:ResourceManger在runtimeesource包下,Node在runtimeparser
ode包下TapestryTapestry对照贫苦,先先容一下http哀求的处置历程。当httprequest哀求抵达时。该哀求被ApplicationServlet捕捉,随后ApplicationServlet经由过程getEngine取到对应的Engine,经由过程该engine的getService拿到对应的service,挪用其service办法实行http哀求。每一个service经由过程RequestCycle对象的getPage办法获得Page对象,并将其设置为该Cycle对象的activePage。以后service挪用renderResponse办法实行输入。renderResponse挪用page的getResponseWriter(output)获得writer对象,并把它传给cycle.renderPage(writer)办法,该办法挪用page的renderPage办法。Page实行renderPage时,起首判别是不是有listener的哀求,假如有则处置listener哀求;然后挪用BaseComponentTemplateLoader的process办法把模板文件载进并构成一个component节点树,顺次实行节点的renderComponent办法。每一个component对象将经由过程ongl的机制获得对象属性。并把该值写进输出流。比方:insertcomponentprotectedvoidrenderComponent(IMarkupWriterwriter,IRequestCyclecycle){if(cycle.isRewinding())return;Objectvalue=getValue();if(value==null)return;Stringinsert=null;Formatformat=getFormat();if(format==null){insert=value.toString();}else{try{insert=format.format(value);}catch(Exceptionex){thrownewApplicationRuntimeException(Tapestry.format("Insert.unable-to-format",value),this,getFormatBinding().getLocation(),ex);}}StringstyleClass=getStyleClass();if(styleClass!=null){writer.begin("span");writer.attribute("class",styleClass);renderInformalParameters(writer,cycle);}if(getRaw())writer.printRaw(insert);elsewriter.print(insert);if(styleClass!=null)writer.end();//<span>}getValue为获得insert的value属性。3、JSP手艺剖析1.JSP手艺:JSP,一个假装后的servlet。webserver会对任何一个jsp都天生一个对应jsp类,翻开这个类,就会发明,jsp供应的是一个代码天生机制,把jsp文件中一切的scriptlet一成不变的copy的到天生的jsp类中,同时挪用println把一切的html标签输入。Test.jsp:<html><head><title>jsptest</title></head><body><tablewidth="226"border="0"cellspacing="0"cellpadding="0"><tr><td><fontface="Arial"size="2"color="#000066"><bclass="headlinebold">Thejsptestfile</b></tr></td></font></table><body></html>Test_jsp.java:packageorg.apache.jsp;importjavax.servlet.*;importjavax.servlet.http.*;importjavax.servlet.jsp.*;importorg.apache.jasper.runtime.*;publicclassTest_jspextendsHttpJspBase{privatestaticjava.util.Vector_jspx_includes;publicjava.util.ListgetIncludes(){return_jspx_includes;}publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)throwsjava.io.IOException,ServletException{JspFactory_jspxFactory=null;javax.servlet.jsp.PageContextpageContext=null;HttpSessionsession=null;ServletContextapplication=null;ServletConfigconfig=null;JspWriterout=null;Objectpage=this;JspWriter_jspx_out=null;try{_jspxFactory=JspFactory.getDefaultFactory();response.setContentType("text/html;charset=ISO-8859-1");pageContext=_jspxFactory.getPageContext(this,request,response,null,true,8192,true);application=pageContext.getServletContext();config=pageContext.getServletConfig();session=pageContext.getSession();out=pageContext.getOut();_jspx_out=out;out.write("<html>
");out.write("<head><title>jsptest</title></head>
");out.write("<body>
");out.write("<tablewidth="226"border="0"cellspacing="0"cellpadding="0">
");out.write("<tr><td><fontface="Arial"size="2"color="#000066">
        ");out.write("<bclass="headlinebold">Thejsptestfile");out.write("</b>
        ");out.write("</tr></td></font>
        ");out.write("</table>
");out.write("<body>
");out.write("</html>");}catch(Throwablet){out=_jspx_out;if(out!=null&&out.getBufferSize()!=0)out.clearBuffer();if(pageContext!=null)pageContext.handlePageException(t);}finally{if(_jspxFactory!=null)_jspxFactory.releasePageContext(pageContext);}}}2.Taglib手艺:Taglib作为jsp之上的帮助手艺,其事情实质依托与jsp手艺,也是自界说标签翻译成java代码,不外此次和jsp略有分歧,它还要经由几个历程。先来看一下,完成一个tag的2个要点:1.供应属性的set办法,今后这个属性就能够在jsp页面设置。以jstl标签为例c:outvalue=""/,这个value就是jsp数据到tag之间的出口。以是tag内里必需有一个setValue办法,详细的属性能够不叫value。比方setValue(Stringdata){this.data=data;}。这个“value”的称号是在tld里界说的。取甚么名字都能够,只需tag里供应响应的set办法便可。2.处置doStartTag或doEndTag。这两个办法是TagSupport供应的。仍是以c:outvalue=""/为例,当jsp剖析这个标签的时分,在“<”处触发doStartTag事务,在“>”时触发doEndTag事务。一般在doStartTag里举行逻辑操纵,在doEndTag里把持输入。在处置tag的时分:0.从tagPool中获得对应tag。1.为该tag设置页面高低文。2.为该tag设置其父tag,假如没有就为null。3.挪用setter办法传进标签属性值tag,假如该标签没有属性,此步跳过。4.挪用doStartTag办法,取的前往值。5.假如该标签有body,依据doStartTag前往值断定是不是pop该标签内容。假如要pop其body,则:setBodyContent(),在以后,doInitBody()。假如该标签没有body,此步跳过。6.挪用doEndTag()以断定是不是跳过页面剩下部分。7.最初把tag类返还给tagPool。tag类为:packagemy.customtags;importjavax.servlet.jsp.JspWriter;importjavax.servlet.jsp.PageContext;importjavax.servlet.jsp.tagext.TagSupport;publicclassHiddenextendsTagSupport{Stringname;publicHidden(){name="";}publicvoidsetName(Stringname){this.name=name;}publicvoidrelease(){value=null;}publicintdoStartTag(){returnEVAL_BODY_INCLUDE;}publicintdoEndTag()throwsJspTagException{try{pageContext.getOut().write(",youarewelcome");}catch(IOExceptionex){thrownewJspTagException("Error!");}returnEVAL_PAGE;}}Jsp页面:<my:hiddenname="testname"/>天生的jsp代码:my.customtags.Hidden_jspx_th_my_hidden_11=(my.customtags.Hidden)_jspx_tagPool_my_hidden_name.get(my.customtags.Hidden.class);_jspx_th_my_hidden_11.setPageContext(pageContext);_jspx_th_my_hidden_11.setParent(null);_jspx_th_my_hidden_11.setName("testname");int_jspx_eval_my_hidden_11=_jspx_th_my_hidden_11.doStartTag();if(_jspx_th_my_hidden_11.doEndTag()==javax.servlet.jsp.tagext.Tag.SKIP_PAGE)returntrue;_jspx_tagPool_my_hidden_name.reuse(_jspx_th_my_hidden_11);returnfalse;Taglib手艺供应两个机制,Body和non-Body招致了taglib的呈现了两个分支:DisplayTag和ControlTag,前者在javacode中嵌进了html标签,相称与一个webcomponent,尔后者则是另外一种模板剧本。4、两种手艺计划的对照:1.手艺进修难易度模板手艺。利用模板手艺,第一点就是必需进修模板言语,特别是强把持的模板言语。因而模板言语自己的友爱性变的尤其主要。以下根据友爱性,体现力和复用性三点为主基点对照了一下几种模板手艺。Velocity:Turbine项目(http://jakarta.apache.org/Turbine)接纳了velocity手艺。1.友爱性不敷。来由:强把持范例,呈现页面显现把持代码和html夹杂。与Html的不兼容,没法所见即所得。碰到年夜的HTML页面,从一个“#if”找到对应的“#end”也是很疾苦的一件事变。2.体现力强。来由:强把持言语。3.复用性弱。来由:模板剧本和页面代码夹杂。XSLTCocoon项目(http://cocoon.apache.org/)接纳XML+XSLT的办法。CSDN社区也是接纳此计划。1.内容和显现作风分别,这点XSLT做的最好。2.速率慢。来由:XSLT的利用XPath,因为是要剖析DOM树,当XML文件年夜时,速率很慢。3.友爱性不敷。来由:因为没有HTML文件,基本看不到页面布局、显现作风和内容。XSL语法对照难以把握,因为没有“所见即所得”编纂工具,进修本钱高。4.体现力强。来由:强把持言语。5.复用性弱。来由:xsl标签和html标签夹杂。JDynamiTe1.体现力中等。来由:弱把持言语。2.友爱性强。来由:所见即所得的效果。在模板件中的ignoreblock在编纂前提下可展现页面效果,而在运转中不会被输入。3.复用性强。来由:使用html标签。Tapestry1.友爱性中等。来由:全部Tapestry页面文件都是HTML元素。可是因为component会重写html标签,其显现的模样是不是准确,将不展望。2.体现力强。来由:强把持言语。3.复用性强。来由:扩大了HTML元素的界说。在JSP中大批的利用TagLib,可以使得JSP的页面布局优秀,更切合XML格局,并且可以重用一些页面元素。但TagLib的编译以后的代码复杂而混乱。TabLib很不天真,能完成的事变很无限。TabLib代码自己的可重用性遭到TagSupport界说的限定,不是很好。别的是,我不能不供认的一件事是,TagLib的编写自己不是一件兴奋的事变,现实我团体很否决这类开辟体例。2.手艺利用难易度模板手艺:模板手艺自己离开了Web情况,能够在不启动Webserver得情形下举行开辟和测试,一旦堕落具体的信息易于毛病的定位。因为模板引擎的把持,页面中将只处置显现逻辑(只管其大概很庞大)JSP手艺:事情在Web情况下,开辟测试必定要运转webserver。别的,一些TagLib可以发生新的标签,页面的终极结构也必需在web情况下才能够断定。测试时堕落信息不明白,出格是TagLib得存在,极不简单定位。因为其实质是程序,很简单在个中写进营业逻辑,乃至于数据库毗连代码,形成解耦的不完全。3.总结模板手艺加倍专注于页面的显现逻辑,无效匡助开辟职员分别视图和把持器。在进修,开辟和测试都加倍简单。JSP手艺自己是一个初期的手艺,自己并没有提出充足的体例来分别视图和把持器。相反,我以为其自己是勉励开辟职员不做解耦,由于在JSP代码中拔出营业逻辑是云云的简单。
先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。
简单生活 该用户已被删除
沙发
发表于 2015-1-18 12:03:47 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了Java程序的运行效率。
兰色精灵 该用户已被删除
板凳
发表于 2015-1-21 21:01:10 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
若相依 该用户已被删除
地板
发表于 2015-1-26 17:07:10 来自手机 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
莫相离 该用户已被删除
5#
发表于 2015-1-31 11:00:30 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
活着的死人 该用户已被删除
6#
发表于 2015-1-31 22:47:50 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
7#
发表于 2015-2-2 06:06:28 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
山那边是海 该用户已被删除
8#
发表于 2015-2-7 16:34:19 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
不帅 该用户已被删除
9#
发表于 2015-3-2 23:49:43 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
柔情似水 该用户已被删除
10#
发表于 2015-3-11 07:36:59 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
小妖女 该用户已被删除
11#
发表于 2015-3-17 23:09:20 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
深爱那片海 该用户已被删除
12#
发表于 2015-3-25 06:08:04 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 01:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表