Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala webapps中单独HTML模板文件的基本原理?_Scala - Fatal编程技术网

Scala webapps中单独HTML模板文件的基本原理?

Scala webapps中单独HTML模板文件的基本原理?,scala,Scala,所有在Scala中进行过web应用程序开发的人都知道,您可以使用任何现有的JavaWeb框架,也可以使用Lift。所有这些框架的共同点是,它们都需要两个或多个文件来生成一个页面:某种HTML模板,以及一个或多个类来提供相关逻辑。即使您正在编写一个只支持JSP的应用程序,您可能仍然在使用大量自定义标记 这就引出了我注意到的一点:模板文件通常与HTML几乎没有相似之处。Wicket模板文件几乎都是HTML,因为在Wicket中,组件将自己绑定到模板中的HTML标记。但是在所有基于自定义标记的框架中,

所有在Scala中进行过web应用程序开发的人都知道,您可以使用任何现有的JavaWeb框架,也可以使用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>
def listify[T](items:Iterable[T],liBody:T=>NodeSeq)=
    { items.flatMap(i=>
  • {liBody(i)}
  • ) }
现在,如果我有,我已经放弃了架构纯度,因为我在“控制器”或“业务逻辑”或“备份对象”或任何你称之为它的东西中有ul和li标记,而不是在模板中。然而,这是一种创建列表的非常清晰和直接的方法。以任何其他方式执行此操作都需要替换一些运行时标记绑定框架,以取代Scala自己的内置功能

所以我想知道,为什么不走另一条路,去掉模板呢?如果Scala对创建未编号列表很有用,那么为什么它不能创建包含未编号列表的内容呢?然后一直上到页面返回html标记


我要问的问题是:如果一种语言已经包含了对XML的强大支持,那么使用模板文件并在运行时将其转换为实际HTML是否有显著的好处,还是更好地将模板文件看作是从没有内置XML支持的语言中继承的工件而放弃它们?

< P>我认为主要原因是工具支持。当项目的一部分严格使用XML(模板文件)时,支持工具就更容易了。从设计工具中操作代码要复杂得多(尽管并非不可能)

此外,在大多数生产环境中,从“视图”(使用您最喜欢的范式,MVC、MVP等)抽象业务逻辑是至关重要的。任何规模足够大的项目都可能会因为太过笨拙而无法完成。请记住,在生产环境中,通常有多个程序员,有时新的程序员加入团队或现有的程序员迁移,因此这不是真正的可选。web框架设计人员的大部分工作都投入到这个用例中,因此打破这种抽象的功能不那么重要

然而,我可以看到用于web开发的内部scala DSL对于小型项目可能有用。如果您觉得它有用的话,那么花时间创建一个轻量级的框架来使用它肯定不是不明智的。如果你创建了它并发现它很有用,那么其他人也可能会这么做

建议资源:


    • 我认为,您的论点和强大的XML支持是双向的。由于强大的XML支持,您可以在模板中定义自己的标记,不仅可以绑定变量,还可以在模板中进行一些XML转换

      例如,您可以定义一个包装器标记,它接受所有内部表节点,并向每一行添加奇数和偶数类。当然,你也可以在listify(或Tablerify)方法中做到这一点,但这样你会失去更多的纯度

      对于只有几个控制器的简单应用程序,我认为可以不使用模板,如前面引用的示例所示。你只要说“打印那个列表”就行了。然而,对于更大的框架,您的逻辑显然变得越来越复杂。需要有一种方法告诉应用程序何时何地需要调用每个控制器。您可能会在一个XML文档中定义它,这就是您想要摆脱的XML模板。
      然后,根据谁将要设计模板,您要么希望允许XML中的代码,要么希望避免它。由于scala的XML处理简单,在避免使用它时,您实际上不会错过太多,因为您有其他方法来解决它


      现在,lift XML模板显然是非scala风格的,因此没有直接插入scala逻辑的方法。其他框架可能选择了不同的路线。但在lift中,我认为,您可以为HTML主体创建一个自定义XML标记,然后使用一个函数,在该函数中,您可以故意将scala代码与XML内容混合以生成输出。

      简单的回答是:两者都有

      即使使用Lift,您也不必使用模板——您可以直接在代码中编写视图。几乎没有记录,但可能

      然而,如果您尝试,您将很快发现视图代码在布局和样式方面变得丑陋。如果你想尝尝,试着复制一下,比如说,原始Scala;)中的Facebook首页

      如果在一个项目上工作的人员超过2-3人,则自然会出现职责分离。模型视图控制器之所以流行,不是因为web是一个很好的例子(它是一个真正的sh*tty例子),而是因为它是这种职责分离的最佳近似——HTML/CSS/JavaScript通常不是PHP/Java/Scala的人,这两种人都需要能够独立工作

      简而言之,如果你想用Scala写下你的观点,我可以建议你在Lift中如何做到这一点——花时间学习,你会得到大量其他美味的战利品