Play之Scala

Stella981
• 阅读 691

现在几乎每个web语言都会有这样那样的模板供你选择,如果你曾经使用过任何一种模板,我想模板这个概念你能很清晰的阐明,我借用类与对象的关系进行阐述:模板的功能就是将(含有模板元素的)页面实例化输出。每个人对模板的概念都不一而同,但模板干的事情几乎都是一致的--渲染页面!

Play的模板在HTML基础上直接基于Scala语言,模板文件通常存放在/app/views目录下,文件须以“.scala.html”双扩展名命名。Play的每个模板文件其实都是一个Scala代码,均需要通过Scala编译器检查其类型与语法,并编译成.class可执行的JVM二进制文件。

编译时Play首相会将.scala.html的Play模板文件自动生成为.scala的源代码文件,如 /app/views/index.scala.html的模板文件将会生成/target/scala-2.9.1/src_managed/main/views/html/index.template.scala文件,该文件将会继而被Scala编译器编译成index.class。

首先看一下index.scala.html文件:

@(message: String)

@main("Welcome to Play") {

    @play20.welcome(message)

}

我们可以先这么简单的理解:message是传入到@main(){}里的参数

那@main()... 是什么呢?--是在调用 main.scala.html 的模板!--我也是刚学的:),一切都明了了,就看看这个模板里写的是什么:

@(title: String)(content: Html)

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
        <script src="@routes.Assets.at("javascripts/jquery-1.9.0.min.js")" type="text/javascript"></script>
    </head>
    <body>
        @content
    </body>
</html>

很眼熟是吧,我们使用其他模板时候,也会经常和这个页面打交道吧!对,这就是要渲染的目标模板页面!

**现在是不是清晰明了了?但是我有个疑问:为什么要这么设计?为什么不能像Servlet那样setAttr..然后通过模板引擎获取值(getAttr..)之后直接渲染页面呢?这样跳来跳去的有什么好处呢?----先把这个疑问搁置一下。
**

在Play的模板中@符号代表跟随其后的代码为Scala语言代码,由于最终任何.scala.html文件都将转换成Scala语言代码,在编写Play模板时也可以理解为编写Scala语言代码,一个模板文件可以理解为一个对象,因此需要传入参数时就必须在模板文件的第一行定义都需要哪些入参以及这些入参的名字和类型。

服务器端的代码注释写法为: @* 注释内容 *@

看完之后,我好像明白了为什么Play会这么用模板了,中间那层index.scala.html是为了将Controller里传入的实参转化为:参数标记Key-value的形式,然后再调用模板实现页面渲染(Play中参数标记key并不像Beetl那样是字符串形式,而是默认参数次数 的形式!)。---难道Play的action不支持像Servlet那种set/getAttr..吗?还需要这么样的一个跳板?也许是我too young too simple!

Play模板传参的这种情况,不同于其他模板的实现,是使用默认参数顺序来构建的,这样就要求我们记住参数顺序,并且在渲染页面里顺序接受再使用。--经过询问高手,原来Play中把模板认为是scala object,所以安装这种方式来操作!--另外听说,Play不支持session,推荐使用cache管理session。

在后面的学习中,我们继续探究Play的模板机制吧!

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
springboot2.0结合freemarker生成静态化页面
\TOC\使用freemarker将页面生成html文件,本节测试html文件生成的方法:1、使用模板文件静态化定义模板文件,使用freemarker静态化程序生成html文件。2、使用模板字符串静态化定义模板字符串,使用freemarker静态化程序生成html文件。1\.pom.xml
菜园前端 菜园前端
1年前
DOM 文档对象模型使用教程来喽!
原文链接:HTML模板html我是网站标题访问节点通过id访问指定节点getElementByIdjavascriptvarnodedocument.getElementById('box')通过name访问指定节点getElementsByNamejav
Wesley13 Wesley13
3年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Stella981 Stella981
3年前
PHP 生成静态文件html,php静态化
第一种:如果你愿意花费时间写一套模板解析方法的话,那么可以直接读取模板,然后将模板里的标签解析掉,再写入。    具体代码略……第二种:使用ob缓冲区例子:ob_end_clean();ob_start();$thisdisplay('article');//框架中显示页面的方法
Wesley13 Wesley13
3年前
Java 对象和类
你知道这就是一个类嘛?你知道这是一个类的实例嘛?你记住这是一个抽象类!。。。(QAQ,连概念都记不牢。。嘤嘤嘤)「复习备考」类是一个模板,它描述一类对象的行为和状态。在Java中类可以看成是创建Java对象的模板。(可以理解成是你解题时固有的套路)对象是类的实例,它有状态和行为。(类的实例,就比如你虽然有了解题的套路,但
Wesley13 Wesley13
3年前
C++:模板类
22.模板类22.1模板类模板是泛型编程的基础,那什么是泛型编程呢?泛型编程是一种独立于任何特定数据类型编写代码的方式。C标准模板库中的数据容器、迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。比如动态数组vector是可以存放任何类型数据的容器,我们可以定义许多不同类型的vector,比如vector<int或vect
Stella981 Stella981
3年前
Django框架详解之template
模板简介  将页面的设计和python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统来实现这种模式  python的模板:HTML代码模板语法  模板包括在使用时会被值替换掉的变量,和控制模板逻辑的标签变量  在Django模板中遍历复杂数据结构的关键是句点字符{语法}{{
Stella981 Stella981
3年前
Django 学习 之 模板(html)与配置静态文件
一.模板(html)1.模板语法之变量:语法为{{}}在Django模板中遍历复杂数据结构的关键是句点字符,语法:{{var\_name}}var\_name是一个变量名称,需要和views文件retu
Easter79 Easter79
3年前
ThreadLocal实现线程安全
Spring通过各种模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享。虽然模板类通过资源池获取数据连接或会话,但资源池本身