使用jsp/taglibs与模板引擎


using jsp/taglibs versus template engine

我已经做了一些php开发,这种语言的大趋势是使用smarty或其他模板引擎。

它通常大致运行如下:

将模板加载为常规字符串,查找其{标记}用某些代码的结果替换每个{tag}。使用输入参数缓存页面呈现生成的页面。(有时添加一些OO原则,如模板成为对象…(

当我查看jsp时,我看到了scriplets的用法,taglib与等复杂的东西一起使用

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

然后:

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

或更糟:

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

等等。

好吧,tiles使我能够将一些jsp页面粘在一起,这真的很方便(就像php中的include一样(

在我看来,php方法在以下方面要好得多:

  • 它将gui和模型处理完全分离
    -当你在后面工作时,更容易更改页面内容,您在一个真正的java类中,没有像%@<%=这样复杂的东西。(谁说ala C#后面的代码?(

C#方法也很有趣,但我只想解决问题中的模板部分,而不是开始任何C#与Java的Troll之战。我不想说php更好。

我只是想知道为什么java中没有一个安装良好的模板引擎,以及为什么我们仍然使用scriplets/taglib。

所以我想我一定错过了什么。Java EE Web专家能向我展示一下我推理的缺陷吗?

J2EE在很长一段时间前就成为了Java EE。放下"2"。

任何人都不应该使用scriptlet。这是1999年的技术。如果你在书中看到它,那是因为书很旧。现在写另一本servlet/JSP书的理由不多。

自定义标记库已经失宠。JSTL是标准。你不太可能需要更多。

模板化很常见——看看Velocity。我正在进行的一个项目专门使用它将HTML流式传输到浏览器。

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

我真的不明白为什么写很好

{if blabal} some html{/if} 

写不太好

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

写更糟糕

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

但是写很好

#if ( blabal )
    some html
#end

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

  • 键入save
  • 我知道语法

然而,对我来说,混合模板代码和逻辑是好是坏,这不是语法问题。因此我更喜欢狙击。我从模板中获得了逻辑,同时保留了模板中一致性(ecaping之类的东西(、外观(格式化…(和国际化的责任。绑定逻辑变得可测试,易于组织和重用。数据模型可以按原样使用,无需将其转换为足以用于某种外星技术的模型。在这种情况下,模板更像是一种将必要的数据复制到其中的模型,而不是一个从上下文中自助服务的过程。

现在,在这种情况下,我们需要软件的和平来表达同样的东西,因为人们总是使用关注点分离的原则来提高软件的可维护性。

模板:

<t:named-region> some html with a {v:value} </t:named-region>

逻辑:

if (blabal) {
  template.get("named-region").set("value", value).render();
}

现在,当我们看到这个,它是相当多的代码。同样,这是典型的担忧分离。然而,快速查看步骤可能是有意义的:

  1. 获得了进入该地区的通道
  2. 数据已绑定到模板。这是细粒度的,就像填充from一样
  3. 已完成的表单绑定到输出

最后一步似乎有点多余。我向它填充了数据,所以很明显我想使用它。但你必须注意,render()render(template, "named-region")的捷径。因此,这是一个如何使用它的描述。有了这种机制,你可以很容易地将一个文件甚至几个文件的构建块组合到你选择的输出中。这导致了对这些块的惊人方便的重用。

它让我集中精力:当我努力获得html、css和javaScript时,我不必处理"访问数据的确切路径是什么?"或者"这个按钮显示的具体情况是什么?"。这只是关于"有逻辑,所以它有一个名字"。很简单,很干净。

当然,还有一些其他引擎支持模板和逻辑的分离,比如jByte(我用了一段时间(或JTPL,只是为了命名视图。然而,所有这些似乎都缺乏一些功能,尽管如此,我还是决定写《狙击手》。