2012-06-20 46 views
0

我已经做了一些php开发,并且这种语言的大趋势是使用诸如smarty或其他模板引擎之类的东西。使用jsp/taglibs与模板引擎

它通常运行大致如下:

加载模板作为一个普通字符串, 查找其{}标签与 的一些代码的结果替换每个{标签}。 缓存页面输入参数 渲染结果页面。 (有时也加一些OO原则,如模板成为一个对象...)

当我看着jsp的,我看到scriplets的使用,标签库与复杂的事情像

<%@ taglib uri="/tags/struts-logic" prefix="logic" %> 
<%@ page import="ghhghjjgj"%> 

则:

<logic:if>some html </logic:if> 

或者更糟:

<%= if (blabal) {%> 
some html 
<%}else ...%> 

等等。

好,地砖让我有些jsp页面粘合起来,一起是非常方便的(如在PHP中包括那种)

这在我看来,PHP的办法是在方式要好得多:

  • 它完全分开gui和模型处理。
    - 当您在处理背后部分时,更改页面内容更容易, 您处于真正的java类中,没有像%@ <%=这样复杂的东西。 (谁说后面ALA C# 代码;))

的C#approah是非常有趣的很好,但我只是想解决的模板部分中我的问题并没有启动任何C#和Java巨魔战争? 我也不想说php是更好的。

我只想知道为什么在java中没有安装好的模板引擎,为什么我们仍然使用scriplets/taglibs。

所以我想我一定会错过一些东西。 某些Java EE Web专家可以告诉我我推理的缺陷吗?

+0

看起来你有正确的想法缩进你的代码4个空格。但是,您还需要在代码和上面的段落之间留出空白行,以便将其正确识别为代码。 –

+0

好的,谢谢你的提示:) –

回答

3

J2EE很早以前就成为了Java EE。放下“2”。

没有人应该使用scriptlets。这是1999年的技术。如果你在书本上看到它,那是因为书很旧。现在编写另一个servlet/JSP书籍没有太多好的理由。

定制标签库已经失宠。 JSTL是标准。你不太可能需要更多的东西。

模板很常见 - 看看Velocity。我正在处理的一个项目专门用于将HTML流式传输到浏览器。

+0

为了清晰起见进行了编辑。我应该说“自定义”标签库。 – duffymo

+0

+1对于JSTL的澄清 – maksimov

0

例如,Java,Velocity有很多模板引擎。 JSP编译为Java字节码。它允许非常快速的执行。这个因素是否对你很重要,取决于你的任务,对于大多数网站来说,模板处理不会是一个问题。

+0

尤其是因为JSP可以被预编译。无需支付首次使用的罚款。 – duffymo

0

我真的不明白的影响,为什么我们很高兴地写

{if blabal} some html{/if} 

并没有那么好写

<logic:if test="blabal"> some html</logic:if> 

而且更糟糕的是写

<% if (blabal) { %> some html <% } %> 

但很好写

#if (blabal) 
    some html 
#end 

我个人喜欢在java中编写我的逻辑。

  • 类型保存
  • 我知道的语法

但是,对我来说这不是语法的问题wheter混合模板代码和逻辑是好事还是坏事。因此我更喜欢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(); 
} 

现在,我们看看这个,这是相当多的代码。这也是典型的关注问题。但是,快速查看步骤可能有意义:

  1. 访问该区域已获得。
  2. 数据绑定到模板。这种情况发生的很好,就像填写一张。
  3. 完成的表单绑定到输出。

最后一步似乎有点dispenseable的。我向它填充数据,所以很明显我想使用它。但是你必须知道,render()render(template, "named-region")的捷径。所以这是一个详细描述它是如何使用。由于这种机制,您可以轻松地将一个文件或甚至多个文件的构建块组合到您的选择输出中。这导致这些块的重复使用非常方便。

而且它获得我重点:当我激烈战斗来获得HTML,CSS和我没有处理用JavaScript权“是如何访问数据的准确路径?'或'该按钮显示的确切情况是什么?'。这只是'有逻辑,所以它有一个名字'。非常简单,很干净。

当然,还有一些其他的引擎支持模板和逻辑的分离,比如jByte(我用了一段时间)或JTPL来命名视图。然而,他们都似乎缺乏一些功能,但我决定编写Snippetory。