《Learning Play! Framework 2》学习笔记——案例研究1(Templating System)

注解: 这是对《Learning Play! Framework 2》第三章的学习

本章是一个显示聊天记录的项目,只有一个页面,可以自动对聊天记录进行排序、分组和显示,并整合使用了less,其界面显示如下

aaarticlea/png;base64,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" alt="" width="510" height="425" />

一、项目结构

aaarticlea/png;base64,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" alt="" />

二、项目中使用的模型

所有的聊天记录放在models目录中Chat类中

public class Chat {
public DateTime date; // chat time
public int occurrence; // chat room
public List<Item> items; //chat content public Chat(DateTime date, int occurrence, List<Item> items) {
this.date = date;
this.occurrence = occurrence;
this.items = items;
}
}

每一次的聊天记录的内容放在models目录中Item类中

public class Item {
public String user;
public LocalTime timestamp;
public String message;
public Item(String user, LocalTime timestampLocalTime, String message) {
this.user = user;
this.timestamp = timestampLocalTime;
this.message = message;
}
}

三、项目route

本项目只有一个页面,所有不用修改默认的route

四、项目模板

aaarticlea/png;base64,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" alt="" />

4.1 index.scala.html模板

@(message: String)(chats:List[Chat])
@import models.Item
@import java.util.List @main("Welcome to the Packt Publishing's Play 2.0 Demo") {
<h1>@message</h1>
@chats.sortBy(_.occurrence).groupBy(_.date.toDate).toSeq.sortBy(_._1).map { dateAndChats =>
<h3>-- Chat @dateAndChats._1 --</h3>
@dateAndChats._2.map { chat =>
@listContainer{ //引用listContainer模板
<h3>-- Chat #@chat.occurrence --</h3>
}(chat) {
<hr/>
}
}
}
}

说明: 引用listContainer模板方法说明

 @listContainer{
<h3>-- Chat #@chat.occurrence --</h3>
}(chat) {
<hr/>
}
    • <h3>是在listContainer模板前面加入的内容
    • (chat)是在listContainer模板的参数
    • <hr/>是在listContainer模板前面后面的内容
  • 聊天内容的分组、排序
    @chats.sortBy(_.occurrence).groupBy(_.date.toDate).toSeq.sortBy(_._1).map{ dateAndChats =>

    这里定义了一个变量dateAndChats,该变量已经分组(按聊天室编号occurrence)和排序(按日期date)好了。

4.2 listContainer.scala.html模板

@(header:Html)(chat:Chat)(footer:Html)
@import models.Chat
<div style="margin-left:@{5*chat.occurrence}%">
@header
<ul>
@chat.items.map { item =>
@listItem(item) //引用listItem模板
}
</ul>
@footer
</div>

4.3 listItem.scala.html模板

@(item:Item)
@import models.Item
<style>
li.item span{ width:100px;display:inline-block;}
</style>
<li class="item">
<span>@item.user</span>
<span>[@item.timestamp]</span>@item.message
</li>

五、controller

本例比较简单,只有一个controller,在controllers目录中Application类

public class Application extends Controller {
public static Result index() {
DateTime today = DateTime.now();
DateTime yesterday = today.minus(Days.ONE);
//模拟数据
Chat chat11 = new Chat(yesterday, 1, asList(
new Item("me", LocalTime.now(), "Hello!"),
new Item("other", LocalTime.now(), "Hi!"),
new Item("me", LocalTime.now(), "Fine?"),
new Item("other", LocalTime.now(), "Yes")
));
Chat chat12 = new Chat(yesterday, 2, asList(
new Item("me", LocalTime.now(), "It's hot today!"),
new Item("other", LocalTime.now(), "Indeed...")
));
Chat chat21 = new Chat(today, 1, asList(
new Item("me", LocalTime.now(), "Hello!"),
new Item("me", LocalTime.now(), "Youhou?"),
new Item("no-one", LocalTime.now(), "...")
));
Chat chat22 = new Chat(today, 2, asList(
new Item("me", LocalTime.now(), "Ding ding!"),
new Item("me", LocalTime.now(), "Poueeeeeeeeeet?"),
new Item("no-one", LocalTime.now(), "...")
));
Chat chat23 = new Chat(today, 3, asList(
new Item("me", LocalTime.now(), "No one?"),
new Item("no-one", LocalTime.now(), "Yes?")
));
return ok(index.render("It Works!", asList(chat23, chat11, chat21, chat12, chat22)));
}
}

在该controller中,我们模拟了一些数据(没有使用数据库),调用index模板,并将模拟的数据传给该模板。

六、使用less美化页面

  1. 在app/assets目录中增加book-utils.less和book.less文件
  2. main.scala.html模板中加入
link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/book.css")">

本例中使用了两个less文件,均放入public --> sytlesheets 目录中

  • book-utils.less——定义全局的变量和mixin
  • book.less       ——

其中book-utils.less

//VARs
@bgColor: darken(#CCC, 25%);
@baseColor: lighten(#122, 5%);
//MIXINS
.border-radius (@radius: 5px) {
border-radius: @radius;
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
}
.box-shadow (@x: 0, @y: 0, @blur: 1px, @color: #000) {
box-shadow: @arguments;
-moz-box-shadow: @arguments;
-webkit-box-shadow: @arguments;
}

book.less

@import "book-utils.less";

body {
width: 960px;
margin: auto;
background-color: desaturate(lighten(@bgColor, 25%), 65%);
border: 2px @bgColor solid;
.border-radius;
padding: 0px 15px;
} h1 { color: saturate(@baseColor, 25%);} .date {
h2 {
border: 1px black dotted;
.border-radius(100px);
color: @baseColor;
}
.chat {
.box-shadow(-2px, -3px, 2px, fade(spin(@bgColor, 15%), 30%));
h3 {
border: 1px black solid;
.border-radius;
color: @baseColor
}
li.item span {
width: 100px;
display:inline-block;:first-child { color: lighten(@baseColor, 15%); }
.time { color: saturate(@baseColor, 85%) }
}
}
}
上一篇:PAT 1053 Path of Equal Weight[比较]


下一篇:iScroll.js 用法参考