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),页面接收直接用“
–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);
}
}