我做了一些php dev,这种语言的大趋势是使用smarty或其他模板引擎。
通常大致如下:
将模板加载为常规字符串, 寻找它的{tag} 用某些代码的结果替换每个{tag}。 具有输入参数的缓存页面 渲染结果页面。 (有时添加一些OO原则,如模板成为对象......)
当我看到jsp时,我看到了scriplets的使用,taglibs有复杂的东西,如
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ page import="ghhghjjgj"%>
然后:
<logic:if>some html </logic:if>
或更糟:
<%= if (blabal) {%>
some html
<%}else ...%>
等等。
好吧,瓷砖让我可以把一些jsp页面粘在一起,这真的很方便(比如php中的include,等等)
在我看来,php的方法在以下方面要好得多:
C#approah也非常有趣,但我只想在我的问题中解决模板部分而不是启动任何C#Vs Java Troll战争。 我也不想说php更好。
我只是想知道为什么java中没有安装良好的模板引擎,为什么我们仍然使用scriplets / taglibs。
所以我猜我一定错过了什么。 一些Java EE Web专家能否向我展示我的推理缺陷?
答案 0 :(得分:3)
J2EE很久以前就成了Java EE。放下“2”。
没有人应该使用scriptlet。这是1999年的技术。如果你在书中看到它,那是因为这些书很旧。现在编写另一个servlet / JSP书的原因并不是很多。
自定义标记库已经失宠了。 JSTL是标准。你不太可能需要更多。
模板很常见 - 请查看Velocity。我正在研究的一个项目专门用于将HTML流式传输到浏览器。
答案 1 :(得分:0)
例如,Java,Velocity有许多模板引擎。 JSP编译为Java字节码。它允许非常快速的执行。这个因素对您来说是否重要取决于您的任务,对于大多数网站来说,模板处理不会成为问题。
答案 2 :(得分:0)
我真的不明白为什么写“
很有意义{if blabal} some html{/if}
并没有那么好写
<logic:if test="blabal"> some html</logic:if>
写的更糟糕
<% if (blabal) { %> some html <% } %>
但写好
#if ( blabal )
some html
#end
我个人喜欢在java中编写逻辑。
但是,对我来说,混合模板代码和逻辑是一种好的或坏的方法并不是语法问题。因此我更喜欢Snippetory。我从模板中获取逻辑,同时保持对模板中的一致性(ecaping等),外观(formatting ...)和internationalization的责任。绑定逻辑变得可测试,易于组织和重用。数据模型可以按原样使用,并且不需要将其转换为足以用于某种外来技术的模型。在这种情况下,模板是一种模型,您可以将必要的数据复制到一个模型中,而不是从上下文中自助服务的过程。
现在,在这种情况下,我们需要和平的软件来表达同样的事情,因为它总是发生在使用separation of concerns的原则来使软件更易于维护。
模板:
<t:named-region> some html with a {v:value} </t:named-region>
逻辑:
if (blabal) {
template.get("named-region").set("value", value).render();
}
现在我们看一下,它的代码要多得多。同样,这是关注问题的典型。但是,快速查看这些步骤可能有意义:
最后一步似乎是可以分发的。我把数据填充到它,所以很明显我想用它。但是你必须要注意,render()
是render(template, "named-region")
的捷径。所以这是一个描述如何它被使用。借助这种机制,您可以轻松地将一个文件的构建块甚至几个文件组合到您的选择输出中。这导致这些块的重复使用令人惊讶地方便。
它让我更加专注:当我努力获得html,css和javaScript时,我不必处理'访问数据的确切路径是什么?'或'这个按钮显示的确切情况是什么?'。这只是'有逻辑,所以它有一个名字'。非常简单,非常干净。
当然还有一些其他引擎支持分离模板和逻辑,比如jByte(我用了一段时间)或JTPL只是为了命名视图。但是,所有这些似乎都缺乏一些功能,我决定写Snippetory。