摘要:瀏覽和提交評(píng)論博客主頁(yè)現(xiàn)在已經(jīng)完成,接下來(lái)要完成博客正文頁(yè)面。整個(gè)頁(yè)面將展示當(dāng)前文章的所有評(píng)論,還包括一個(gè)用于提交新的評(píng)論的表單。刷新瀏覽器,檢查這次是否使用了正確的。給模板添加表單在后面試下提交新的評(píng)論。
瀏覽和提交評(píng)論
博客主頁(yè)現(xiàn)在已經(jīng)完成,接下來(lái)要完成博客正文頁(yè)面。整個(gè)頁(yè)面將展示當(dāng)前文章的所有評(píng)論,還包括一個(gè)用于提交新的評(píng)論的表單。
創(chuàng)建"show" action要顯示文章內(nèi)容,我們需要在Application控制器添加新的action。就叫它show():
public static void show(Long id) { Post post = Post.findById(id); render(post); }
如你所見(jiàn),整個(gè)action簡(jiǎn)明扼要。我們接受一個(gè)id參數(shù)作為L(zhǎng)ong類型Java對(duì)象。而這個(gè)參數(shù)可以來(lái)自于URL路徑或HTTP請(qǐng)求正文。
如果接收到的id參數(shù)不是有效的數(shù)字,id的值會(huì)是null,而Play會(huì)在errors容器中新增一個(gè)驗(yàn)證錯(cuò)誤。
這個(gè)action會(huì)顯示/yabe/app/views/Application/show.html模板:
#{extends "main.html" /} #{set title:post.title /} #{display post:post, as:"full" /}
因?yàn)橹皩?xiě)好了display標(biāo)簽,寫(xiě)這個(gè)頁(yè)面就變得簡(jiǎn)單。
給正文頁(yè)面添加鏈接在display標(biāo)簽中,我們讓所有的鏈接保持為空(使用#)。是時(shí)候讓這些鏈接指向Application.show action。在Play模板中,你可以簡(jiǎn)單地用@{...}記號(hào)來(lái)創(chuàng)建鏈接。這個(gè)語(yǔ)法使用路由來(lái)“轉(zhuǎn)換”URL成對(duì)應(yīng)的action。
修改/yabe/app/views/tags/display.html標(biāo)簽:
…${_post.title}
…
現(xiàn)在刷新主頁(yè),點(diǎn)擊一個(gè)標(biāo)題來(lái)展示正文。
呃……好像缺了個(gè)返回主頁(yè)面的鏈接。修改/yabe/app/views/main.html模板來(lái)完成標(biāo)題鏈接:
… …
現(xiàn)在終于可以在主頁(yè)和正文之間切換了。
指定一個(gè)更語(yǔ)義化的URL如你所見(jiàn),正文頁(yè)面的URL是:
/application/show?id=1
這是因?yàn)镻lay的默認(rèn)路由規(guī)則就是這樣:
* /{controller}/{action} {controller}.{action}
通過(guò)指定Application.show action的路徑,我們可以使用更語(yǔ)義化的URL。修改/yabe/conf/routes并在第一個(gè)路由下面添加新的路由:
GET /posts/{id} Application.show
這里id參數(shù)將從URL路徑提取。你可以從Route File Syntax中閱讀更多關(guān)于URI模式的內(nèi)容。
刷新瀏覽器,檢查這次是否使用了正確的URL。
添加分頁(yè)要允許用戶在文章間方便地流連忘返,我們需要添加分頁(yè)機(jī)制。我們將拓展Post類來(lái)按需獲取上一篇和下一篇文章:
public Post previous() { return Post.find("postedAt < ? order by postedAt desc", postedAt).first(); } public Post next() { return Post.find("postedAt > ? order by postedAt asc", postedAt).first(); }
這個(gè)方法在每次請(qǐng)求時(shí)都會(huì)被多次調(diào)用,所以可以優(yōu)化它們,不過(guò)現(xiàn)在先擱置。同時(shí),在show.html模板頂部(在#{display/}標(biāo)簽前)添加分頁(yè)鏈接:
現(xiàn)在是不是更棒了?
添加評(píng)論表單是時(shí)候開(kāi)始完成評(píng)論表單。先從在Application控制器中增加postComment action方法開(kāi)始。
public static void postComment(Long postId, String author, String content) { Post post = Post.findById(postId); post.addComment(author, content); show(postId); }
如你所見(jiàn),我們只是重用了之前添加給Post類的addComment()。
給show.html模板添加HTML表單(在#{display /}后面):
Post a comment
#{form @Application.postComment(post.id)}
#{/form}
試下提交新的評(píng)論。它應(yīng)該能工作。
添加驗(yàn)證目前我們沒(méi)有在創(chuàng)建評(píng)論之前驗(yàn)證表單內(nèi)容。我們需要驗(yàn)證表單中包括Comment類構(gòu)造函數(shù)中的每個(gè)參數(shù)。有了Play的驗(yàn)證機(jī)制,添加驗(yàn)證只是小菜一碟。修改postComment action來(lái)加入@Required驗(yàn)證注解,并檢查有沒(méi)有錯(cuò)誤產(chǎn)生:
public static void postComment(Long postId, @Required String author, @Required String content) { Post post = Post.findById(postId); if (validation.hasErrors()) { render("Application/show.html", post); } post.addComment(author, content); show(postId); }
也不要忘了引入play.data/validation.*
如你所見(jiàn),如果發(fā)生驗(yàn)證錯(cuò)誤,我們重新輸出正文頁(yè)面。我們需要修改表單代碼來(lái)顯示錯(cuò)誤信息:
Post a comment
#{form @Application.postComment(post.id)} #{ifErrors}All fields are required!
#{/ifErrors}
#{/form}
注意到我們重用已經(jīng)提交的參數(shù)來(lái)填充HTML input元素的值。
為了讓博客的用戶體驗(yàn)更優(yōu),我們將添加一點(diǎn)Javascript來(lái)自動(dòng)聚焦到發(fā)生錯(cuò)誤的地方。首先,需要JQuery和JQuery Tools Expose,你得把它們引入進(jìn)來(lái)。下載這兩個(gè)庫(kù)到yabe/public/javascripts/文件夾,并修改main.html模板來(lái)引入它們:
…
注意當(dāng)前版本的Play內(nèi)置的JQuery要比教程用到的新。
現(xiàn)在你可以在show.html模板底部添加這段代碼:
現(xiàn)在評(píng)論框看起來(lái)真的美極了。我們還有加多兩樣?xùn)|西。
首先,我們將在評(píng)論成功提交之后顯示一個(gè)成功信息。為此,我們需要使用flash作用域來(lái)允許我們從一個(gè)action調(diào)用傳遞信息到下一個(gè)action。
修改postComment來(lái)添加成功信息:
public static void postComment(Long postId, @Required String author, @Required String content) { Post post = Post.findById(postId); if(validation.hasErrors()) { render("Application/show.html", post); } post.addComment(author, content); flash.success("Thanks for posting %s", author); show(postId); }
并在show.html頂部添加可能顯示成功信息的位置:
… #{if flash.success}${flash.success}
#{/if} #{display post:post, as:"full" /} …
最后我們將修改postComment action所用的URL。因?yàn)槲覀儧](méi)有給它指定路由,現(xiàn)在它用的是默認(rèn)的路由。所以在應(yīng)用的路由文件中添加下面一行:
POST /posts/{postId}/comments Application.postComment
終于完成了。記得把改動(dòng)提交到bazaar。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64101.html
摘要:設(shè)置驗(yàn)證碼任何人都可以在我們的博客下發(fā)布評(píng)論,所以我們需要避免非人類用戶來(lái)擾亂秩序。一個(gè)簡(jiǎn)單的防范方法是設(shè)置驗(yàn)證碼。然后我們修改表單來(lái)顯示驗(yàn)證碼,并把寫(xiě)入隱藏的域里面。檢查驗(yàn)證碼功能是否完成了。 設(shè)置驗(yàn)證碼 任何人都可以在我們的博客下發(fā)布評(píng)論,所以我們需要避免非人類用戶來(lái)擾亂秩序。一個(gè)簡(jiǎn)單的防范方法是設(shè)置驗(yàn)證碼。 生成驗(yàn)證碼 如何利用Play框架來(lái)生成驗(yàn)證碼?簡(jiǎn)單來(lái)說(shuō),我們需要增...
摘要:所以任務(wù)會(huì)在第一個(gè)請(qǐng)求時(shí)同步執(zhí)行。修改來(lái)展示這些對(duì)象你可以閱讀模板是怎么工作的。標(biāo)簽只有兩個(gè)參數(shù)用于展示的文章對(duì)象以及展示的模式可以是全文,全文附評(píng)論,預(yù)告中的一種現(xiàn)在我們可以將冗余代碼替換成標(biāo)簽,重寫(xiě)主頁(yè)重載頁(yè)面,檢查是否一切安好。 建立第一個(gè)頁(yè)面 既然我們完成了數(shù)據(jù)模型的初步定義,是時(shí)候開(kāi)始創(chuàng)建應(yīng)用的頁(yè)面了。這個(gè)頁(yè)面將僅僅展示最近的博文,以及一個(gè)舊文章的列表。 下面是我們想要實(shí)...
摘要:數(shù)據(jù)模型的首次迭代接下來(lái)我們要開(kāi)始完成我們的博客引擎的模型部分。一個(gè)普遍的選擇是使用關(guān)系型數(shù)據(jù)庫(kù)。不要認(rèn)為生成的成員變量是函數(shù)變量,其實(shí)它是技術(shù)變量。當(dāng)你在中運(yùn)行應(yīng)用時(shí),會(huì)自動(dòng)切換到框架并加載對(duì)應(yīng)的。再次運(yùn)行測(cè)試并檢查是否一切安好。 數(shù)據(jù)模型的首次迭代 接下來(lái)我們要開(kāi)始完成我們的博客引擎的模型部分。 JPA入門(mén) 模型層是一個(gè)Play應(yīng)用的核心(對(duì)于其他Web框架也同樣成立)。它是...
摘要:通過(guò)來(lái)實(shí)現(xiàn)一個(gè)基本的管理面板目前,我們還沒(méi)法使用博客的來(lái)寫(xiě)新的文章,或修改評(píng)論。提供了一個(gè)即開(kāi)即用的模塊,可以快速生成一個(gè)基本的管理面板。這是因?yàn)槟J(rèn)是以的輸出來(lái)得到一個(gè)模型對(duì)象的表示。在本教程的最后一章,你會(huì)學(xué)到關(guān)于本地化信息的更多東西。 通過(guò)CRUD來(lái)實(shí)現(xiàn)一個(gè)基本的管理面板 目前,我們還沒(méi)法使用博客的UI來(lái)寫(xiě)新的文章,或修改評(píng)論。Play提供了一個(gè)即開(kāi)即用的CRUD模塊,可以快速...
摘要:國(guó)際化和本地化完成了博客引擎后,我們來(lái)考慮額外的一件事應(yīng)用的國(guó)際化和語(yǔ)言的本地化。國(guó)際化和本地化我們將分兩步討論,先是國(guó)際化,再是本地化。實(shí)際上,兩者是同步進(jìn)行的你在國(guó)際化的同時(shí),往往也是在本地化。 國(guó)際化和本地化 完成了博客引擎后,我們來(lái)考慮額外的一件事:Web應(yīng)用的國(guó)際化和語(yǔ)言的本地化。雖然我們可以一開(kāi)始就做這件事,但是最好還是先完成該應(yīng)用的單一語(yǔ)言版本,然后再添加其他語(yǔ)言的支持...
閱讀 2755·2021-10-09 09:44
閱讀 3561·2019-08-30 15:54
閱讀 2171·2019-08-30 14:16
閱讀 2803·2019-08-30 13:09
閱讀 835·2019-08-30 13:08
閱讀 1295·2019-08-29 16:29
閱讀 1681·2019-08-26 13:57
閱讀 1938·2019-08-26 13:53