倚樓聽風雨

          Chaos 的Java 點滴

          Play Framework介紹2--Hello World

          本文翻譯自官網。原文見:http://www.playframework.org/documentation/1.1.1/firstapp

          Play是一個Rails風格的Java Web框架。先上官網的Hello World,感覺下。運行環境,我換成了Windows ^_^

          準備

          安裝 Java 5 以上版本及Play。安裝指導見:http://www.playframework.org/documentation/1.1.1/install

          項目創建

          打開CMD,執行:

          play new helloworld

          image

          Play new 命令在當前路徑下創建了一個helloworld目錄,其中包含一系列文件和目錄,重要的如下:

          app/ 包含應用核心,分為models,controllers和views目錄。.java生活的地方^_^

          conf/包含應用的所有配置。application.conf應用主配置.routes定義url路由規則,messages國際化用。

          lib/ 包含應用依賴的標準.jar文件。

          public/包含所有外部可訪問的資源:js,css和image。

          test/包含所有應用的測試程序。測試程序基于JUnit或Selenium。

          注:Play要求所有文件必須是UTF-8編碼。

          等等應用的.class文件在哪兒。恩,Play不使用class文件而是直接讀取Java源文件,并使用Eclipse compiler編譯他們。

          這導致兩件重要的事情。首先運行時Play會檢查你對源文件所作的變更并自動加載它們。其次,當發生異常時,Play將創建更好的錯誤報告并附加相關代碼。

          運行應用

          在cmd中鍵入play run helloworld,play啟動Web Server并監聽9000端口

          image

          打開瀏覽器鍵入http://localhost:9000,應用顯示了一個缺省的歡迎頁

          image

          現在,看下此頁是如何顯示的。

          應用的主入口點配置在conf/routes文件中。它定義了應用所有可訪問的URL。打開routes文件,會看到第一個route:

          GET     /    Application.index

          它告訴Play,當/路徑收到GET請求后調用Application.indexJava方法。它是controllers.Application.index的縮寫,因為controllers包是隱式的附加的。

          創建標準Java應用時,通常使用一個入口點即main方法。Play應用則有多個,一個URL一個。這些方法稱為action方法。定義action方法的類稱為controller

          打開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方法。

          index方法定義成public static void,因為Controller永遠無需實例化和返回值。(譯注:為了防止被使用者引入狀態,并讓Controller自然、干凈而如此設計。但副作用是render只能通過throw扔出結果,用異常當GOTO,可謂兵行詭道)。

          缺省的index動作調用render方法,通知Play渲染一個模板。模板是app/views目錄下一個簡單的text文件。此處使用Application/index.html

          打開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/}tag嗎?是Application/index.html插入的位置。

          創建FORM

          編輯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動作的方法。刷新瀏覽器。

          image

          Oops,出錯了。因為引用了一個不存在的動作。需要在helloworld/app/controllers/Application.java中創建:

          package controllers;


          import play.mvc.*;

          public class Application extends Controller {

          public static void index() {
          render();
          }

          public static void sayHello(String myName){
          render(myName);
          }
          }

           

          我們聲明了myName參數,它會自動映射到form提交的HTTP請求的myName參數。刷新瀏覽器。

          image

          輸入name提交,出現另一個錯誤.

          image

          因為Play渲染此動作的缺省模板時,沒有找到它。我們創建文件helloworld/app/views/Application/sayHello.html

          #{extends 'main.html' /}
          #{set title:
          'Home' /}

          <h1>Hello ${myName ?: 'guest'}!h1>

          <a href="@{Application.index()}">Back to forma>

           

          然后刷新:

          image

          提供更好的URL

          看下提交的url:

          http://localhost:9000/application/sayhello?myName=chaos

          它不夠RESTful。因為Play通過缺省規則捕獲了此URL

          * /{controller}/{action} {controller}.{action}

           

          可以編輯helloworld/conf/routes文件在缺省規則前添加一條規則,提供更自然的hello url

          GET /hello Application.sayHello

           

          image

          自定義布局

          可以修改模板更改布局。編輯helloworld/app/views/main.html文件:

          image

          添加驗證

          給form添加一個驗證,要求name字段必填。我們通過Play validation實現。編輯helloworld/app/controllers/Application.java,在sayHello action處:

          public static void sayHello(@Required String myName) {
          if (validation.hasErrors()) {
          flash.error(
          "Oops, please enter your name!");
          index();
          }
          render(myName);
          }

           

          并import play.data.validation.*。@Required告訴Play自動檢查myName字段是否填寫。如果驗證失敗,我們加入一條消息到flash scope中并重定向到index動作。flash scope允許在重定向時保持消息。

          編輯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>

           

          輸入空參數并提交,OK起作用了。

          image

          自動化測試

          Selenium Test

          在測試模式下運行應用。在cmd中輸入play test helloworld。

          image

          打開瀏覽器,輸入http://localhost:9000/@tests啟動測試器。

          image

          執行測試

          image

          Selenium測試用例通常寫成一個html文件。Play使用Play模板引擎生成這些文件。helloworld/test/Application.test.html文件:

          *{ You can use plain selenium command using the selenium tag }*

          #{selenium}
          // Open the home page, and check that no error occured
          open('/')
          assertNotTitle('Application error')
          #{/selenium}

          此測試打開home頁,確認響應中沒有“Application error”。

          讓我們來編寫自己的測試。編輯測試內容:

          *{ You can use plain selenium command using the selenium tag }*

          #{selenium}
          // Open the home page, and check that no error occurred
          open('/')
          assertNotTitle('Application error')

          // Check that it is the form
          assertTextPresent('The Hello world app.')

          // Submit the form
          clickAndWait('css=input[type=submit]')

          // Check the error
          assertTextPresent('Oops, please enter your name!')

          // Type the name and submit
          type('css=input[type=text]', 'bob')
          clickAndWait('css=input[type=submit]')

          // Check the result
          assertTextPresent('Hello bob!')
          assertTextPresent('The Hello world app.')

          // Check the back link
          clickAndWait('link=Back to form')

          // Home page?
          assertTextNotPresent('Hello bob!')
          #{/selenium}

          重新執行

          image

          posted on 2011-04-18 21:17 chaos 閱讀(790) 評論(1)  編輯  收藏 所屬分類: Play Framework

          評論

          # re: Play Framework介紹2--Hello World 2011-10-11 15:58 Ket

          敢問welcome tag是怎么變成歡迎頁面中的內容的?  回復  更多評論   

          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 诸城市| 长沙市| 聂荣县| 临邑县| 冀州市| 平阳县| 汾阳市| 新野县| 金川县| 深州市| 博爱县| 萨迦县| 长治市| 昌黎县| 杭州市| 寿光市| 石城县| 乐平市| 长乐市| 五寨县| 聊城市| 邵武市| 虞城县| 陵川县| 准格尔旗| 多伦县| 禄劝| 嘉义县| 叙永县| 溧阳市| 普格县| 南昌县| 天气| 广汉市| 庆元县| 合江县| 永善县| 依兰县| 镇原县| 鞍山市| 宁都县|