Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
À´ÍæPlay¿ò¼Ü
 
×÷ÕߣºVamei À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ 2015-12-3
  5989  次浏览      28
 

˵µ½ÍøÂç¿ò¼Ü£¬RubyµÄRuby on RailºÍPythonµÄDjango¶¼Ï൱ÇáÇɺÃÓ㬵«JavaϵĿò¼Ü£¬ÔòÒª³ÁÖØºÜ¶à¡£ÓÐÈËÒò´ËÖÊÒÉJavaÓïÑÔ±¾ÉíÊÇ·ñ·ûºÏÍøÂçʱ´úµÄÐèÇó¡£Java´óÉñÃǶÔÕâÒ»ÎÊÌâàÍÖ®ÒԱǡ£ÏëÒªÇáÇɺÃÓõĿò¼Ü£¿Ð´Ò»¸ö¸øÄã¾ÍÊÇÁË¡£Java³ÌÐòÔ±Guillaume BortÔÚJVMÉÏ´´ÔìÁËÒ»¸öȫеĿò¼ÜPlay framework¡£PlayÓµÓÐROR»òDjangoÄÇÑùµÄÁéÇÉ£¬ÓÖ²»Ê§JavaµÄÎȶ¨£¬¸üÓÐJVMÕâһǿ´óµÄÔËÐÐÆ½Ì¨¡£Ä§¹íÉí²Ä£¬ÌìʹÁ³µ°¡£ÈÃÎÒÃÇÀ´ÍæÍæPlay°É¡£

ÏÂÔØÓë°²×°

PlayµÄ°²×°Ï൱¼òµ¥¡£ÔÚPlay¹ÙÍøÏÂÔØ£¬ÎÒÏÂÔØµÄÊÇ2.2.1°æ±¾¡£¸Ã°æ±¾µÄAPIÎĵµÎª2.2.1API¡£

°ÑÏÂÔØµÄ.zipÎļþ½âѹËõ£¬²¢½«½âѹËõºóµÄÎļþ¼Ð·Åµ½Ä³¸öλÖᣱÈÈç/home/vamei/Util¡£

unzip play-2.2.1.zip
mv play-2.2.1 /home/vamei/Util/

Îļþ¼ÐÀïÖØÒªµÄÊÇ¿ÉÖ´ÐÐÎļþplay¡£ÎÒÒ»°ãÊÇÔÚ/home/vamei/Util/Ï´´½¨Ò»¸öbinÎļþ¼Ð£¬²¢ÔÚ¸ÃÎļþ¼ÐÖд´½¨playµÄÈíÁ´½Ó¡£

mkdir -p /home/vamei/Util/bin
cd /home/vamei/Util/bin
ln -s /home/vamei/Util/play-2.2.1/play .

×îºó£¬½«Ð½¨µÄbinÎļþ¼Ð·ÅÈëϵͳ·¾¶¡£

echo "export PATH=/home/vamei/Util/bin:$PATH" >> /home/vamei/.bashrc
source /home/vamei/.bashrc

ÔÚÃüÁîÐÐÊäÈëplay£¬½«ÏÔʾ£º

 _
_ __ | | __ _ _ _
| '_ \| |/ _' | || |
| __/|_|\____|\__ /
|_| |__/

play 2.2.1 built with Scala 2.10.2 (running Java 1.7.0_51), http://www.playframework.com

This is not a play application!

Use `play new` to create a new Play application in the current directory,
or go to an existing application and launch the development console using `play`.

You can also browse the complete documentation at http://www.playframework.com.

×¢£º

ÉÏÃæÊÇUbuntuϵݲװ¹ý³Ì¡£Linuxϵͳ¶¼ÀàËÆ¡£

ÔÚMac OSÏ£¬Ñ¡ÔñºÏÊʵÄ·¾¶°²×°play£¬¹ý³ÌÒ²Ïàͬ¡£

¶ÔÓÚWindowsϵݲװ£¬Ã»ÓÐ̽Ë÷¡£»¶Ó­²¹³ä¡£

´´½¨ÓëÔËÐÐ

Çл»µ½/home/vamei£¬´´½¨Ò»¸öÍøÂçÓ¦ÓÃtest£¬

play new test

¸úËæÖ¸Ê¾£¬ÊäÈëÏîÄ¿µÄ±ØÒªÐÅÏ¢¡£Ó¦ÓÃÃûºÍ±à³ÌÓïÑÔ£¬·Ö±ðΪtestºÍJava¡£

½«ÓÐÒ»¸öеÄÎļþ¼Ð/home/vamei/test³öÏÖÔÚµ±Ç°Â·¾¶¡£Ëü°üº¬¸ÃÏîÄ¿µÄËùÓÐÎļþ¡£

test
©À©¤©¤ README
©À©¤©¤ app
©¦ ©À©¤©¤ controllers
©¦ ©¦ ©¸©¤©¤ Application.java
©¦ ©¸©¤©¤ views
©¦ ©À©¤©¤ index.scala.html
©¦ ©¸©¤©¤ main.scala.html
©À©¤©¤ build.sbt
©À©¤©¤ conf
©¦ ©À©¤©¤ application.conf
©¦ ©¸©¤©¤ routes
©À©¤©¤ project
©¦ ©À©¤©¤ build.properties
©¦ ©¸©¤©¤ plugins.sbt
©À©¤©¤ public
©¦ ©À©¤©¤ images
©¦ ©¦ ©¸©¤©¤ favicon.png
©¦ ©À©¤©¤ javascripts
©¦ ©¦ ©¸©¤©¤ jquery-1.9.0.min.js
©¦ ©¸©¤©¤ stylesheets
©¦ ©¸©¤©¤ main.css
©¸©¤©¤ test
©À©¤©¤ ApplicationTest.java
©¸©¤©¤ IntegrationTest.java

ÉÏÃæ×îÖØÒªµÄÎļþ¼ÐÊÇapp£¬ÀïÃæ°üº¬ÁËÏîÄ¿µÄMVC¶¨Òå¡£Play²ÉÓÃMVC¼Ü¹¹(model-view-control)¡£Ð½¨ÏîÄ¿ÒѾ­´´½¨ºÃÁËcontrollersºÍviews£¬°üº¬ÓпØÖÆÆ÷(controller)ºÍÊÓͼ(view)Ä£°å¡£Èç¹ûÓбØÒª£¬¿ÉÒÔÔÚappÏ´´½¨modelsÎļþ¼Ð£¬ÓÃÀ´¶¨ÒåÊý¾ÝÄ£ÐÍ(model)¡£

application.conf°üº¬ÁËÏîÄ¿µÄ¸÷¸öÉèÖòÎÊý¡£

routes¼Ç¼ÁËurlÇëÇóºÍ¿ØÖÆÆ÷µÄ¶ÔÓ¦¹ØÏµ¡£µ±ÓÐhttpÇëÇó½øÈëʱ£¬Play½«¸ù¾Ý¸ÃÎļþµÄÉèÖ㬵÷ÓÃÌØ¶¨µÄ¿ØÖÆÆ÷Ðж¯¡£

ÏÖÔÚ£¬Çл»µ½/home/vamei/test£¬²¢ÔËÐÐÏîÄ¿¡£ÊäÈëÃüÁ

play run

Play×Ô¼º°üº¬ÓÐÒ»¸öÍøÂç·þÎñÆ÷Ä£¿é£¬ËùÒÔ²»ÐèÒªºÍapacheÏνӣ¬¾Í¿ÉÒÔ×÷ÎªÍøÂç·þÎñÆ÷£¬Ö±½Ó¹¤×÷¡£

´ò¿ªä¯ÀÀÆ÷£¬·ÃÎÊlocalhost:9000£¬½«¿´µ½ÔËÐеÄtestÓ¦Óá£

ÕâÒ»Ò³ÃæÊÇн¨ÏîÄ¿×Ô´øµÄÒ³Ãæ¡£

½âÎö

Play¿ò¼ÜµÄÖ÷Òª¹¦ÄÜÊǶ¯Ì¬Éú³ÉhttpÏìÓ¦¡£httpЭÒé°´ÕÕ¡°ÇëÇó-ÏìÓ¦¡±(request-response)µÄ·½Ê½¹¤×÷¡£httpͨÐŵÄÏà¹Ø½éÉÜ£¬¿É²Î¿¼httpЭÒé¡£

PlayÊÇMVC¼Ü¹¹£¬·Ö²½ÖèÉú³ÉÏìÓ¦£¬¶øÃ¿Ò»²½Óɲ»Í¬µÄÄ£¿é¸ºÔð¡£ÉÏÃæµÄÒ»¸ö¼òµ¥Ò³Ã棬ÊÇÈçϹý³Ì²úÉúµÄ£º

ͼÖеĺÚÉ«×ÖÌå±íÃ÷ÁËÕâЩ¹¦ÄÜÔÚÏîÄ¿ÖÐËùÔڵľßÌåÎļþ¡£

routes¸ºÔð½«urlµ¼ÏòÕýÈ·µÄÐж¯(action)¡£actionÊÇÉú³ÉhttpÏìÓ¦µÄºËÐÄ¡£Ò»¸öaction»á¾­¹ýһϵÁеÄÔËË㣬²úÉúÒ»¸öÏìÓ¦¡£¶ø¿ØÖÆÆ÷controllerÖ»ÊÇÒ»¸öactionµÄ¼¯ºÏ¡£ÔÚJava±à³ÌÖУ¬actionÊÇcontrollerÀàµÄÒ»¸ö·½·¨¡£actionµÄÏìÓ¦¿ÉÒÔ´«¸øÄ³¸öÊÓͼ£¬±ÈÈçÉÏÃæµÄindex.scala.html£¬´Ó¶ø¸üºÃµÄ¿ØÖÆÏÔʾЧ¹û¡£×îºóµÄ½á¹û£¬¾ÍÊÇÒ»¸öhttpÏìÓ¦£¬Ò²¾ÍÊÇÎÒÃÇËù¿´µ½µÄÒ³Ãæ¡£

ͨ¹ý¸öÐÔ»¯ÉÏÊö¹ý³Ì£¬ÎÒÃÇ¿ÉÒÔÉè¼Æ³ö¹¦Äܸü·á¸»µÄÍøÂçÓ¦Óá£

³ÖÐøÔËÐÐ

Play×Ô´øµÄ·þÎñÆ÷¿ÉÒÔ³ÖÐøÔËÐС£½«Play°²×°ÔÚÄ¿±ê·þÎñÆ÷£¬±ÈÈçÔÆÉϺó£¬ÔÚPlayÏîÄ¿µÄ¸ùĿ¼Ï£¬Óãº

play start

À´³ÖÐøÔËÐзþÎñÆ÷¡£´ËºóÄã¿ÉÒÔ°´Ctrl-DÀ´·µ»ØÃüÁîÐС£´ËʱµÄPlay²»ÒÀÀµÓÚShell£¬¼´Ê¹Í˳ö·þÎñÆ÷µÄµÇ½£¬Play»¹ÊÇ»á³ÖÐøÔËÐС£

ʹÓÃÆäËü¶Ë¿ÚÔËÐУº

play "start -Dhttp.port=8080"

Í£Ö¹ÔËÐС£Çл»µ½ÏîÄ¿µÄ¸ùĿ¼Ï£¬Ê¹ÓÃÃüÁ

play stop

À´ÍæPlay¿ò¼Ü02 ÏìÓ¦

ÎÒÉÏÒ»ÕÂ×ܽáÁËPlay¿ò¼ÜµÄ»ù±¾Ê¹Óá£ÕâÒ»ÕÂÀÎÒ½«Ð޸ĺÍÔö¼ÓÏìÓ¦¡£

HTTPЭÒéÊǰ´ÕÕ¡°ÇëÇó-ÏìÓ¦¡±µÄ·½Ê½¹¤×÷¡£Play¿ò¼ÜµÄºËÐÄÊÇÓö¯×÷(Action)À´Íê³É¡°ÇëÇó-ÏìÓ¦¡±¡£Ò»¸ö¶¯×÷¸ºÔð´¦ÀíÒ»ÖÖÇëÇó¡£Ò»¸öÏîÄ¿¿ÉÄÜÒª¶¨ÒåÐí¶à¶¯×÷¡£¸´ÔÓµÄÍøÕ¾£¬¿ÉÄÜÒª¶¨ÒåÉϰٸö¶¯×÷¡£ËùÒÔ£¬PlayʹÓÿØÖÆÆ÷(Controller)ºÍURL·ÓÉ(URL routing)À´×éÖ¯¹ÜÀí¶¯×÷¡£¿ØÖÆÆ÷ÓÃÓÚ¸ø¶¯×÷·ÖÀà¡£URL·ÓÉ(routes)¼Ç¼ÁËURLºÍ¶¯×÷µÄ¶ÔÓ¦¹ØÏµ¡£

IDE

ÔÚ¿ª·¢´úÂë֮ǰ£¬Ïȼòµ¥½éÉÜÈçºÎʹÓÃEclipse£¬¿ª·¢PlayÏîÄ¿¡£

ÔÚÏîÄ¿µÄ¸ùĿ¼Ï£¬Ê¹ÓÃÃüÁ

play eclipse

³É¹¦ºó£¬´ò¿ªEclipse£¬ÔÚFile->ImportÖУ¬Ñ¡ÔñGeneral->Existing Projects into Workspace¡£ÔÚSelect root directoryÖУ¬Ñ¡ÔñÏîÄ¿µÄ¸ùĿ¼¡£Ëæºó£¬ÏîÄ¿±»ÒýÈëEclipse¡£

JavaÊǾ²Ì¬ÓïÑÔ£¬¿ÉÒÔÔÚ±àÒëʱ¾Í¾ö¶¨¶ÔÏóµÄÀàÐÍ£¬Òò´ËÄÜ·½±ãµÄʵÏÖ´úÂë×Ô¶¯Ìáʾ²¹Æë¡¢×Ô¶¯Ñ°ÕÒÀàËùÔڵİü²¢import¡£ÔÚд³ÌÐòµÄ¹ý³ÌÖУ¬Ò²ÄÜÓкܶàÓѺÃÌáʾ¡£

ºóÃæµÄ´úÂëÖУ¬Èç¹ûûÓÐдÃ÷importµÄ°ü£¬¿ÉÒÔÔÚEclipse»·¾³ÏÂ×Ô¶¯Ñ°ÕÒ¡£

Àí½âÏìÓ¦

ÎÒÏÈÀ´½éÉÜ¿ØÖÆÆ÷ºÍURL·ÓÉ¡£ÎÒÒÔPlayĬÈÏÉú³ÉµÄ¶¯×÷ΪÀý½²½â¡£Äã¿ÉÒÔÔÚPlayÏîÄ¿ÖÐÕÒµ½ÏÂÃæÎļþ¡£

Ò»¸öÇëÇó½øÈë·þÎñÆ÷ºó£¬ÓÉURL·ÓÉÒýµ¼µ½ÕýÈ·µÄ¶¯×÷À´´¦Àí¡£URL·Óɸù¾ÝÇëÇóµÄ·½·¨ºÍURLÀ´Ê¶±ðÕâÒ»ÇëÇó£¬ÔÙѰÕÒ¶ÔÓ¦¶¯×÷¡£

URL·ÓÉÊÇÒ»¸öÎļþ£¬¼´ÏîÄ¿¸ùĿ¼ÏµÄconf/routes¡£ÎļþµÄÿһÐÐÊÇÒ»Ìõ¼Ç¼£¬¹æ¶¨ÁËij¸öURLµÄ¶ÔÓ¦¶¯×÷¡£±ÈÈ磺

# Home page
GET / controllers.Application.index()

#¿ªÊ¼µÄÐÐÊÇ×¢ÊÍ

¼Ç¼·ÖΪÈý¸ö²¿·Ö¡£µÚÒ»²¿·ÖΪÇëÇóµÄ·½·¨£¬µÚ¶þ¸ö²¿·ÖΪÇëÇóµÄURL£¬µÚÈý¸öÊÇÇëÇóµÄ¶ÔÓ¦¶¯×÷¡£ÕâÀïApplicationÊÇÒ»¸ö¿ØÖÆÆ÷£¬Î»ÓÚapp/controllers/Application.javaÖС£Ò»¸ö¿ØÖÆÆ÷Ò²ÊÇÒ»¸öJavaÀà¡£¶ø¶¯×÷index()ÊÇÀàµÄÒ»¸ö·½·¨¡£

ÎÒ¶ÔĬÈÏÉú³ÉµÄApplication.javaÂÔ×÷Ð޸ġ£ÐµÄapp/controllers/Application.javaΪ£º

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {

public static Result index() {
return ok("Hello World!");
}

}

¿ÉÒÔ×¢Òâµ½£¬×÷Ϊ¿ØÖÆÆ÷µÄApplication£¬ÐèÒª¼Ì³Ð×ÔControllerÀà¡£

Ò»¸ö¶¯×÷±ØÐëÊÇÒ»¸ö¾²Ì¬(static)µÄ·½·¨¡£Ò»¸ö¶¯×÷·µ»ØÒ»¸öResultÀàÐ͵ĶÔÏó¡£ok("Hello World!")·µ»ØµÄ¾ÍÊÇÕâôһ¸öResult¶ÔÏ󣬴ú±íÁËÒ»¸öHTTPÏìÓ¦¡£ok()·µ»ØµÄÏìÓ¦¶¼ÊÇ200״̬£¬¼´ok£¨Õý³£»Ø¸´£©¡£ÔÚÕâ¸öÀý×ÓÖУ¬ÏìÓ¦µÄÖ÷ÌåÄÚÈÝΪ"Hello World!"¡£

Äã¿ÉÒÔÆô¶¯Play·þÎñÆ÷£¬·ÃÎÊÉÏÃæµÄURL(localhost:9000/)¡£Ê¹ÓÃChromeµÄnetwork¹¤¾ß¼àÊӻظ´¡£Ò³ÃæÈçÏ£º

¸ù¾Ýnetwork¹¤¾ßµÄ¼àÊÓ£¬ÏìÓ¦µÄ״̬ÂëΪ200¡£ÏìÓ¦µÄÀàÐÍΪtext/plain¡£ÕâÊÇok()Éú³ÉResult¶ÔÏóʱ×Ô¶¯¾ö¶¨µÄ¡£ÎÒ¿ÉÒÔÊÖ¶¯¿ØÖÆÏìÓ¦ÀàÐÍ£¬±ÈÈ罫index()µÄ·µ»ØÓï¾ä¸ÄΪ£º

return ok("Hello World!").as("text/html");

ÕâÑù£¬ÏìÓ¦µÄÖ÷ÌåÀàÐÍΪhtml¡£

ÆäËü״̬µÄÏìÓ¦

³ýÁËok()Ö®Í⣬Play»¹ÌṩÁËÆäËûµÄһЩ±ã½Ý·½·¨£¬ÓÃÒÔÉú³É²»Í¬×´Ì¬µÄÏìÓ¦¡£ÕâЩ·½·¨µÄÃû×ÖºÍ״̬µÄÃû×ÖÏàͬ£¬±ÈÈ磺

return badRequest("bad request"); // 400, »µÇëÇó
return unauthorized("You are forbidden"); // 401, δÊÚȨ
return redirect("/new"); // 303, ÖØÐ¶¨Ïò

ÕâЩ·½·¨·µ»Ø¶ÔÓ¦µÄ״̬Âë¡£ä¯ÀÀÆ÷¸ù¾Ý״̬ÂëºÍ»Ø¸´µÄÄÚÈÝ£¬×ö³ö·´Ó¦¡£±ÈÈçÊÕµ½303ʱ£¬ÖØÐ¶¨Ïòµ½ÐµÄURL¡£

´ËÍ⣬ÎÒ»¹¿ÉÒÔÖ±½ÓʹÓÃstatus()À´ËµÃ÷Êý×ÖÐÎʽµÄ״̬Âë

return status(200, "good");

¸ü¶àµÄÏìÓ¦Éú³É·½Ê½¿É²Î¿¼Results

Á·Ï°

ÔÚÉÏÃæµÄ¿ØÖÆÆ÷ApplicationÖУ¬Ôö¼ÓÒ»¸öÐµĶ¯×÷£¬ÓÃÓÚÏÔʾ

<p>See you!</p>

ÐÞ¸Äroutes£¬²¢Ñé֤Ч¹û¡£

URL·ÓÉ

URL·ÓÉÊÇÓÉÒ»ÐÐÒ»ÐеļǼ×é³ÉµÄ¡£ÉÏÃæÎÒÃÇ¿´µ½ÁËGET·½·¨£¬»¹¿ÉÒÔÊÇÆäËüHTTP·½·¨£¬±ÈÈçPOST£º

POST /somePost  controllers.Application.somePost()

ÎÒÒªÔÚApplicationÀàÖÐÔö¼ÓsomePost()¶¯×÷À´´¦Àí¸ÃÇëÇ󣬱ÈÈ磺

public static Result somePost() {
return ok("posted");
}

POST·½·¨³£ÓÃÓÚÏò·þÎñÆ÷Ìá½»Êý¾Ý¡£ÎÒ½«ÔÚÒÔºóÉîÈë¡£

url»¹¿ÉÒÔÓÐÓû§¶¨ÒåµÄ±äÁ¿£¬´Ó¶øÈÃÒ»ÐмǼ¶ÔÓ¦²»Ö¹Ò»¸öÇëÇ󣬱ÈÈ磺

GET   /record/:id  controllers.Application.record(id: Long)

ÉÏÃæµÄ:idÊÇÒ»¸öÃûΪidµÄ±äÁ¿¡£":"ÊÇÒ»¸öÌáʾ·û¡£id½«´Ó":"¿ªÊ¼£¬Ö±µ½½áÊø»òÕßÁíÒ»¸ö"/"¡£

µ±ÎÒÃÇ·ÃÎÊ/record/1234ʱ£¬id¾ÍÊÇ1234¡£¶ÔÓ¦µÄ¶¯×÷°üº¬ÓÐÒ»¸ö²ÎÊý£¬À´½ÓÊÕid±äÁ¿¡£ÎÒÕâÀï°Ñ²ÎÊýÀàÐͶ¨ÒåΪLong¡£Play½«¸ºÔðÀàÐ͵Äת»»¡£

ÏàÓ¦µÄrecord()¶¯×÷Ϊ£º

public static Result record(Long id) {
return ok("record:" + id.toString());
}

¿ÉÒÔ¿´µ½£¬¸Ã¶¯×÷Óë֮ǰµÄ¶¯×÷Óе㲻һÑù£¬Ëü½ÓÊÜÒ»¸ö²ÎÊý£¬¼´À´×ÔurlµÄ±äÁ¿¡£

³ýÁË":"Ö®Í⣬»¹ÓÐÁíÒ»¸öÌáʾ·û"*"¡£Óë":"²»Í¬£¬"*"±íʾµÄÇø¼ä²»ÊÜ"/"ÏÞÖÆ¡£

GET    /newRecord/*name  controllers.Application.newRecord(name: String)

Èç¹ûÎÒÃÇ·ÃÎÊ/newRecord/abc/def£¬ÄÇôname½«¶ÔÓ¦×Ö·û´®"abc/def"

À´ÍæPlay¿ò¼Ü03 Ä£°å

ÔÚÉÏÒ»Õ½ÚÖУ¬ÎÒ°Ñ×Ö·û´®Í¨¹ýok()·µ»Ø¸ø¿Í»§¡£ÎÒ¿ÉÒÔ°ÑÒ»¸öÍêÕûµÄhtmlÒ³Ãæ·ÅÈë×Ö·û´®Öзµ»Ø¡£È»¶ø£¬ÏÖ´úµÄ¿ò¼Ü¶¼ÌṩÁ˸üºÃµÄ·½·¨¡ª¡ªÄ£°å¡£Ä£°å½«ÊÓͼºÍÊý¾Ý·Ö¿ª¡£·þÎñÆ÷¿ÉÒ԰Ѳ»Í¬µÄÊý¾Ý´«µÝ¸øÍ¬Ò»¸öÄ£°å£¬´Ó¶ø²úÉú²»Í¬µÄÒ³Ãæ¡£ PlayͬÑùÒ²ÓÐÒ»Ì×Ä£°åϵͳ¡£Ä£°åµÄ´ó²¿·ÖÄÚÈݶ¼¿ÉÒÔÓÃhtmlд£¬×÷ΪÊÓͼ£¬¶øÔÚÒ»Ð©ÌØ±ðµÄµØ·½£¬Ô¤Áô¸øÊý¾Ý²ÎÊý¡£ÔÚÄ£°åÖУ¬ÓÃScalaÓïÑÔÀ´µ÷ÓòÎÊý¡£

ʹÓÃÄ£°å

ÎÒÊ×ÏÈ´´½¨Ò»¸öÄ£°å£¬´¿´âÆðÊÓͼ¹¦ÄÜ¡£ÔÚapp/viewsÎļþ¼ÐÖУ¬Ð½¨Îļþindex.scala.html £¨Èç¹ûÒÑÓУ¬Ôòɾ³ý²¢ÖØÐ´´½¨£©¡£

<!DOCTYPE html>
<html>
<header>
<title>Play</title>
</header>

<body>
<p>Hello World! Start using the Template.</p>
</body>
</html>

Õâ¸öÄ£°åÊǸö´¿´âµÄhtmlÎļþ£¬ÊÇ×î¼òµ¥µÄÄ£°åÐÎʽ¡£

ÐÞ¸Äapp/controllers/Application.java£º

package controllers;

import play.*;
import play.mvc.*;


public class Application extends Controller {
public static Result index() {
return ok(views.html.index.render());
}
}

ok()ÖнÓÊÕµÄÊÇviews.html.index.render()£¬Êµ¼ÊÉϾÍÊÇapp/views/index.scala.htmlÕâһģ°åµÄrender()·½·¨¡£Play»á¸ù¾ÝÄ£°å£¬×Ô¶¯Éú³ÉÏàÓ¦µÄÀà¡£

*** Ò²¿ÉÒÔÓÃimportÒýÈëviews.html.index£¬¶ø²»ÊÇʹÓÃÍêÕûµÄÀà·¾¶¡£

·ÃÎÊÒ³Ãæ£º

Ä£°åÓïÑÔ

ÕâÒ»²¿·Ö£¬ÎҰѶÔÏó×÷Ϊ²ÎÊý´«¸øÄ£°å£¬È»ºóÔÚÄ£°åÖÐÏÔʾ¶ÔÏóÖаüº¬µÄÊý¾Ý¡£ÐÞ¸Äindex.scala.html£º

@(title: String, content: String)

<!DOCTYPE html>
<html>
<header>
<title>@title</title>
</header>

<body>
<p>@(content) Start using the template.</p>
</body>
</html>

ÉÏÃæµÄµÚÒ»ÐУ¬ÒÔ@·ûºÅ¿ªÍ·£¬ËµÃ÷Á˸ÃÄ£°åËù½ÓÊÕµÄÁ½¸ö²ÎÊý£¬¼´StringÀàÐ͵ÄtitleºÍcontent¡£ÔÚÄ£°åÖУ¬ÓÃ@·ûºÅºÍ²ÎÊýÃû£¬À´µ÷ÓòÎÊý¡£²ÎÊýÃûÖÜΧ¿ÉÒÔÓÃÀ¨ºÅ"()"£¬ÒÔÇø·ÖÕýÎÄ¡£

Ð޸͝×÷£º

public static Result index() {
return ok(views.html.index.render("Play", "Hello World! Parameters passed. "));
}

ÕâÀï´«µÝÁ½¸ö×Ö·û´®¸øÄ£°å¡£×îÖÕÏÔʾµÄ½á¹ûÖУ¬Á½¸ö×Ö·û´®½«Ìî³äÔÚÄ£°åÖеÄÊʵ±Î»Öá£

ÉÏÃæ°ÑÒ»¸ö¶ÔÏ󴫵ݸøÄ£°å¡£ÎÒÃÇ»¹¿ÉÒÔÔÚÄ£°åÖе÷ÓöÔÏóµÄÊôÐÔ»ò·½·¨£º

@object.method()

@object.field

Ä£°å¿ØÖÆ

ÎÒ»¹¿ÉÒÔÓÃScalaµÄÓï·¨£¬ÔÚÄ£°åÖÐʵÏÖ¸ü¸´ÔÓµÄÂß¼­¡£±ÈÈçÏÂÃæµÄÄ£°åÖÐʹÓÃÑ­»·£º

@(title: String, content: String, lines: List[String])

<!DOCTYPE html>
<html>
<header>
<title>@title</title>
</header>

<body>
<p>@(content) Start using the template.</p>
<ul>
@for(line <- lines) {
<li>@line</li>
}
</ul>
</body>
</html>

Ñ­»·ÊÇ@forʵÏֵġ£@ºóÃæ²»½ö¿ÉÒÔÊÇÒ»¸ö¶ÔÏ󣬻¹¿ÉÒÔÊÇÒ»¸öÍêÕûµÄScalaÓï·¨¡£

Ð޸͝×÷£¬°ÑÒ»¸ö×Ö·û´®ÀàÐ͵ıí×÷Ϊ²ÎÊý´«µÝ¸øÄ£°å£º

package controllers;

import play.*;
import play.mvc.*;

import java.util.List;
import java.util.ArrayList;

public class Application extends Controller {
public static Result index() {
List<String> lines = new ArrayList<String>();
lines.add("a");
lines.add("b");
lines.add("c");
return ok(views.html.index.render("Play", "Hello World!", lines));
}
}

µÃµ½ÏÂÃæµÄÒ³Ãæ£º

Ä£°åÖл¹¿ÉÒÔÓÐifÑ¡Ôñ½á¹¹£¬±ÈÈç

@if(item) {
<p>True</p>
} else {
<p>False</p>
}

¸ù¾Ý²ÎÊýitemµÄÕæ¼Ù£¬if½á¹¹ÏÔʾ²»Í¬µÄÄÚÈÝ¡£

À´ÍæPlay¿ò¼Ü04 ±íµ¥

±íµ¥(form)ÊÇ×î³£¼ûµÄ´Ó¿Í»§Íù·þÎñÆ÷´«µÝÊý¾ÝµÄ·½Ê½¡£Play¿ò¼ÜÌṩÁËһЩ¹¤¾ß¡£ËüÃÇ¿ÉÒÔ´Ó±íµ¥ÖÐÌáÈ¡Êý¾Ý£¬ÑéÖ¤Ìá½»Êý¾ÝµÄºÏ·¨ÐÔ£¬»òÕßÔÚÊÓͼÖÐÏÔʾ±íµ¥¡£ÎÒÏÈÀ´½éÉÜ×î¼òµ¥µÄʹÓÃ±íµ¥Ìá½»Êý¾ÝµÄ·½Ê½¡£

Ôö¼Ó±íµ¥

ÎÒ¿ÉÒÔÓô¿´âhtmlµÄ·½Ê½²úÉúÒ»¸ö±íµ¥¡£ÔÚapp/viewsÏÂÔö¼ÓÄ£°åform.scala.html:

<!DOCTYPE html>
<html>
<body>
<form method="POST" action="/postForm">
<input type="text" name="content"></input>
<input type="submit"></input>
</form>
</body>
</html>

ÔÚApplication¿ØÖÆÆ÷ÖУ¬Ôö¼ÓÒ»¸ö¶¯×÷form()£¬ÏÔʾģ°å:

public static Result form() {
return ok(views.html.form.render());
}

ÔÚroutesÖÐÔö¼Óµ¼º½

GET     /form                       controllers.Application.form()

Ò³ÃæÈçÏ£º

Êý¾ÝÌáÈ¡

ÔÚÎı¾¿òÖÐÊäÈëÈÎÒâ×Ö·û£¬µã»÷submitºó£¬±íµ¥½«ÒÔPOST·½·¨Ìá½»µ½/postFormÕâÒ»URL¡£ÔöÌí¸ºÔð´¦Àí¸ÃURLµÄ¶¯×÷£¬Application.postForm()

public static Result postForm() {
DynamicForm in = Form.form().bindFromRequest();
String result = in.get("content");
return ok(result);
}

DynamicFormºÍForm¶¼À´×Ôplay.data¡£Form.form().bindFormRequest()´ÓÇëÇóÖÐÌáÈ¡±íµ¥ÐÅÏ¢£¬²¢·ÅÈëµ½DynamicFormÀàÐ͵Äin¶ÔÏóÖС£

ÎÒÉÏÃæÓÃget()·½·¨£¬À´ÌáÈ¡±íµ¥Öв»Í¬Ãû×ÖµÄÊäÈëÀ¸¡£±ÈÈçÉÏÃæµÄ"content"¡£postForm()¶¯×÷°Ñ±íµ¥ÖÐÌîдµÄÄÚÈÝÖ±½ÓÏÔʾ¡£

Ôö¼Óroutes¼Ç¼

POST    /postForm                   controllers.Application.postForm()

ÔÚ/formµÄÒ³ÃæÏÂÊäÈëÈÎÒâ×Ö·û´®²¢Ìá½»£¬²é¿´Ð§¹û¡£

ÎÒ½éÉÜÁË±íµ¥×î»ù±¾µÄʹÓ÷½Ê½¡£ÏÂÃæÁ˽âPlay¿ò¼ÜÌṩµÄÆäËüµÄ±íµ¥¹¤¾ß¡£

±íµ¥¶ÔÏó

ÔÚ¶¯×÷ÄÚ²¿£¬¿ÉÒÔ´´½¨Ò»¸ö¶ÔÏóÀ´Ö¸´ú±íµ¥¡£±íµ¥µÄÿ¸öÊäÈëÀ¸Îª±íµ¥¶ÔÏóµÄÒ»¸öÊôÐÔ¡£ÎÒ¿ÉÒÔͨ¹ýÔö¼Ó±ê×¢(annotation)µÄ·½·¨£¬ÑéÖ¤±íµ¥µÄÊäÈë(Form Validation)¡£

Ê×ÏÈÐÞ¸Äapp/views/form.scala.html

<!DOCTYPE html>
<html>
<body>
<form method="POST" action="/postForm">
<label>Email</label>
<input type="email" name="email">
<label>Password</label>
<input type="password" name="password">
<label>Comment</label>
<input type="text" name="comment">
<input type="submit">
</form>
</body>
</html>

Õâ¸ö±íµ¥ÓÐÈý¸öÊäÈëÀ¸£¬Ãû×Ö·Ö±ðΪemail, passwordºÍcomment¡£

´´½¨app/util/Îļþ¼Ð£¬ÔÚÆäÖд´½¨User.java¡£UserÀàÓÃÓÚÔÚPlayÄÚ²¿Ö¸´úÉÏÃæµÄ±íµ¥£º

package util;

import play.data.validation.Constraints.Email;
import play.data.validation.Constraints.Required;

public class User {
@Email
public String email;
@Required
public String password;
public String comment;
}

UserÀàÖ¸´úÒ»¸ö±íµ¥µÄÊý¾Ý¡£ÎÒ»¹ÎªÁ½¸öÊôÐÔÔö¼ÓÁ˱ê×¢¡£Play·þÎñÆ÷¿ÉÒԾݴËÑéÖ¤ÊäÈëµÄºÏ·¨ÐÔ¡£±ÈÈç@EmailµÄÏÞ¶¨¾ÍÒªÇóÊäÈëΪ"*@*"µÄÐÎʽ¡£@RequiredÔòÒªÇóÊäÈëÀ¸²»Îª¿Õ¡£Èç¹ûÎ¥·´ÕâЩÏÞ¶¨£¬ÄÇôPlay½«Å׳öÒì³£¡£

Ð޸͝×÷postForm()¡£UserÀàµÄ¶ÔÏóuserÓÃÀ´±£´æ±íµ¥Êý¾Ý¡£

public static Result postForm() {
Form<User> userForm = Form.form(User.class);
User user = userForm.bindFromRequest().get();
return ok(user.email + " " + user.password);
}

×îºóµÄok()Öе÷ÓÃÁË±íµ¥¶ÔÏóÖб£´æµÄÊý¾Ý¡£

·Ö±ðÊäÈëºÏ·¨ºÍ²»ºÏ·¨µÄÊý¾Ý£¬¹Û²ìPlay·µ»ØµÄÒ³Ãæ¡£

±íµ¥Ä£°å

ÎÒÉÏÃæÊÖ¶¯´´½¨Ä£°åÖÐµÄ±íµ¥£¬²¢±£³ÖÊÓͼÖÐµÄ±íµ¥ºÍ±íµ¥¶ÔÏóÒ»Ö¡£ÎÒ»¹¿ÉÒÔÔÚÄ£°åÖÐÖ±½Óµ÷ÓÃ±íµ¥¶ÔÏó¡£ÕâÑù×ö£¬ÄÜÈÃÊÓͼÖÐµÄ±íµ¥ºÍ±íµ¥¶ÔÏó×Ô¶¯µÄ±£³ÖÒ»Ö¡£

ÐÞ¸Äform.scala.htmlΪ

@(userForm: Form[util.User])

<!DOCTYPE html>
<html>
<body>
@helper.form(action = routes.Application.postForm()) {
@helper.inputText(userForm("email"))
@helper.inputPassword(userForm("password"))
@helper.inputText(userForm("comment"))
<input type="submit">
}
</body>
</html>

ÕâÀïʹÓÃÁËPlayËùÌṩµÄhelper¹¤¾ß¡£helper¿ÉÒÔÔÚ±íµ¥ÖÐÔö¼Ó±íµ¥form£¬ÔÙ¼ÓÈ벻ͬÀàÐ͵ÄÊäÈëÀ¸£¬±ÈÈçinputTextºÍinputPassword¡£

ÐÞ¸ÄÔ­Óе͝×÷form()

public static Result form() {
Form<User> userForm = Form.form(User.class);
return ok(views.html.form.render(userForm));
}

ÕâÀ±íµ¥¶ÔÏó×÷Ϊ²ÎÊý´«µÝ¸øÄ£°å¡£×îºóµÄhtmlÒ³ÃæÖÐµÄ±íµ¥£¬½«ÓÉPlay×Ô¶¯Éú³É¡£

À´ÍæPlay¿ò¼Ü05 Êý¾Ý¿â

Êý¾Ý¿âÊÇÕû¸öÕ¾µãµÄÊý¾Ý´¢²ØÊÒ¡£Óû§Ìá½»µÄÊý¾Ý¿ÉÒÔ´æ´¢ÔÚÊý¾Ý¿âÖУ¬ÒÔ±ãδÀ´Ê¹Óá£Play¿ÉÒÔͨ¹ýJDBCºÍÊý¾Ý¿âͨÐÅ¡£ÎÒ½²½éÉÜPlayºÍmysqlÊý¾Ý¿âµÄÁ¬½Ó¡£

Play 2.*°æ±¾µÄĬÈϲÙ×÷Êý¾Ý¿âµÄ·½Ê½ÊÇͨ¹ýEbean¡£PlayÌṩFinderÕâÒ»°ïÖúÀàÐÍ£¬¿ÉÒÔʵÏÖһЩ¼òµ¥µÄÊý¾Ý¿â²éѯ¡£

Êý¾Ý¿â×¼±¸

ÔÚmysqlÖÐÔö¼ÓÊý¾Ý¿âtesting¡£Ôö¼ÓÓû§"player"£¬ÃÜÂëΪ"player"¡£ÎªÓû§playerÔö¼ÓÊʵ±µÄȨÏÞ¡£

CREATE DATABASE testing DEFAULT CHARACTER SET utf8;
CREATE USER 'player'@'localhost' IDENTIFIED BY 'player';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON testing.* TO 'player'@'localhost';

ΪÁËÔÚPlayÖÐʹÓÃmysqlÊý¾Ý¿â£¬ÐèÒªÔÚconf/application.confÖÐÔö¼ÓÉèÖãº

# Database configuration

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://127.0.0.1:3306/testing"
db.default.user="player"
db.default.password="player"


# Ebean configuration
ebean.default="models.*"

»¹ÐèÒªÐÞ¸Äbuild.sbtΪ£º

name := "test"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
"mysql" % "mysql-connector-java" % "5.1.18"
)

play.Project.playJavaSettings

ÉÏÃæµÄ¸Ä¶¯Íê³Éºó£¬Ê¹ÓÃplay runÀ´ÔËÐзþÎñÆ÷¡£

´´½¨Ä£ÐÍ

ÏÂÃæ£¬ÎÒÔÚÄ£ÐÍÖÐÔö¼ÓÒ»¸öʵÌå(entity)£¬¼´Ò»¸öPersonÀà¡£·ÅÈëmodels/Person.java

package models;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;

import play.db.ebean.Model;
import play.db.ebean.Model.Finder;

@Entity
public class Person extends Model {
@Id
public Integer id;
public String name;

// Query
public static Finder<Integer,Person> find =
new Finder<Integer,Person>(Integer.class, Person.class);

public static List<Person> findAll() {
return find.all();
}

public static Person findByName (String name) {
return find.where().eq("name", name).findUnique();
}
}

PersonÀà¼Ì³Ð×ÔModelÀ࣬²¢ÓÐÒ»¸ö@EntityµÄ×¢½â£¬´Ó¶øËµÃ÷ËüÊÇÄ£ÐÍÖеÄÒ»¸öʵÌ塣ʵÌåÓÐÁ½¸ö³¡£¬ÕûÊýµÄidºÍ×Ö·û´®µÄname£¬ÓÃÀ´±£´æÊý¾Ý¡£

@id×¢½âÏ£¬id½«²»Îª¿Õ£¬²»Öظ´£¬²¢×Ô¶¯Ôö¼Ó¡£

Person»¹ÓÐÒ»¸ö¾²Ì¬µÄ³¡find¡£findÊÇPlayÌṩµÄFinderÀàÐÍ£¬ÓÃÓÚÊý¾Ý¿â²éѯ¡£¶øPersonÀàÖеÃfindAll()ºÍfindByName()µÄ¾²Ì¬·½·¨ÖУ¬¾Íµ÷ÓÃÁËfind£¬´Ó¶øÔÚÊý¾Ý¿âÖвéѯÌõÄ¿¡£

PlayÓÐevolutionÄ£¿é£¬¹ÜÀíÊý¾Ý¿âµÄ±í¡£Ð´ºÃPerson.javaºó£¬·ÃÎÊÏîÄ¿¡£PlayÕâʱ»áÉú³ÉÔÚmysqlÖн¨Á¢±í¸ñµÄ½Å±¾¡£ÔËÐиýű¾¼´¿É¡£

Ôö¼ÓÊý¾Ý¿âÌõÄ¿

Ôö¼ÓÒ»¸ö¶¯×÷¡£Õâ¸ö¶¯×÷ÏòÊý¾Ý¿âÔö¼ÓÌõÄ¿£º

public static Result addPerson() {
Person p1 = new Person();
Person p2 = new Person();
p1.name = "vamei";
p2.name = "play";
p1.save();
p2.save();
return ok("Saved");
}

*** ÉÏÃæµÄ´úÂëÒªimport models.Person¡£

½«/addPersonÕâÒ»URL¶ÔÓ¦¸Ã¶¯×÷¡£·ÃÎʺó£¬Êý¾Ý¿â½«Ôö¼ÓÌõÄ¿£º

Á·Ï° ¸ù¾Ý±íµ¥Ò»½²µÄÄÚÈÝ£¬Ôö¼ÓÒ»¸öÏòÊý¾Ý¿âÌí¼ÓÌõÄ¿µÄ±íµ¥¡£

Êý¾Ý¿â²éѯ

ÎÒ¿ÉÒÔÔÚ¶¯×÷Öе÷ÓøղŶ¨ÒåµÄ²éѯ·½·¨findAll()ºÍfindByName()£¬±ÈÈçÔö¼ÓallPerson()¶¯×÷£º

public static Result allPerson() {
List<Person> persons = Person.findAll();
return ok(views.html.personList.render(persons));
}

ÉÏÃæ²éѯµÃµ½µÄPersonÀàÐÍµÄ±í£¬´«µÝ¸øÄ£°åviews/personList.scala.html:

@(personList: List[models.Person])

<!DOCTYPE html>
<html>
<body>
<ul>
@for(person <- personList) {
<li>@person.name</li>
}
</ul>
</body>
</html>

ÐÞ¸Äroutes£¬Ôö¼Ó¶ÔÓ¦µÄURLΪ/allPerson£¬Ò³ÃæÈçÏ£º

ÊÂʵÉÏ£¬ÎÒÒ²¿ÉÒÔÔÚ¶¯×÷ÖÐÖ±½Óµ÷ÓÃPerson.find£¬À´×é³É²éѯÓï¾ä¡£Õ⽫Èö¯×÷ÄÚ²¿Óиü´óµÄ²éѯ×ÔÓɶȡ£±ÈÈçÉÏÃæµÄ¶¯×÷¿ÉÒÔ¸Äд³É£º

public static Result allPerson() {
List<Person> persons = Person.find.all();
return ok(views.html.personList.render(persons));
}

À´ÍæPlay¿ò¼Ü06 Óû§ÑéÖ¤

Óû§ÑéÖ¤(User Authentification)¸´ºÏµÄʹÓÃPlay¿ò¼ÜµÄÊý¸ö¹¦ÄÜ£¬°üÀ¨Ç°ÃæÒѾ­Á˽âµÄ±íµ¥ºÍÊý¾Ý¿â£¬ÒÔ¼°ÕâÆªÎÄÕÂÀïÒªÌáµ½µÄ¼ÓÃܺͻỰ¡£¸ù¾ÝÓ¦ÓûòÕ¾µãµÄ¸´Ôӳ̶ȣ¬Óû§ÑéÖ¤Ò²¿ÉÒÔËæÖ®±ä»¯¡£ÕâÀォ½éÉÜÓû§ÑéÖ¤µÄÒ»¸ö»ù±¾ÊµÏÖ·½Ê½¡£

¼ÓÃÜ

ΪÁËÐÅÏ¢°²È«£¬Óû§ÃÜÂëÐèÒª¼ÓÃÜ£¬¶ø²»ÊDZ£´æÎªÃ÷ÎÄ¡£BcryptËã·¨¿ÉÒÔ¶ÔÃ÷ÎÄÃÜÂë½øÐйþÏ£(Hash)ת»»¡£ÎÒ±£´æÔÚÊý¾Ý¿âÖеÄÃÜÂ룬ÊǾ­¹ýת»»ºóµÄÎı¾¡£

JBcryptÊÇÒ»¸öÍⲿµÄ°ü£¬ÌṩÁËBcrypt¹¦ÄÜ¡£ÒªÔÚbuild.sbtÖÐ˵Ã÷Õâ¸ö°üµÄÀ´Ô´ºÍ°æ±¾£º

name := "test"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
"mysql" % "mysql-connector-java" % "5.1.18",
"org.mindrot" % "jbcrypt" % "0.3m"
)

play.Project.playJavaSettings

¼´ÉÏÃæÐÂÔöµÄjbcryptÐС£ÖØÐÂÔËÐÐPlayºó¼´¿ÉʹÓá£ÎªÁËEclipseÄÜ×Ô¶¯²¹Æë¸Ã°üµÄÏà¹Øµ÷Ó㬿ÉÒÔʹÓÃplay eclipse£¬²¢ÖØÐÂÔÚEclipseÒýÈëÏîÄ¿¡£

ÎÒÏÂÃæÓÃÒ»¸öСÀý×Ó£¬À´ËµÃ÷¸ÃBcryptµÄ¹þϣת»»¡£ÔÚPlayÖÐÔö¼Ó¶¯×÷£º

public static Result bcrypt() {
String passwordHash = BCrypt.hashpw("Hello",BCrypt.gensalt());
boolean correct = BCrypt.checkpw("Hello", passwordHash);
boolean wrong = BCrypt.checkpw("World", passwordHash);
return ok(passwordHash + " " + correct + " " + wrong);
}

ÉÏÃæ³ÌÐòÐèÒýÈëorg.mindrot.jbcrypt.BCrypt¡£¶¯×÷ÖжÔ"Hello"×Ö·û´®½øÐÐÁ˹þϣת»»£¬²¢ÑéÖ¤"Hello"ºÍ"World"ÊÇ·ñΪԭʼµÄÃ÷ÎÄÎı¾¡£

ÔÚroutesÔö¼Ó¶ÔÓ¦URL£¬/bcrypt

GET     /bcrypt                     controllers.Application.bcrypt()

·ÃÎÊÒ³Ãæ£º

Óû§×¢²á

ÓÐÁË±íµ¥¡¢Êý¾Ý¿âºÍ¼ÓÃܵĻù´¡£¬Óû§×¢²áºÜÈÝÒ×ʵÏÖ¡£Ê×ÏȽ¨Á¢Êý¾ÝÄ£ÐÍapp/models/User.java£º

package models;

import javax.persistence.*;
import play.db.ebean.Model;
import org.mindrot.jbcrypt.BCrypt;

@Entity
public class User extends Model {
@Id
private String email;
private String password;

// Constructor
public User(String email, String password) {
String passwordHash = BCrypt.hashpw(password, BCrypt.gensalt());
this.email = email;
this.password = passwordHash;
}
}

Õâ¶Î´úÂë´´½¨ÁËUserÀ࣬°üº¬Á½¸öÊôÐÔemailºÍpassword¡£ÔÚ¹¹ÔìÆ÷ÖУ¬ÎÒ¶ÔÃÜÂë½øÐÐÁ˹þϣת»»¡£

ÏÂÃæÐ޸ĿØÖÆÆ÷Application(app/controllers/Application.java)¡£¿ØÖÆÆ÷Öаüº¬Á½¸ö¶¯×÷ºÍÒ»¸ö±íµ¥ÀàRegistration¡£Ò»¸ö¶¯×÷register()ÓÃÓÚÏÔʾע²áÒ³Ãæ£¬ÁíÒ»¸ö¶¯×÷postRegister´¦Àí±íµ¥Ìá½»µÄÐÅÏ¢£¬²¢Ôö¼ÓÏàÓ¦µÄÊý¾Ý¿â¼Ç¼¡£RegistrationÔò¶ÔӦע²áÒ³ÃæËùÏÔʾµÄ±í¸ñ£º

package controllers;

import play.*;
import play.mvc.*;
import play.data.Form;
import play.data.validation.Constraints.*;import models.User;

public class Application extends Controller {
public static class Registration {
@Email
public String email;
@Required
public String password;
}

public static Result register() {
Form<Registration> userForm = Form.form(Registration.class);
return ok(views.html.register.render(userForm));
}

public static Result postRegister() {
Form<Registration> userForm =
Form.form(Registration.class).bindFromRequest();
User user = new User(userForm.get().email, userForm.get().password);
user.save();
return ok("registered");
}
}

register()¶¯×÷ʹÓõÄÄ£°åΪapp/views/register.scala.html:

@(userForm: Form[controllers.Application.Registration])

<!DOCTYPE html>
<html>
<body>
<h1> Registration </h1>
@helper.form(action = routes.Application.postRegister()) {
@helper.inputText(userForm("email"))
@helper.inputPassword(userForm("password"))
<input type="submit">
}
</body>
</html>

ÔÚroutesÖÐΪÁ½¸ö¶¯×÷Ôö¼Ó¶ÔÓ¦µÄURL£º

GET     /register                   controllers.Application.register()
POST /register controllers.Application.postRegister()

·ÃÎÊÒ³Ãæ£º

ÊäÈëÓû§ÃûºÍÃÜÂ룬¿ÉÒÔ¿´µ½Êý¾Ý¿âÖÐÔö¼ÓµÄ¼Ç¼£º

Óû§ÑéÖ¤

½«Óû§ÑéÖ¤µÄÖ÷ÒªÂß¼­·ÅÈ뵽ģÐÍUserÖС£ÐÞ¸ÄUserÀ࣬ΪUserÀàÔö¼Óauthenticate()·½·¨£º

package models;

import javax.persistence.*;
import play.db.ebean.Model;
import org.mindrot.jbcrypt.BCrypt;

@Entity
public class User extends Model {
@Id
private String email;
private String password;

// Constructor
public User(String email, String password) {
String passwordHash = BCrypt.hashpw(password, BCrypt.gensalt());
this.email = email;
this.password = passwordHash;
}

// Query
public static Model.Finder<Integer, User> find =
new Model.Finder<>(Integer.class, User.class);

// Authentification
public static User authenticate(String email, String password) {
User user = find.where()
.eq("email", email)
.findUnique();
if (user == null) {
return user;
} else if (BCrypt.checkpw(password, user.password)) {
return user;
} else {
return null;
}
}
}

authenticate()½ÓÊÕµÄÊÇÃ÷ÎÄÃÜÂë¡£ÉÏÃæµÄÑéÖ¤ÖУ¬Ê×Ïȼì²éÓû§ÓÊÏäÊÇ·ñ´æÔÚ¡£Èç¹û´æÔÚ£¬Ôò¼ì²éÃÜÂëÊÇ·ñ·ûºÏÊý¾Ý¿âµÄ¼Ç¼¡£Èç¹ûÓÊÏä»òÕßÃÜÂë´íÎ󣬽«·µ»Ønull¡£·ñÔò·µ»ØÕýÈ·µÄÓû§¶ÔÏó¡£

ÎÒ½øÒ»²½Ð޸ĿØÖÆÆ÷Application¡£ÕâÒ»´Î»¹ÊÇÔö¼ÓÁ½¸ö¶¯×÷ºÍÒ»¸ö±íµ¥Àà¡£¶¯×÷login()ÓÃÓÚÏÔʾµÇÂ¼Ò³Ãæ£¬¶¯×÷postLogin()ÓÃÓÚ´¦ÀíµÇ¼±íµ¥ÌîдµÄÐÅÏ¢£¬²¢¸ù¾ÝÐÅÏ¢¾ö¶¨ÊÇ·ñµÇÈëÓû§¡£LoginÀà¶ÔÓ¦µÇÂ¼Ò³ÃæµÄ±íµ¥¡£

package controllers;

import play.*;
import play.mvc.*;

import play.data.Form;
import play.data.validation.Constraints.*;

import models.User;

public class Application extends Controller {

public static class Registration {
@Email
public String email;
@Required
public String password;
}


public static Result register() {
Form<Registration> userForm = Form.form(Registration.class);
return ok(views.html.register.render(userForm));
}

public static Result postRegister() {
Form<Registration> userForm =
Form.form(Registration.class).bindFromRequest();
User user = new User(userForm.get().email, userForm.get().password);
user.save();
return ok("registered");
}

public static class Login {
@Email
public String email;
@Required
public String password;

public String validate() {
if (User.authenticate(email, password) == null) {
return "Invalid user or password";
}
return null;
}
}

public static Result login() {
Form<Login> userForm = Form.form(Login.class);
return ok(views.html.login.render(userForm));
}

public static Result postLogin() {
Form<Login> userForm = Form.form(Login.class).bindFromRequest();
if (userForm.hasErrors()) {
return badRequest("Wrong user/password");
} else {
return ok("Valid user");
}
}
}

ÉÏÃæµÄ±íµ¥ÀàLoginÖУ¬Ôö¼ÓÁËvalidate()·½·¨£¬²¢ÔÚÆäÖе÷ÓÃUserµÄÑéÖ¤Âß¼­¡£ÕýÈçpostLogin()ÖÐËùʾ£¬±íµ¥µÄhasErrors()·½·¨½«×Ô¶¯¼ì²évalidate()·½·¨µÄ·µ»ØÖµ¡£Èç¹ûvalidate()·½·¨·µ»ØÎªnull£¬Ôò˵Ã÷±íµ¥ÎÞÎó¡£postLogin()µÄif½á¹¹£¬½«¸ù¾ÝµÇ¼ÊÇ·ñºÏ·¨£¬À´·µ»Ø²»Í¬µÄ½á¹û¡£

ΪÐÂÔöµÄ¶¯×÷Ôö¼Ó¶ÔÓ¦µÄURL£º

GET     /login                      controllers.Application.login()
POST /login controllers.Application.postLogin()

·ÃÎÊ/loginÒ³Ãæ£¬²¢³¢ÊԵǼ¡£

ȇȡ

HTTPЭÒéÊÇÎÞ״̬µÄ¡£¼´Ê¹ÎÒÔÚ/loginµÇ¼³É¹¦£¬µ«ÏÂÒ»´Î·ÃÎÊʱ£¬·þÎñÆ÷ÓÖ»áÍü¼ÇÎÒÊÇË­¡£HTTPЭÒé¿ÉÒÔÓûỰ(Session)µÄ·½Ê½£¬À´¼Ç¼Óû§µÄµÇ¼ÐÅÏ¢¡£ÔڻỰÓÐЧÆÚÄÚ£¬·þÎñÆ÷¿ÉÒÔʶ±ðÏàÓ¦¿Í»§µÄ·ÃÎÊ¡£PlayʵÏֻỰÏ൱·½±ã¡£

Ìá½»µÇ¼±í¸ñʱ£¬Èç¹ûµÇ¼ºÏ·¨£¬ÎÒ½«È÷þÎñÆ÷¿ªÆôºÍ¸Ã¿Í»§µÄ»á»°£¬¼Ç¼¿Í»§µÄÐÅÏ¢¡£Òò´Ë£¬ÐÞ¸ÄpostLogin()Ϊ£º

public static Result postLogin() {
Form<Login> userForm = Form.form(Login.class).bindFromRequest();
if (userForm.hasErrors()) {
return badRequest(views.html.login.render(userForm));
} else {
session().clear();
session("email",userForm.get().email);
return redirect("/");
}
}

ÕâÀïÓû§µÇ¼³É¹¦ºó£¬½«Æô¶¯Ò»¸ö»á»°¡£ÔڻỰÖУ¬¿É·ÅÈë¼üÖµ¶Ô(key-value pair)ÐÎʽµÄÐÅÏ¢¡£ÕâÀïµÄ¼üÃûΪ"email"£¬¶ÔӦֵΪµÇ¼Óû§µÄÓÊÏ䵨ַ¡£µÇ¼³É¹¦ºó½«ÖØÐ¶¨Ïòµ½/¡£

Ôö¼Óindex()¶¯×÷£¬¶ÔÓ¦/ÕâÒ»URL¡£Ôڸö¯×÷ÖУ¬ÎÒµ÷ÓÃsessionÖб£´æµÄÓû§ÐÅÏ¢£º

public static Result index() {
String email = session("email");
if (email != null) {
return ok(email);
} else {
return ok("not login");
}
}

Ôö¼ÓroutesÖжÔÓ¦µÄURL£º

GET     /                           controllers.Application.index()

·ÃÎÊ/login£¬²¢µÇ¼¡£³É¹¦µÇ¼ºóÖØÐ¶¨Ïòµ½/£¬Ò³ÃæÎª£º

¿ÉÒÔ¿´µ½£¬»á»°ÖеÄÐÅÏ¢¿ÉÒÔ³ÖÐøµ½ÒÔºóµÄÒ³Ãæ·ÃÎÊ¡£ÎªÁËÏú»Ù»á»°£¬¿ÉÒÔÔÚij¸ö¶¯×÷Öе÷Óãº

session().clear();
   
5989 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢