当前位置:首页 » 网站系统架构

play教程 第五课 play中Controller的用法

2015-09-16 11:31 本站整理 浏览(187)

Controller(控制器)是play中MVC的“C”部分,在 Play 框架中,控制器其实就是一个 Java类,位于 controllers 包中,继承了父类 play.mvc.Controller。

举个简单的例子:

public class Clients extends Controller {
     public static void show(Long id) {
         Client client = Client.findById(id);
         render(client);
     }
     public static void delete(Long id) {
         Client client = Client.findById(id);
         client.delete();
     }
}
在这个示例控制器中,每一个被声明为 public static 的方法都被称为 Action,

每个 Action 的形式如下所示:

public static void action_name(params...);

-类同比较

与servlet类比

传统的Servlet中,我们在dopost()/doget()方法进行操作,通过request对象获取数据,通过response对象返回数据。

与Struts中的Action类比

Action是struts的核心功能,通过类似下面的配置文件来配置接收类和返回地址
<action name="user" class="org.lesson05.UserAction">
    <result name="success">/Methods/list.jsp</result>
</action>

与SpringMVC的Controller类比

play的Controller和SpringMVC中的Controller最为相似,如下是SpringMVC的Controller写法,指定了来回传递的参数和返回的页面
@RequestMapping({"/hello" ,"/" })
     /**
      *
      * @param name 页面传来的值
      * @param model 返回给页面的值
      * @return
      */
     public String hello(String name,Model model){
           String username = "Hello,My name is "+name ;
            model.addAttribute( "username", username);
           User u = new User(25, "万里");
            model.addAttribute( u);
            return "hello";
     }

-约法三章

1.所创建的Controller类必须在app/controllers目录下,目录名不能变 2.所创建的Controller类必须继承play.mvc.Controller类

3.所创建的Controller类中的方法必须是public static修饰

-如何传参

传参的几种方法:

1./article?id=123 2./article/123

3.POST传参

Play能接受所有的传参形式,并且能够自动转换参数类型

传递日期

日期数据支持以下几种格式的自动转换:
* yyyy-MM-dd’T’hh:mm:ss’Z' // ISO8601 + timezone
* yyyy-MM-dd’T’hh:mm:ss" // ISO8601
* yyyy-MM-dd
* yyyyMMdd’T’hhmmss
* yyyyMMddhhmmss
* dd'/‘MM’/'yyyy
* dd-MM-yyyy
* ddMMyyyy
* MMddyy
* MM-dd-yy
* MM'/‘dd’/'yy

例如:

前端请求方式:archives?from=21/12/1980

//后台获取并处理方式
public static void articlesSince(Date from) {
List<Article> articles = Article.findBy("date >= ?", from);
render(articles);
}

传递数组或集合

所有被支持的类型都可以通过数组或者集合来获取:

public static void show(Long[] id) {
...
}
或者

public static void show(List<Long> id) {
...
}
或者

public static void show(Set<Long> id) {
...
}

传递对象

如前端通过这种方式传参

addSubscriber?user.name=Wayne&user.login=wayneellis&user.password=secret

我们在后台可以这样接收

public static void addSubscriber(User user) {
...
}

传递文件

在 Play 框架中处理文件上传是非常简单的事,一个 multipart/form-data 编码的请求发送到服务器, Play 框架会自动为该上传文件生成一个 File 对象。如下所示:

前端页面

<form method="post" action= "@{Products.upload()}" enctype="multipart/form-data" >
     <input type= "file"name ="photo">
</form>
后台逻辑

public static void upload(File photo) {
//...
// 保存图片操作
//...
}

-Response

在play中,通常有两类response的方式——render和redirect,下面具体介绍。

Render

–render() render()方法是最常用的,直接跳转至与该方法同名的html,当然,我们也可以通过这种方式,跳转至指定的html文件(即play术语中所谓的模版)

render(“Application/dontSayHello.html”, myName);

如果需要传参,那么直接在render()方法中写上参数即可,如render(args1,args2),页面接收直接用“{}”取值,如{}”取值,如{args1}。

–renderJSON() 这个方法用来传递JSON格式的数据,比如我们在使用ajax时,如果用到json格式数据,那么就需要这个方法。

–renderText() 简单传递一个text。

–renderXML() 返回XML格式的对象。

–renderBinary() 可以传回去一个文件或者输入流对象。

需要说明一点,render下面的语句是不被执行的,如

public static void sayHello(String myName) {
     render(myName);
     // Warning: this code will never be executed!
     System.out.println(“这一行是不能被执行的,不信你试试!”);
}

Redirect

Play 提供了一个 redirect 方法,可以将请求调整到其他的 URL 地址:

public static void index() {
     redirect("http://www.baidu.com");
}

-Action 链

Action 链与 Servlet API 中的 forward 并不相同,一个 HTTP 请求只能调用一个 action 。如果你需要调用其他的 action ,你必须将浏览器重定向到你想要调用的 action 上。这样后退、前进和刷新操作就会简单很多。

你可以重定向到任意一个 action,只需要简单的调用该 action 方法而已,

Play 框架会自动将这种形式的调用解析为 HTTP 的重定向。

例如:

public class Clients extends Controller {
     public static void show(Long id) {
     Client client = Client.findById(id);
     render(client);
}
public static void create(String name) {
     Client client = new Client(name);
     client.save();
     show(client.id);
     }
}