Play 框架中五个很酷的做法

红薯 发布于 2010/07/06 23:01
阅读 3K+
收藏 12

下面介绍五个很酷的例子,以显示 Play 框架背后的开发哲学。

1. 绑定 HTTP 参数到 Java 对象

使用 Play 框架,你可以很方便的读取 HTTP 参数,来看看下面一个请求 URL

/articles/archive?date=08/01/08&page=2

你可以用这样的代码来获取参数:

public static void archive(Date date, Integer page) {
    List<Article> articles = Articles.fromArchive(date, page);
    render(articles);
}

也可以自动映射到某个 Java 对象,例如下面一个表单:

<form action="/Directory/add" method="POST">
    Name: <input type="text" name="p.name" />
    Age: <input type="text" name="p.age" />
</form>

可直接绑定到下面这个对象

public class Person {
    public String name;
    public Integer age;
}

而控制类的方法如下:

public static void add(Person p) {
    p.save();
}

2. 通过调用Java方法来重定向到另外一个控制器

如下面代码所示,edit执行完毕将跳转(Redirect,而不是 forward) 到 show 方法:

public static void show(Long id) {
    Article article = Article.findById(id);
    render(article);
}
 
public static void edit(Long id, String title) {
    Article article = Article.findById(id);
    article.title = title;
    article.save();
    show(id);
}

而且你也可以直接在模板中这样编写链接地址:

<a href="@{Article.show(article.id)}">${article.title}</a>

这将生成HTML代码如下:

<a href="/articles/15">My new article</a>

3. 无需编写重复代码来向模板传递对象

在大部分框架中,你可以需要这样做:

Article article = Article.findById(id);
User user = User.getConnected();
Map<String, Object> model = new HashMap<String,Object>();
model.put("article", article);
model.put("user", user);
render(model);

但是在 Play 框架,你只需这样

Article article = Article.findById(id);
User user = User.getConnected();
render(article, user);

4. ORM 映射:JPA 封装

看看下面这段代码,体会一下:

public void messages(int page) {
    User connectedUser = User.find("byEmail", connected());
    List<Message> messages = Message.find(
        "user = ? and read = false order by date desc",
        connectedUser
    ).from(page * 10).fetch(10);
    render(connectedUser, messages);
}

5. 简单直接的上传文件管理

看看这个文件上传表单:

<form action="@{Article.uploadPhoto()}" method="POST" enctype="multipart/form-data">
    <input type="text" name="title" />
    <input type="file" id="photo" name="photo" />
    <input type="submit" value="Send it..." />
</form>

而对应的控制器方法就是这么简单:

public static void uploadPhoto(String title, File photo) {
   ...
}

酷!!!

加载中
0
答复哈
答复哈
    List<Message> messages = Message.find(
        "user = ? and read = false order by date desc",
        connectedUser
    ).from(page * 10).fetch(10);

这个很cool...

0
ghostbb
ghostbb

红薯开始Play了。。。。

0
renwofei423
renwofei423

红薯有将oschina移植到play的冲动吗?

我觉得一个好的框架,应该会让人产生冲动,将自己已经有的app移植上去才对。

不仅仅是开发简单,还应该能节省后期维护和再开发

0
红薯
红薯

引用来自#4楼“renwofei423”的帖子

红薯有将oschina移植到play的冲动吗?

我觉得一个好的框架,应该会让人产生冲动,将自己已经有的app移植上去才对。

不仅仅是开发简单,还应该能节省后期维护和再开发

暂时没有,先不说工作量巨大,oschina本身也是非常精简。

我倒会参考 play 框架的一些代码来让 oschina 项目更加简洁。

另外 Play 框架用的 Groovy 模板让我不太爽,我喜欢 Velocity

0
宋浩
宋浩

确实很方便开发人员, 节省了大量重复无用的工作时间 。

不知道性能会是怎样 ?  

0
亲爱的白菜
亲爱的白菜

现在的Blob文件上传问题让我纠结

0
ValueError
ValueError

我怎么觉得有点过度设计。。。

要玩酷,为何不 RoR

返回顶部
顶部