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

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这个示例控制器中,每一个被声明为 public static 的方法都被称为 Action,
每个 Action 的形式如下所示:

public static void action_name(params...);
 
 
  • 1
  • 1

-类同比较

与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>

 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
与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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

-约法三章

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
传递数组或集合

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

public static void show(Long[] id) {
...
}
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

或者

public static void show(List<Long> id) {
...
}
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

或者

public static void show(Set<Long> id) {
...
}
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
传递对象

如前端通过这种方式传参
addSubscriber?user.name=Wayne&user.login=wayneellis&user.password=secret
我们在后台可以这样接收

public static void addSubscriber(User user) {
...
}
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
传递文件

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

前端页面

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

 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

后台逻辑

public static void upload(File photo) {
//...
// 保存图片操作
//...
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

-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(“这一行是不能被执行的,不信你试试!”);
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
Redirect

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

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

-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);
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值