专栏首页Vamei实验室来玩Play框架03 模板

来玩Play框架03 模板

在上一章节中,我把字符串通过ok()返回给客户。我可以把一个完整的html页面放入字符串中返回。然而,现代的框架都提供了更好的方法——模板。模板将视图和数据分开。服务器可以把不同的数据传递给同一个模板,从而产生不同的页面。 Play同样也有一套模板系统。模板的大部分内容都可以用html写,作为视图,而在一些特别的地方,预留给数据参数。在模板中,用Scala语言来调用参数。

使用模板

我首先创建一个模板,纯粹起视图功能。在app/views文件夹中,新建文件index.scala.html (如果已有,则删除并重新创建)。

<!DOCTYPE html>
<html>
  <header>
    <title>Play</title>
  </header>

  <body>
    <p>Hello World! Start using the Template.</p>
  </body>
</html>

这个模板是个纯粹的html文件,是最简单的模板形式。

修改app/controllers/Application.java:

package controllers;

import play.*;
import play.mvc.*;


public class Application extends Controller {
    public static Result index() {
        return ok(views.html.index.render());
    }
}

ok()中接收的是views.html.index.render(),实际上就是app/views/index.scala.html这一模板的render()方法。Play会根据模板,自动生成相应的类。

*** 也可以用import引入views.html.index,而不是使用完整的类路径。

访问页面:

模板语言

这一部分,我把对象作为参数传给模板,然后在模板中显示对象中包含的数据。修改index.scala.html:

@(title: String, content: String)

<!DOCTYPE html>
<html>
  <header>
    <title>@title</title>
  </header>

  <body>
    <p>@(content) Start using the template.</p>
  </body>
</html>

上面的第一行,以@符号开头,说明了该模板所接收的两个参数,即String类型的title和content。在模板中,用@符号和参数名,来调用参数。参数名周围可以用括号"()",以区分正文。

修改动作:

public static Result index() {
    return ok(views.html.index.render("Play", "Hello World! Parameters passed. "));
}

这里传递两个字符串给模板。最终显示的结果中,两个字符串将填充在模板中的适当位置。

上面把一个对象传递给模板。我们还可以在模板中调用对象的属性或方法:

@object.method()

@object.field

模板控制

我还可以用Scala的语法,在模板中实现更复杂的逻辑。比如下面的模板中使用循环:

@(title: String, content: String, lines: List[String])

<!DOCTYPE html>
<html>
  <header>
    <title>@title</title>
  </header>

  <body>
    <p>@(content) Start using the template.</p>
    <ul>
    @for(line <- lines) {
      <li>@line</li>
    }
    </ul>
  </body>
</html>

循环是@for实现的。@后面不仅可以是一个对象,还可以是一个完整的Scala语法。

修改动作,把一个字符串类型的表作为参数传递给模板:

package controllers;

import play.*;
import play.mvc.*;

import java.util.List;
import java.util.ArrayList;

public class Application extends Controller {
    public static Result index() {
        List<String> lines = new ArrayList<String>();
        lines.add("a");
        lines.add("b");
        lines.add("c");
        return ok(views.html.index.render("Play", "Hello World!", lines));
    }
}

得到下面的页面:

模板中还可以有if选择结构,比如

@if(item) {
  <p>True</p>
} else {
  <p>False</p>
}

根据参数item的真假,if结构显示不同的内容。

其它

在@* *@中加入注释

由于@的特殊功能,为了在模板中显示"@"字符,需要使用@@。

总结

模板

render()

@

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Scala Macros - 元编程 Metaprogramming with Def Macros

        Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level pr...

    用户1150956
  • Scalaz(25)- Monad: Monad Transformer-叠加Monad效果

    中间插播了几篇scalaz数据类型,现在又要回到Monad专题。因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解...

    用户1150956
  • Scalaz(17)- Monad:泛函状态类型-State Monad

      我们经常提到函数式编程就是F[T]。这个F可以被视为一种运算模式。我们是在F运算模式的壳子内对T进行计算。理论上来讲,函数式程序的运行状态也应该是在这个运算...

    用户1150956
  • Scalaz(16)- Monad:依赖注入-Dependency Injection By Reader Monad

      在上一篇讨论里我们简单的介绍了一下Cake Pattern和Reader Monad是如何实现依赖注入的。主要还是从方法上示范了如何用Cake Patter...

    用户1150956
  • Scala Macros - scalamela 1.x,inline-meta annotations

      在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改、扩展和替换,如此...

    用户1150956
  • Scalaz(56)- scalaz-stream: fs2-安全运算,fs2 resource safety

        fs2在处理异常及资源使用安全方面也有比较大的改善。fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常、在纯代码里隐式...

    用户1150956
  • Scalaz(58)- scalaz-stream: fs2-并行运算示范,fs2 parallel processing

        从表面上来看,Stream代表一连串无穷数据元素。一连串的意思是元素有固定的排列顺序,所以对元素的运算也必须按照顺序来:完成了前面的运算再跟着进行下一个...

    用户1150956
  • Scalaz(24)- 泛函数据结构: Tree-数据游览及维护

    上节我们讨论了Zipper-串形不可变集合(immutable sequential collection)游标,在串形集合中左右游走及元素维护操作。这篇我...

    用户1150956
  • Scalaz(20)-Monad: Validation-Applicative版本的Either

      scalaz还提供了个type class叫Validation。乍看起来跟\/没什么分别。实际上这个Validation是在\/的基础上增加了Applic...

    用户1150956
  • Scalaz(57)- scalaz-stream: fs2-多线程编程,fs2 concurrency

        fs2的多线程编程模式不但提供了无阻碍I/O(java nio)能力,更为并行运算提供了良好的编程工具。在进入并行运算讨论前我们先示范一下fs2 pip...

    用户1150956

扫码关注云+社区

领取腾讯云代金券