play框架使用起来(6)

1、概述

Play的控制层位于应用的controllers包中,其中的Java类即为控制器(Controller)。如图4.1所示,Application.java和MyController.java都属于控制层。

(图4.1 控制器为controllers包中的Java类)

      控制器需要继承play.mvc.Controller:

package controllers;
 
import models.Client;
import 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声明,返回值为void的方法称为Action。Action的方法声明如下:

public static void action_name(params…);

      Play会自动将HTTP请求参数转化为与之相匹配的Action方法参数,这部分内容会在后面的获取HTTP参数小节进行详细讲解。通常情况下,Action方法无需返回任何值,以调用结果方法来终止执行。在上述例子中,render(…)方法就是用来渲染模板的结果方法。


2、获取HTTP参数

 HTTP请求中往往包含各种参数,这些参数的传递形式如下:

  • URI路径:在路径/clients/1541中,1541是URI的动态部分。
  • 查询字符串:clients?id=1541。
  • 请求体:如果请求是来自HTML的表单提交(GET或者POST),那么请求体包含的是表单数据(采用x-www-urlform-encoded作为编码格式)。


      针对以上几种情况,Play会自动提取这些HTTP参数并将他们保存在Map<String,String>类型的变量中,以参数名作为Map的key。这些参数名分别来自于:

  • URI中动态部分的名称(在routes文件中定义)。
  • 查询字符串中“名称/值”对中的名称部分 。
  • 采用x-www-urlform-encoded编码的表单数据的参数名。

2.1 使用Map参数#

HTTP请求中参数对象(params)在任何控制器中都是可访问的(该实现在play.mvc.Controller超类中定义),它包含了当前所有HTTP请求的参数,并且可以通过get()方法得到,具体如下:

public static void show(){
   
String id=params.get("id");
   
String[] names=params.getAll("name");
}

      这些参数也可以进行类型转换:

public static void show(){
   
Long id=params.get("id",Long.class);
}

      本节将推荐一种更好的解决方案。Play框架提供了自动将Action声明的参数与HTTP参数自动匹配的功能(只需要保持Action方法的参数名和HTTP参数名一致即可):

/clients?id=1541 

      Action方法可以在声明中以id作为参数,以此匹配HTTP中变量名为id的参数:

public static void show(String id){
   
System.out.println(id);
}

      当然,也可以使用其他Java参数类型,而不仅仅是String。在下面的例子中框架会自动将参数转换为正确的数据类型:

public static void show(Long id){
   
System.out.println(id);
}

      如果参数含有多个值,那么可以定义数组参数,具体如下:

public static void show(Long[] id){
   
for(Long anId:id){
       
System.out.println(anId);
   
}
}

      参数甚至可以是List类型:

public static void show(List<Long> id){
   
for(Long anId:id){
       
System.out.println(anId);
   
}
}

你可能感兴趣的:(框架,play)