最大的网站源码资源下载站,
velocity |
变量定义:用$标志 表达式语句:以#开始 强控制语言:变量赋值:#set $this = "velocity" 外部引用:#include ( $1 ) 条件控制:#if …. #end 非兼容语言 |
jdynamite 变量定义:用{}包装 表达式语句:写在注释格式(<!-- à)中 弱控制语言 兼容语言 |
xslt 变量定义:xml标签 表达式:xsl标签 强控制语言:外部引用:import,include 条件控制:if, choose…when…otherwise 非兼容语言 |
tapestry 采用component的形式开发。 变量定义(组件定义):在html标签中加上jwcid 表达式语句:ognl规范 兼容语言 |
example.vm: hello from $name in the $project project. example.java: velocitycontext context = new velocitycontext(); context.put("name", "velocity"); context.put("project", "jakarta"); |
velocity |
template template = velocity.gettemplate("test.wm"); context context = new velocitycontext(); context.put("foo", "bar"); context.put("customer", new customer()); template.merge(context, writer); 当调用velocity.gettemplate 方法时,将调用resourcemanger的对应方法。 resourcemanger先查看该模板文件是否在cache中,如果没有就去获取,生成resource对象并调用process()方法,确定该模板是否有效,如果有效,则在内存中生成一个node树。 当调用template.merge()时,遍历这颗node树,并调用每个node的render方法。对于模板中的变量和对象node,还将调用execute()方法,从context中取得value。 注:resourcemanger在runtime/resource包下,node在runtime/parser/node包下 |
tapestry |
tapestry比较麻烦,先介绍一下http请求的处理过程。 当httprequest请求到达时。该请求被applicationservlet捕获,随后applicationservlet通过getengine取到对应的engine,通过该engine的getservice拿到对应的service,调用其service方法执行http请求。 每个service通过requestcycle对象的getpage方法取得page对象,并将其设置为该cycle对象的active page。之后service调用renderresponse方法执行输出。 renderresponse调用page的getresponsewriter(output)取得writer对象,并把它传给cycle.renderpage(writer)方法,该方法调用page的renderpage方法。 page执行renderpage时,首先判断是否有listener的请求,如果有则处理listener请求;然后调用basecomponenttemplateloader的process方法把模板文件载入并形成一个component节点树,依次执行节点的rendercomponent方法。 每个component对象将通过ongl的机制取得对象属性。并把该值写入输入流。 例如:insert component protected void rendercomponent(imarkupwriter writer, irequestcycle cycle) { if (cycle.isrewinding()) return; object value = getvalue(); if (value == null) return; string insert = null; format format = getformat(); if (format == null) { insert = value.tostring(); } else{ try{ insert = format.format(value); } catch (exception ex) { throw new applicationruntimeexception( tapestry.format("insert.unable-to-format",value),this, getformatbinding().getlocation(), ex); } } string styleclass = getstyleclass(); if (styleclass != null) { writer.begin("span"); writer.attribute("class", styleclass); renderinformalparameters(writer, cycle); } if (getraw()) writer.printraw(insert); else writer.print(insert); if (styleclass != null) writer.end(); // <span> } getvalue为取得insert的value属性。 |
test.jsp: <html> <head><title>jsp test</title></head> <body> <table width="226" border="0" cellspacing="0" cellpadding="0"> <tr><td><font face="arial" size="2" color="#000066"> <b class="headlinebold">the jsp test file</b> </tr></td> </font> </table> <body> </html> |
test_jsp.java: package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import org.apache.jasper.runtime.*; public class test _jsp extends httpjspbase { private static java.util.vector _jspx_includes; public java.util.list getincludes() { return _jspx_includes; } public void _jspservice(httpservletrequest request, httpservletresponse response) throws java.io.ioexception, servletexception { jspfactory _jspxfactory = null; javax.servlet.jsp.pagecontext pagecontext = null; httpsession session = null; servletcontext application = null; servletconfig config = null; jspwriter out = null; object page = 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>/r/n"); out.write("<head><title>jsp test</title></head> /r/n"); out.write("<body>/r/n"); out.write("<table width=/"226/" border=/"0/" cellspacing=/"0/" cellpadding=/"0/">/r/n "); out.write("<tr><td><font face=/"arial /" size=/"2/" color=/"#000066/"> /r/n/t "); out.write("<b class=/"headlinebold/">the jsp test file"); out.write("</b>/r/n/t "); out.write("</tr></td></font>/r/n/t "); out.write("</table>/r/n"); out.write("<body>/r/n"); out.write("</html>"); } catch (throwable t) { out = _jspx_out; if (out != null && out.getbuffersize() != 0) out.clearbuffer(); if (pagecontext != null) pagecontext.handlepageexception(t); } finally { if (_jspxfactory != null) _jspxfactory.releasepagecontext(pagecontext); } } } |
tag类为: package my.customtags; import javax.servlet.jsp.jspwriter; import javax.servlet.jsp.pagecontext; import javax.servlet.jsp.tagext.tagsupport; public class hidden extends tagsupport{ string name; public hidden(){ name = ""; } public void setname(string name){ this.name = name; } public void release(){ value = null; } public int dostarttag(){ return eval_body_include;} public int doendtag() throws jsptagexception{ try{ pagecontext.getout().write(", you are welcome"); } catch(ioexception ex){ throw new jsptagexception("error!"); } return eval_page; } } jsp页面: <my:hidden name="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) return true; _jspx_tagpool_my_hidden_name.reuse(_jspx_th_my_hidden_11); return false; |
velocity: turbine项目(http://jakarta.apache.org/turbine)采用了velocity技术。 1. 友好性不够。理由: 强控制类型,出现页面显示控制代码和html混合。与html的不兼容,无法所见即所得。遇到大的html页面,从一个 “#if”找到对应的 “#end”也是很痛苦的一件事情。 2. 表现力强。理由:强控制语言。 3. 复用性弱。理由:模板脚本和页面代码混合。 |
xslt cocoon项目(http://cocoon.apache.org/)采用xml + xslt的方法。csdn社区也是采用此方案。 1. 内容和显示风格分离,这点xslt做的最好。 2. 速度慢。理由:xslt的使用xpath,由于是要解析dom树,当xml文件大时,速度很慢。 3. 友好性不够。理由:由于没有html文件,根本看不到页面结构、显示风格和内容。xsl语法比较难以掌握,由于没有“所见即所得”编辑工具,学习成本高。 4. 表现力强。理由:强控制语言。 5. 复用性弱。理由:xsl标签和html标签混合。 |
jdynamite 1. 表现力中等。理由:弱控制语言。 2. 友好性强。理由:所见即所得的效果。在模板件中的ignore block在编辑条件下可展示页面效果,而在运行中不会被输出。 3. 复用性强。理由:利用html标签。 |
tapestry 1. 友好性中等。理由:整个tapestry页面文件都是html元素。但是由于component会重写html标签,其显示的样子是否正确,将不预测。 2. 表现力强。理由:强控制语言。 3. 复用性强。理由:扩展了html元素的定义。 |
新闻热点
疑难解答