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

时间:2022-02-26 11:44:55

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);
}
}