我为什么要使用模板引擎?jsp include和jstl vs tiles,freemarker,velocity,sitemesh

Boz*_*zho 95 java jsp velocity freemarker tiles

我即将选择组织我的观点(使用spring-mvc,但这不应该太重要)

据我所知,有6个选项(尽管它们并不相互排斥):

  • 瓷砖
  • SiteMesh的
  • Freemarker的
  • 速度
  • <jsp:include>
  • <%@ include file="..">

TilesSitemesh可以分组; 所以可以的Freemarker速度.每个小组中使用哪一个不是这个讨论的问题,有足够的问题和讨论.

这是一个有趣的读物,但不能说服我使用瓷砖.

我的问题是 - 这些框架提供的内容 <@ include file="..">与JSTL 无法正常完成.要点(一些来自文章):

  1. 包括部分页面,如页眉和页脚 - 之间没有区别:

    <%@ include file="header.jsp" %>
    
    Run Code Online (Sandbox Code Playgroud)

    <tiles:insert page="header.jsp" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在标题中定义参数 - 如标题,元标记等.这非常重要,尤其是从SEO的角度来看.使用模板选项,您只需定义每个页面应定义的占位符.但是你可以在jsp中使用JSTL,使用<c:set>(在包含页面中)和<c:out>(在包含的页面中)

  3. 布局重组 - 如果要在菜单上方移动面包屑,或在另一个侧面板上方移动登录框.如果页面包含(使用jsp)组织不当,则可能需要在这种情况下更改每个页面.但是如果你的布局不是太复杂,并且你把常见的东西放在页眉/页脚中,就没有什么可担心的了.

  4. 公共组件和特定内容之间的耦合 - 我没有发现这个问题.如果要重用某些片段,请将其移动到不包含任何页眉/页脚的页面,并在需要的地方包含它.

  5. 效率 - <%@ include file="file.jsp" %>比其他任何东西都更有效,因为它被编译一次.所有其他选项都被解析/执行多次.

  6. 复杂性 - 所有非jsp解决方案都需要额外的xml文件,其他包括,预处理器配置等.这既是学习曲线又是引入更多潜在的失败点.此外,它使支持和更改变得更加乏味 - 您必须检查许多文件/配置以了解正在发生的事情.

  7. 占位符 - 速度/自由标记比JSTL更多吗?在JSTL中,您放置占位符,并使用模型(放置在请求或会话范围内,由控制器)来填充这些占位符.

所以,说服我除了普通的JSP之外我应该使用上面的任何框架而不是/.

mat*_*t b 17

Velocity的一些论据(我没有使用过Freemarker):

  • 有可能在Web上下文之外重用模板,例如发送电子邮件
  • Velocity的模板语言的语法是远远高于JSP EL或标签库简单
  • 严格地将视图逻辑与任何其他类型的逻辑分离 - 没有可能选择下拉到使用scriptlet标签并在模板中执行令人讨厌的事情.

占位符 - 速度/自由制造者提供的东西比JSTL更多吗?在JSTL中,您放置占位符,并使用模型(放置在请求或会话范围内,由控制器)来填充这些占位符.

是的,引用确实是VTL的核心:

<b>Hello $username!</b>
Run Code Online (Sandbox Code Playgroud)

要么

#if($listFromModel.size() > 1)
    You have many entries!
#end
Run Code Online (Sandbox Code Playgroud)

效率 - <%@ include file="file.jsp" %>比其他任何东西都更有效,因为它被编译一次.所有其他选项都被解析/执行多次.

不太确定我同意或理解这一点.Velocity有一个缓存模板的选项,这意味着它们被解析的抽象语法树将被缓存而不是每次从磁盘读取.无论哪种方式(我没有这方面的实数),Velocity 对我来说总是感觉很快.

布局重组 - 如果要在菜单上方移动面包屑,或在另一个侧面板上方移动登录框.如果页面包含(使用jsp)组织不当,则可能需要在这种情况下更改每个页面.但是如果你的布局不是太复杂,并且你把常见的东西放在页眉/页脚中,就没有什么可担心的了.

不同的是,使用JSP方法,您不会在使用相同页眉/页脚的每个JSP文件中重新组织此布局吗?Tiles和SiteMesh允许您指定基本布局页面(JSP,Velocity模板等 - 它们都是JSP框架),您可以在其中指定所需内容,然后委托主内容的"内容"片段/模板.这意味着只有一个文件可以移动标题.

  • 使用JSTL可以轻松完成您提供的速度示例.效率点我的意思是jsps被编译为servlet,没有任何东西被解析.但缓存模板也是一个很好的解决方案,是的.至于重组 - 不,我通常以某种方式包括我只需修改包含,而不是"包含者".也许在更复杂的情况下,这是不可能的. (3认同)
  • 除了从Web上下文中重用模板外,Velocity还可以让您轻松抓取呈现的网页,然后再将其显示给客户端.当您希望将站点生成为HTML文件时,它非常有用.使用JSP - 没有简单的解决方案.这是我们从JSP切换到Velocity的主要原因.关于速度 - 我做了一些基准测试,Velocity渲染页面的速度比JSP快2倍.所以速度不是问题.现在,在与Velocity共度几年之后,我再也不会回到JSP了.它更简单,更轻,更清洁. (2认同)

moo*_*eds 12

之间的选择jsp:include瓷砖/ SiteMesh的/等之间的选择的简单性和功率,开发人员面临的所有时间.当然,如果您只有几个文件或者不希望您的布局经常更改,那么只需使用jstljsp:include.

但应用程序有一种逐步增长的方式,并且很难证明"停止新开发和改造瓷砖(或其他一些解决方案),以便我们可以更容易地解决未来的问题",如果你不使用一开始的复杂解决方案.

如果您确定您的应用程序将始终保持简单,或者您可以设置一些应用程序复杂性的基准,之后您将集成一个更复杂的解决方案,那么我建议不要使用tile/etc. 否则,从一开始就使用它.


Bar*_*art 5

我不会说服您使用其他技术。就我所知,如果对他们有用,那么每个人都应该坚持使用JSP。

我主要与Spring MVC合作,我发现JSP 2+与SiteMesh完美结合

SiteMesh 2/3

提供装饰器以应用于视图,就像其他模板引擎中的继承工程一样。如今,没有这种功能是无法想象的。

JSP 2+

人们声称,JSP很难避免模板中的Java代码是虚假的。您只是不应该这样做,而使用此版本则没有必要这样做。版本2支持使用EL的调用方法,与以前的版本相比,这是一个很大的优势。

使用JSTL标签,您的代码仍将看起来像HTML,因此不太麻烦。Spring通过taglibs打包了对JSP的大量支持,这非常强大。

标签库也易于扩展,因此自定义您的环境非常容易。


Tho*_*sen 2

反对使用 JSP 的 Facelets(不在您的列表中,但我只是提一下)的最佳论据之一是编译与解释器集成,而不是委托给 JSP 编译器。这意味着我在 JSF 1.1 中遇到的最烦人的事情之一 - 在保存更改时必须更改周围 JSF 标记上的 id 属性,以便运行时引擎发现更改 - 消失了,给出了保存 -在编辑器中、在浏览器中重新加载循环回来,以及更好的错误消息。