一、打开 cmd ,进入要创建工程的目录下,我这里是:D:\Play学习项目
二、创建一个工程:
执行:play new helloworld (helloworld是工程名)
到此工程创建成功!!!
看一下工程目录:
app:包含应用核心,分为models,controllers和views目录。.java生活的地方^_^
conf:包含应用的所有配置。application.conf应用主配置.routes定义url路由规则,messages国际化用。
lib: 包含应用依赖的标准.jar文件。
public:包含所有外部可访问的资源:js,css和image。
test:包含所有应用的测试程序。测试程序基于JUnit或Selenium。
注:Play要求所有文件必须是UTF-8编码。
三、运行应用:
执行:play run helloworld
在浏览器中进入:http://localhost:9000
应用的主入口点配置在conf/routes文件中。它定义了应用所有可访问的URL。打开routes文件,会看到第一个route:
GET / Application.index
它告诉Play,当/路径收到GET请求后调用Application.indexJava方法。它是controllers.Application.index的缩写,因为controllers包是隐式的附加的。
看一下helloworld/app/controllers/Application.java:
package controllers;
import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
public class Application extends Controller {
public static void index() {
render();
}
}
看到Application扩展了play.mvcController类。它提供了所有Controller需要使用的方法,如index动作中使用的render方法。
再看helloworld/app/views/Application/index.html:
#{extends 'main.html' /}
#{set title:'Home' /}
#{welcome /}
其中的内容是Play tag,类似JSP taglib.#{welcome/}tag生成了之前看到的欢迎消息。#{extends/}tags告诉Play此模板集成另一个main.html的模板.模板继承可用来创建复杂的web也并重用公共部分。
再看helloworld/app/views/main.html模板:
<!DOCTYPE html>
<html>
<head>
<title>#{get 'title' /}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
#{get 'moreStyles' /}
<link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
<script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>
#{get 'moreScripts' /}
</head>
<body>
#{doLayout /}
</body>
</html>
#{doLayout/}标签就是Application/index.html插入的位置。
四、编辑程序
编辑helloworld/app/views/Application/index.html模板:
#{extends 'main.html' /}
#{set title:'Home' /}
<form action="@{Application.sayHello()}" method="GET">
<input type="text" name="myName" />
<input type="submit" value="Say hello!" />
</form>
使用@{…}符号请求Play自动产生调用Application.sayHello动作的方法
既然请求了Application.sayHello(),就要在helloworld/app/controllers/Application.java中创建sayHello():
package controllers;
import play.mvc.*;
public class Application extends Controller {
public static void index() {
render();
}
public static void sayHello(String myName){
render(myName);
}
}
刷新浏览器:
这时在输入框中输入内容提交,会报错:
因为Play渲染此动作的缺省模板时,没有找到它。我们创建文件helloworld/app/views/Application/sayHello.html:
#{extends 'main.html' /}
#{set title:'Home' /}
<h1>Hello ${myName ?: 'guest'}!</h1>
<a href="@{Application.index()}">Back</a>
这时再在输入框中填写内容提交:
添加编辑框为空的验证:
编辑helloworld/app/controllers/Application.java:
package controllers;
import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
import play.data.validation.*;
public class Application extends Controller {
public static void index() {
render();
}
/**
* 记得加上import play.data.validation.*。
* @Required告诉Play自动检查myName字段是否填写。
* 如果验证失败,我们加入一条消息到flash scope中并重定向到index动作。
* flash scope允许在重定向时保持消息。
*/
public static void sayHello(@Required String myName) {
if (validation.hasErrors()) {
flash.error("please enter your name!");
index();
}
render(myName);
}
}
编辑helloworld/app/views/Application/index.html显示错误消息:
#{extends 'main.html' /}
#{set title:'Home' /}
#{if flash.error}
<p style="color:#c00">
${flash.error}
</p>
#{/if}
<form action="@{Application.sayHello()}" method="GET">
<input type="text" name="myName" />
<input type="submit" value="Say hello!" />
</form>
输入框为空提交时:
五、自动化测试
在cmd中输入play test helloworld。
打开浏览器,输入http://localhost:9000/@tests启动测试器。