在Scala中完成任何Web应用程序开发的每个人都知道您可以使用任何现有的Java Web框架,或者您可以使用Lift。所有这些框架的共同之处在于它们都需要两个或更多文件来生成页面:某种HTML模板,以及一个或多个提供相关逻辑的类。即使您正在编写仅限JSP的应用程序,您仍可能使用大量自定义标记。
这让我想到了一些我注意到的事情:模板文件通常与HTML几乎没有相似之处。 Wicket模板文件几乎是HTML,因为在Wicket中,组件将自身绑定到模板中的HTML标记。但是在所有基于自定义标签的框架中,模板通常都是自定义标签,并且不能在浏览器中自行渲染。
Scala支持将任意XML直接嵌入到程序源中。这是一个Scala函数,它从集合中生成一个未编号的列表:
def listify[T](items: Iterable[T], liBody: T => NodeSeq) = <ul>{
items.flatMap(i => <li>{liBody(i)}</li>)
}</ul>
现在,如果我有这个,我已经放弃了建筑纯度,因为我在“控制器”或“业务逻辑”或“支持对象”中有ul和li标签,或者你称之为“支持对象”,而不是模板。然而,这是创建列表的一种非常清晰和直接的方式。以任何其他方式执行此操作需要替换一些运行时标记绑定框架来代替Scala自己的内置功能。</ p>
所以我想知道,为什么不走另一条路去摆脱模板呢?如果Scala对于创建无编号列表很有用,那么为什么它也不能创建包含未编号列表的内容?并一直向上返回到html标签。
我要问的问题是:如果一种语言已经包含对XML的强大支持,那么使用模板文件并在运行时将它们转换为实际的HTML会有很大的好处,或者将模板文件视为从没有内置XML支持的语言中携带的工件并放弃它们?
答案 0 :(得分:2)
我认为主要原因是工具支持。当项目的一部分是严格的XML(模板文件)时,更容易支持工具。从设计工具中操纵代码是非常棘手的(尽管不是不可能)。
此外,在大多数生产环境中,从“视图”(使用您最喜欢的任何范例,MVC,MVP等)抽象业务逻辑是至关重要的。任何足够大的项目都可能过于笨重,没有它。请记住,在生产环境中,通常有不止一个程序员,有时新程序员加入团队或现有程序员移动,因此它不是真正可选的。 Web框架设计人员的大部分工作都投入到这个用例中,因此打破这种抽象的功能不是优先考虑的事项。
但是,我可以看到用于Web开发的内部scala DSL可能对小项目有用。如果你觉得它很有用,那么把时间花在为这种用途创建轻量级框架上肯定不是不明智的。如果您创建它并发现它很有用,那么其他人也可能会这样做。
建议资源:
答案 1 :(得分:2)
简短的回答是:两者。
即使使用Lift,您也没有“使用”模板 - 您可以直接在代码中编写视图。记录很少,但可能。
但是,如果您尝试,您会很快发现您的视图代码因布局和样式问题而变得难看。如果您想品尝一下,请尝试复制原始Scala中的Facebook首页;)。
如果超过2-3人正在从事项目工作,自然会产生责任分离。模型 - 视图 - 控制器之所以受欢迎并不是因为网络就是一个很好的例子(它是一个很好的例子),但因为它是这种职责分离的最佳近似 - HTML / CSS / JavaScript是通常不是PHP / Java / Scala人,两种类型都需要能够独立生产。
简而言之,如果您希望在Scala中撰写您的观点,我是否可以建议您如何在Lift中进行操作 - 您可以获得大量其他美味的赃物,以便花时间学习它。一旦你用这样的方式写了一两个应用程序,问问自己这是否是你想要重复的经历。 :)
答案 2 :(得分:1)
我认为,您使用强大的XML支持的论点可以兼顾两种方式。由于强大的XML支持,可以在模板中定义自己的标记,不仅可以绑定变量,还可以在模板中进行一些XML转换。
例如,您可以定义一个包装器标记,它接受所有内部表节点,并为每个行添加奇数和偶数类。 (参见this。)当然,你也可以在你的listify(或tabularify)方法中做到这一点,但是你会失去更多的纯度。
对于只有几个控制器的简单应用程序,我认为可以不使用模板,如已引用的step framework所示。你只需说'打印那份清单'即可。然而,对于更大的框架,您的逻辑显然变得越来越复杂。需要有一种方法来告诉应用程序何时何地需要调用每个控制器。您可能会在单个XML文档中定义它 - 并且再一次,您想要摆脱的XML模板。
然后,根据将要设计模板的人,您要么允许使用XML代码,要么希望避免使用它。而且由于scala的XML处理容易,当你避免它时,你实际上不会错过那么多,因为你有其他方法可以解决它。
现在,提升XML模板显然是非scala-esque,因此没有直接的方法来插入scala-logic。其他框架可能选择了不同的路线。但是,我认为,你可以为你的HTML主体创建一个自定义XML标签,然后有一个函数,你有意将scala代码与XML东西混合起来产生你的输出。