国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Play Framework介紹:Hello World

開(kāi)發(fā) 后端
Play!是一個(gè)full-stack(全棧的)Java Web應(yīng)用框架,包括一個(gè)簡(jiǎn)單的無(wú)狀態(tài)MVC模型,具有Hibernate的對(duì)象持續(xù),一個(gè)基于Groovy的模板引擎,以及建立一個(gè)現(xiàn)代Web應(yīng)用所需的所有東西。

本文翻譯自官網(wǎng)。原文見(jiàn):http://www.playframework.org/documentation/1.1.1/firstapp

Play是一個(gè)Rails風(fēng)格的Java Web框架。先上官網(wǎng)的Hello World,感覺(jué)下。運(yùn)行環(huán)境,我換成了Windows ^_^

準(zhǔn)備

安裝 Java 5 以上版本及Play。安裝指導(dǎo)見(jiàn):http://www.playframework.org/documentation/1.1.1/install

項(xiàng)目創(chuàng)建

打開(kāi)CMD,執(zhí)行:

play new helloworld

image

Play new 命令在當(dāng)前路徑下創(chuàng)建了一個(gè)helloworld目錄,其中包含一系列文件和目錄,重要的如下:

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

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

lib/ 包含應(yīng)用依賴(lài)的標(biāo)準(zhǔn).jar文件。

public/包含所有外部可訪(fǎng)問(wèn)的資源:js,css和image。

test/包含所有應(yīng)用的測(cè)試程序。測(cè)試程序基于JUnit或Selenium。

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

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

這導(dǎo)致兩件重要的事情。首先運(yùn)行時(shí)Play會(huì)檢查你對(duì)源文件所作的變更并自動(dòng)加載它們。其次,當(dāng)發(fā)生異常時(shí),Play將創(chuàng)建更好的錯(cuò)誤報(bào)告并附加相關(guān)代碼。

運(yùn)行應(yīng)用

在cmd中鍵入play run helloworld,play啟動(dòng)Web Server并監(jiān)聽(tīng)9000端口

image

打開(kāi)瀏覽器鍵入http://localhost:9000,應(yīng)用顯示了一個(gè)缺省的歡迎頁(yè)

image

現(xiàn)在,看下此頁(yè)是如何顯示的。

應(yīng)用的主入口點(diǎn)配置在conf/routes文件中。它定義了應(yīng)用所有可訪(fǎng)問(wèn)的URL。打開(kāi)routes文件,會(huì)看到***個(gè)route:

GET     /    Application.index

它告訴Play,當(dāng)/路徑收到GET請(qǐng)求后調(diào)用Application.indexJava方法。它是controllers.Application.index的縮寫(xiě),因?yàn)閏ontrollers包是隱式的附加的。

創(chuàng)建標(biāo)準(zhǔn)Java應(yīng)用時(shí),通常使用一個(gè)入口點(diǎn)即main方法。Play應(yīng)用則有多個(gè),一個(gè)URL一個(gè)。這些方法稱(chēng)為action方法。定義action方法的類(lèi)稱(chēng)為controller。

打開(kāi)helloworld/app/controllers/Application.java:

  1. package controllers;  
  2.  
  3. import play.*;  
  4. import play.mvc.*;  
  5.  
  6. import java.util.*;  
  7.  
  8. import models.*;  
  9.  
  10. public class Application extends Controller {  
  11.  
  12.     public static void index() {  
  13.         render();  
  14.     }  
  15.  

 

看到Application擴(kuò)展了play.mvcController類(lèi)。它提供了所有Controller需要使用的方法,如index動(dòng)作中使用的render方法。

index方法定義成public static void,因?yàn)镃ontroller永遠(yuǎn)無(wú)需實(shí)例化和返回值。(譯注:為了防止被使用者引入狀態(tài),并讓Controller自然、干凈而如此設(shè)計(jì)。但副作用是render只能通過(guò)throw扔出結(jié)果,用異常當(dāng)GOTO,可謂兵行詭道)。

缺省的index動(dòng)作調(diào)用render方法,通知Play渲染一個(gè)模板。模板是app/views目錄下一個(gè)簡(jiǎn)單的text文件。此處使用Application/index.html

打開(kāi)helloworld/app/views/Application/index.html文件:

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.  
  4. #{welcome /} 

 

其中的內(nèi)容是Play tag,類(lèi)似JSP taglib.#{welcome/}tag生成了之前看到的歡迎消息。#{extends/}tags告訴Play此模板集成另一個(gè)main.html的模板.模板繼承可用來(lái)創(chuàng)建復(fù)雜的web也并重用公共部分。

打開(kāi)helloworld/app/views/main.html模板

  1. <!DOCTYPE html> 
  2.  
  3. <html> 
  4.     <head> 
  5.         <title>#{get 'title' /}</title> 
  6.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  7.         <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}"> 
  8.         #{get 'moreStyles' /}  
  9.         <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}"> 
  10.         <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script> 
  11.         #{get 'moreScripts' /}  
  12.     </head> 
  13.     <body> 
  14.         #{doLayout /}  
  15.     </body> 
  16. </html> 

 

看到#{doLayout/}tag嗎?是Application/index.html插入的位置。

 

#p#

創(chuàng)建FORM

編輯helloworld/app/views/Application/index.html模板

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.    
  4. <form action="@{Application.sayHello()}" method="GET">  
  5.     <input type="text" name="myName" />   
  6.     <input type="submit" value="Say hello!" />  
  7. </form> 

 

我們使用@{…}符號(hào)請(qǐng)求Play自動(dòng)產(chǎn)生調(diào)用Application.sayHello動(dòng)作的方法。刷新瀏覽器。

image

Oops,出錯(cuò)了。因?yàn)橐昧艘粋€(gè)不存在的動(dòng)作。需要在helloworld/app/controllers/Application.java中創(chuàng)建:

  1. package controllers;  
  2.  
  3. import play.mvc.*;  
  4.  
  5. public class Application extends Controller {  
  6.  
  7.     public static void index() {  
  8.         render();  
  9.     }  
  10.       
  11.     public static void sayHello(String myName){  
  12.         render(myName);  
  13.     }  

 

我們聲明了myName參數(shù),它會(huì)自動(dòng)映射到form提交的HTTP請(qǐng)求的myName參數(shù)。刷新瀏覽器。

image

輸入name提交,出現(xiàn)另一個(gè)錯(cuò)誤.

image

因?yàn)镻lay渲染此動(dòng)作的缺省模板時(shí),沒(méi)有找到它。我們創(chuàng)建文件helloworld/app/views/Application/sayHello.html

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.  
  4. <h1>Hello ${myName ?: 'guest'}!</h1>  
  5.    
  6. <a href="@{Application.index()}">Back to form</a> 

 

然后刷新:

image

提供更好的URL

看下提交的url:

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

它不夠RESTful。因?yàn)镻lay通過(guò)缺省規(guī)則捕獲了此URL

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

 

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

GET /hello Application.sayHello

 

image

#p#

自定義布局

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

image

添加驗(yàn)證

給form添加一個(gè)驗(yàn)證,要求name字段必填。我們通過(guò)Play validation實(shí)現(xiàn)。編輯helloworld/app/controllers/Application.java,在sayHello action處:

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

 

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

編輯helloworld/app/views/Application/index.html顯示錯(cuò)誤消息

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.    
  4. #{if flash.error}  
  5.     <p style="color:#c00">  
  6.         ${flash.error}  
  7.     </p>  
  8. #{/if}  
  9.  
  10. <form action="@{Application.sayHello()}" method="GET">  
  11.     <input type="text" name="myName" />   
  12.     <input type="submit" value="Say hello!" />  
  13. </form> 

 

輸入空參數(shù)并提交,OK起作用了。

image

自動(dòng)化測(cè)試

Selenium Test

在測(cè)試模式下運(yùn)行應(yīng)用。在cmd中輸入play test helloworld。

image

打開(kāi)瀏覽器,輸入http://localhost:9000/@tests啟動(dòng)測(cè)試器。

image

執(zhí)行測(cè)試

image

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

  1. *{ You can use plain selenium command using the selenium tag }*  
  2.  
  3. #{selenium}  
  4.     // Open the home page, and check that no error occured  
  5.     open('/')  
  6.     assertNotTitle('Application error')  
  7. #{/selenium} 

此測(cè)試打開(kāi)home頁(yè),確認(rèn)響應(yīng)中沒(méi)有“Application error”。

讓我們來(lái)編寫(xiě)自己的測(cè)試。編輯測(cè)試內(nèi)容:

  1. *{ You can use plain selenium command using the selenium tag }*  
  2.  
  3. #{selenium}  
  4.     // Open the home page, and check that no error occurred  
  5.     open('/')  
  6.     assertNotTitle('Application error')  
  7.       
  8.     // Check that it is the form  
  9.     assertTextPresent('The Hello world app.')  
  10.       
  11.     // Submit the form  
  12.     clickAndWait('css=input[type=submit]')  
  13.       
  14.     // Check the error  
  15.     assertTextPresent('Oops, please enter your name!')  
  16.       
  17.     // Type the name and submit  
  18.     type('css=input[type=text]''bob')  
  19.     clickAndWait('css=input[type=submit]')  
  20.       
  21.     // Check the result  
  22.     assertTextPresent('Hello bob!')  
  23.     assertTextPresent('The Hello world app.')  
  24.       
  25.     // Check the back link  
  26.     clickAndWait('link=Back to form')  
  27.       
  28.     // Home page?  
  29.     assertTextNotPresent('Hello bob!')  
  30. #{/selenium} 

重新執(zhí)行

image

 

 

原文鏈接:http://www.cnblogs.com/Chaos/archive/2011/04/16/2018361.html

【編輯推薦】

  1. Play Framework介紹:主要概念
  2. Java堆內(nèi)存的10個(gè)要點(diǎn)
  3. “Java已死”簡(jiǎn)史
  4. Play!在云端:Java PaaS平臺(tái)入門(mén)
  5. JavaFX 2.0.3發(fā)布 帶來(lái)兩個(gè)全新文檔
責(zé)任編輯:林師授 來(lái)源: Chaos的博客
相關(guān)推薦

2012-02-24 09:53:24

JavaPlay Framew

2012-02-20 14:20:44

JavaPlay Framew

2009-07-30 13:21:17

Scala入門(mén)Hello World

2012-03-14 12:29:55

JavaPlay Framwo

2012-02-22 16:06:42

2012-02-24 10:57:43

2012-02-20 14:41:30

JavaPlay Framew

2012-02-22 17:23:51

JavaPlay Framew

2012-02-23 13:13:00

JavaPlay Framew

2014-12-19 10:07:10

C

2017-11-23 17:45:46

Yii框架IntelYii框架深度剖析

2012-02-23 13:48:16

JavaPlay Framew

2012-03-14 09:29:00

Play framewJava

2023-09-04 07:30:03

Wasm匯編語(yǔ)言

2023-01-06 08:18:44

2009-08-11 10:32:23

什么是Groovy

2011-06-08 14:39:06

Qt 教程

2009-09-16 17:15:19

OSGi Bundle

2012-02-23 12:53:40

JavaPlay Framew

2023-05-23 08:01:10

Netty網(wǎng)絡(luò)通信
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩一区二区三区免费观看| 精品人伦一区二区三区蜜桃网站 | 久久嫩草精品久久久久| 可以免费看不卡的av网站| 欧美日韩爱爱视频| 黄色软件在线| 国产视频一区二区在线观看| 亚洲一区bb| 亚洲精品麻豆| 国产一区欧美二区三区| 91精品国产自产在线丝袜啪| 在线看日韩av| 欧美性理论片在线观看片免费| 欧美zozo另类异族| 成人在线免费看黄| 欧美日韩国产电影| 国产福利在线视频| 在线观看免费一区| 黄视频在线观看免费| 亚洲不卡av一区二区三区| 91传媒在线观看| 国产欧美日韩精品a在线观看| 91尤物视频在线观看| 成人一级生活片| 六月丁香综合在线视频| 欧美日韩在线播放一区二区| 夜夜嗨av一区二区三区网站四季av| 亚洲在线视频福利| 自拍偷拍欧美专区| 国产伦精品一区二区三区免费视频| 欧美不卡一区| 久久国产精品久久精品国产| 国产亚洲福利| 天堂一区二区三区| 狠狠狠色丁香婷婷综合久久五月| 九九久久九九久久| 久久激情综合网| 少妇一晚三次一区二区三区| 床上的激情91.| 日本成年人网址| 国产精品免费aⅴ片在线观看| 成人黄色免费电影| 亚洲色大成网站www久久九九| 精品伦理一区二区| 精品久久久中文| 免费大片黄在线观看视频网站| 欧美日韩视频一区二区| 色屁屁www国产馆在线观看| 亚洲精品国产精品国自产观看浪潮| 欧美日韩精品免费观看视完整| 精品国产一区二区三区久久久| 亚洲欧美日本国产| 国产精品视频大全| 国产精品综合色区在线观看| 国产一区国产精品| 精品一二三四区| 成人黄色一区二区| 精品久久久久久亚洲精品| 9色在线视频网站| 日韩精品黄色网| 91欧美极品| 91aaaa| 看电视剧不卡顿的网站| 欧美牲交a欧美牲交aⅴ免费真| 一区二区视频在线| sm国产在线调教视频| 久久精品青青大伊人av| 欧美日韩国产高清电影| 麻豆91av| 26uuu另类欧美亚洲曰本| 992tv在线观看免费进| 欧美一区二区三区视频免费| 国产日韩一区二区三免费高清| 国产在线精品播放| 美国一区二区三区在线播放| 天天干天天爽天天射| 欧美日韩另类一区| 日韩一级特黄| 成人国产一区二区| 国产精品一区二区在线观看不卡| 成人性生交大片免费看视频r| 宅男在线国产精品| 中文字幕综合| 精品久久sese| 亚洲国产精品v| 中文字幕在线播放网址| 97在线免费视频| 久久综合色婷婷| 日本激情视频在线观看| 亚州av一区二区| 一区二区三区四区五区在线| 久久国产精品视频在线观看| 日本道色综合久久| 日本免费精品| 久久久亚洲国产| 丝袜美腿成人在线| 欧美h版电影| 久久久电影免费观看完整版| 9191国语精品高清在线| 亚洲黄色成人网| 久久精品论坛| 精品一区在线播放| 久久久另类综合| 色视频在线免费观看| 久久视频中文字幕| 欧美日本一区二区高清播放视频| 欧美一区午夜精品| 三上悠亚国产精品一区二区三区| 高清不卡一区二区在线| 黄色在线视频网| 日韩午夜激情视频| 日韩精品欧美大片| 亚洲高清乱码| 亚洲不卡一区二区三区| 澳门av一区二区三区| 国产在线观看精品| 久久久久久久一区| 高潮毛片在线观看| 97国产在线观看| eeuss影院一区二区三区| av中文字幕一区二区三区| 欧美激情一区二区三级高清视频| 免费看欧美美女黄的网站| 有码在线播放| 欧美精品18videosex性欧美| 日韩影院在线观看| 亚洲一区二区三区精品中文字幕| 久久久国产精品一区| 日韩电影免费在线观看网站| 羞羞视频在线观看| 欧美亚洲成人xxx| 久久97超碰国产精品超碰| 色哟哟精品视频| 亚洲国产精品高清久久久| 亚洲国产日韩欧美在线| 激情综合色综合啪啪开心| 亚洲成色777777女色窝| 欧美另类中文字幕| 久久精品国产精品| 国产精品99视频| 97公开免费视频| 亚洲欧美色图片| 久久久午夜精品| 成人看片爽爽爽| 久青草国产在线| 国产一区在线免费观看| 一区二区免费在线播放| 日韩免费成人| 国产aaa一级片| 欧美一区二粉嫩精品国产一线天| 亚洲精品国产高清久久伦理二区| jizz18欧美| 国产精品ⅴa在线观看h| 国产伦精品一区二区三区免费迷| 成人羞羞视频免费看看| aaa欧美色吧激情视频| 日本高清好狼色视频| 国产精品视频白浆免费视频| 懂色av一区二区三区蜜臀| 色老头在线观看| www.亚洲天堂网| 91免费综合在线| 欧美日韩大片| 神马影院一区二区三区| 亚洲福利视频网| 欧美一级爆毛片| 久久久久免费av| 成人午夜免费剧场| 欧美午夜电影在线播放| 一区二区导航| 91精品国产一区二区三密臀| 狠狠色综合网站久久久久久久| 欧美日韩精品一区视频| 亚洲美女黄网| 欧美精品总汇| 久热免费在线观看| 欧美一级xxx| 在线精品在线| 亚洲欧洲二区| 一道本视频在线观看| segui88久久综合| 在线码字幕一区| 亚洲欧美一区二区三区久久| 成人黄色av电影| 欧美综合社区国产| 国产成人a亚洲精v品无码| 97激碰免费视频| 大桥未久av一区二区三区| 亚洲伦理精品| 黄色大片在线| 日韩av电影免费在线观看| 亚洲欧美日韩中文在线| 国产亚洲一区二区三区在线观看| 国产毛片久久久| 一级毛片在线播放| 欧美激情www| 久久久国产一区二区| 一区二区三区在线免费| 欧美三级小说| 亚洲91av|