java - 为什么要使用模板引擎? jsp 包括和 jSTL 与瓦片、freemarker、velocity、sitemesh

标签 java jsp velocity tiles freemarker

我即将选择组织 View 的方式(使用 spring-mvc,但这并不重要)

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

  • 图 block
  • 网站网
  • Freemarker
  • 速度
  • <jsp:include>
  • <%@ include file="..">

TilesSitemesh可以分组; FreemarkerVelocity 也可以。每个组中使用哪一个不是这个讨论的问题,有足够的问题和讨论。

This is an interesting read ,但不能完全说服我使用瓷砖。

我的问题是 - 这些框架提供了哪些无法正确完成的功能 <@ include file="..">和 JSTL。要点(部分摘自文章):

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

    <%@ include file="header.jsp" %>
    

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

  3. 布局重组 - 如果您想将面包屑导航移动到菜单上方,或者将登录框移动到另一个侧面板上方。如果页面包含(使用 jsp)没有很好地组织,在这种情况下您可能需要更改每个页面。但是如果你的布局不是太复杂,把常用的东西放在页眉/页脚里,那就没什么好担心的了。

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

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

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

  7. 占位符 -velocity/freemarker 提供的不仅仅是 JSTL 吗?在 JSTL 中放置占位符,并使用模型(由 Controller 放置在请求或 session 范围内)来填充这些占位符。

所以,请说服我应该使用上述任何框架来代替/除了纯 JSP。

最佳答案

Velocity 的一些参数(我没有使用过 Freemarker):

  • 在网络环境之外重复使用模板的潜力,例如在发送电子邮件时
  • Velocity 的模板语言语法比 JSP EL 或标记库简单
  • 将 View 逻辑与任何其他类型的逻辑严格分离 - 无法选择使用 scriptlet 标记并在模板中做一些讨厌的事情。

Placeholders - do velocity/freemaker give anything more than JSTL? In JSTL you put placeholder, and use the model (placed in request or session scope, by controllers) to fill these placeholders.

是的,references真的是VTL的核心:

<b>Hello $username!</b>

#if($listFromModel.size() > 1)
    You have many entries!
#end

Efficiency - <%@ include file="file.jsp" %> is more efficient than anything else, because it is compiled once. All other options are parsed/executed many times.

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

Layout reorganization - if you want to move the breadcrumb above the menu, or the login box above another side-panel. If page inclusions (with jsp) is not well organized, you might need to change every single page in such cases. But if your layout is not overly complex, and you put the common things in header/footer, there is nothing to worry about.

不同之处在于,使用 JSP 方法,您不会在每个使用相同页眉/页脚的 JSP 文件中重新组织此布局吗? Tiles 和 SiteMesh 允许您指定一个基本布局页面(JSP、Velocity 模板等 - 两者都是 JSP 框架的核心),您可以在其中指定任何您想要的内容,然后只需委托(delegate)给主要内容的“内容”片段/模板.这意味着只有一个文件可以将标题移入。

关于java - 为什么要使用模板引擎? jsp 包括和 jSTL 与瓦片、freemarker、velocity、sitemesh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3168559/

相关文章:

java - 如何验证 DTO 中的枚举?

java - 在 MySQL 数据库中插入非英文文本时的 JSP 编码

java - 在 Jira 插件的速度模板方面需要一些帮助

java - 更改上游项目中的速度日志文件位置

java - Play 2.0 并未运行所有测试

java - finish()后刷新文本EditText

java - Jetty 7 延续 : How to *not* redispatch the request?

java - jsp 未迭代 servlet 发送的 Linkedhashmap

java - 复选框显示为已禁用

javascript - Velocity:如何将txt内容设置为变量