(九)play之yabe項目【發表博文】

發表一篇博文html

 

填充管理頁面java

從主頁連接到管理頁面時,只簡單顯示了登錄用戶的名稱數據庫

如今對顯示的內容加以豐富session

修改Admin中的index()mvc

Java代碼   收藏代碼
  1. package controllers;  
  2.   
  3. import java.util.List;  
  4.   
  5. import models.Post;  
  6. import models.User;  
  7. import play.mvc.Before;  
  8. import play.mvc.Controller;  
  9.   
  10. public class Admin extends Controller {  
  11.       
  12.     /** 
  13.      * 首先,用戶登錄會被Security攔截,登錄成功會把username放入session中 
  14.      * session.put("username",username); 
  15.      * 經過session.contains("username");判斷用戶是否已經登錄 
  16.      *  
  17.      * @Before 訪問Admin控制器時,將先執行由該註解標註的方法,進行攔截(過濾/檢查) 
  18.      */  
  19.     @Before  
  20.     static void setConnectedUser() {  
  21.         //Security.isConnected() 檢查session中是否有username爲key的map存在  
  22.         //由於用戶登錄後會用username做爲key存儲登錄信息  
  23.         if(Security.isConnected()) {  
  24.             //Security.connected() 取得session中以username爲key的value,即用戶名  
  25.             User user = User.find("byUsername", Security.connected()).first();  
  26.             renderArgs.put("user", user.fullname);  
  27.         }  
  28.     }  
  29.       
  30.     /** 
  31.      * 返回管理CRUD功能模塊的主頁面 
  32.      * 查詢屬於當前登錄用戶的博文 
  33.      * 傳遞到admin/index.html頁面進行顯示 
  34.      */  
  35.     public static void index(){  
  36.         String username = Security.connected();  
  37.         //Post對象的author屬性爲User類型  
  38.         List<Post> posts = Post.find("author.username", username).<Post>fetch();  
  39.         render(posts);  
  40.     }  
  41.       
  42.       
  43.       
  44. }  

 

一樣,編輯yabe\app\views\Admin\index.html,對新增內容進行顯示app

Html代碼   收藏代碼
  1. #{extends 'admin.html' /}  
  2.   
  3. <!-- 顯示用戶及其發佈的博文數量 -->  
  4. <h3>  
  5.     Welcome ${user},  
  6.     <span>  
  7.         you have written   
  8.             ${posts.size() ?: 'no'}  
  9.                 ${posts.pluralize('post','posts')}  
  10.                     so far!  
  11.     </span>  
  12.     <!-- posts.pluralizer(x,y) : posts的size爲單數,則返回x,不然返回y-->    
  13. </h3>  
  14.   
  15.   
  16. <!-- 循環posts,分別顯示每一個博文 -->  
  17. #{list items:posts, as:'post'}  
  18.     <class="post ${post_parity}">  
  19.         <href="#">${post.title}</a>  
  20.     </p>  
  21. #{/list}  
  22.   
  23.   
  24. <!-- 建立新的博文 -->  
  25. <id="newPost">  
  26.     <href="#"><span>+</span>write a new post</a>  
  27. </p>  

 

進入管理頁面http://localhost:9000/admin/index框架

顯示了當前博主發佈博文狀況,以及發佈新博文的按鈕post



 

 

發表一篇博文fetch

三步:this

 建立Controller,或在Controller中加入action

 給action配置路由

編寫action對應的模板

在Admin中編寫action,一個用於返回一個form表單;一個用於接收form提交的參數

 

Java代碼   收藏代碼
  1. /** 
  2.  * 返回form的頁面 
  3.  */  
  4. public static void form() {  
  5.     render();  
  6. }  
  7.   
  8. /** 
  9.  * 接收form提交的數據並處理 
  10.  */  
  11. public static void save(String title, String content) {  
  12.     //current login user  
  13.     User author = User.find("byUsername", Security.connected()).first();  
  14.       
  15.     //new post  
  16.     Post post = new Post(title, content, author);  
  17.       
  18.     //Validate  
  19.     validation.valid(post);  
  20.     if(validation.hasErrors()) {  
  21.         //一種簡寫,等效於 render("Admin/form.html",post);  
  22.         render("@form",post);  
  23.     }  
  24.       
  25.     //Save object  
  26.     post.save();  
  27.     index();  
  28. }  

 

 

配置路由

 

Html代碼   收藏代碼
  1. #form  
  2.   
  3. #open a form page use get method  
  4. GET     /admin/new      Admin.form  
  5.   
  6. #submit form use post method  
  7. POST            /admin/new      Admin.save  

   

 

 

編寫模板-form表單

 

Html代碼   收藏代碼
  1. #{extends 'admin.html' /}  
  2.   
  3. <h3>Write,<span>a new post</span></h3>  
  4.   
  5. #{form @save()}  
  6.     #{ifErrors}  
  7.         <class="error">  
  8.             Please correct these errors.  
  9.         </p>  
  10.     #{/ifErrors}  
  11.       
  12.     <p>  
  13.         #{field 'title'}  
  14.             <label>Post title:</label>  
  15.             <input type="text" name="${field.name}" value="${post?.title}" />  
  16.             <span class="error">#{error 'post.title' /}</span>  
  17.         #{/field}  
  18.     </p>  
  19.       
  20.       
  21.     <p>  
  22.         #{field 'content'}  
  23.             <label>Write here:</label>  
  24.             <textarea name="${field.name}">${post?.content}</textarea>  
  25.             <span class="error">#{error 'post.content' /}</span>  
  26.         #{/field}  
  27.     </p>  
  28.       
  29.       
  30.     <p>  
  31.         <input type="submit" value="Publish this post to the blog" />  
  32.     </p>  
  33. #{/form}  

 

刷新頁面,點擊建立一個新的博文



 



 

 

 

 

 

修改admin/index.html,爲每一個博文設置連接

注意:這裏須要傳入博文的id,以便後臺查詢出該博文的全部信息,再返回Post對象給頁面進行顯示

Java代碼   收藏代碼
  1. <!-- 循環posts,分別顯示每一個博文 -->  
  2. #{list items:posts, as:'post'}  
  3.     <p class="post ${post_parity}">  
  4.         <a href="@{Admin.form(post.id)}">${post.title}</a>  
  5.     </p>  
  6. #{/list}  

  

修改Admin控制器中的form(),接收id參數

若是id != null ,表示數據庫中已經存在此博文,能夠查詢出來

用於頁面的回顯

Java代碼   收藏代碼
  1. /** 
  2.  * 返回form的頁面 
  3.  * 初次建立博文,id爲空,不返回對象 
  4.  * id不爲空,則查詢出對象,傳遞到頁面用做數據回顯 
  5.  */  
  6. public static void form(Long id) {  
  7.     if(id!=null) {  
  8.         Post post = Post.findById(id);  
  9.         render(post);  
  10.     }  
  11.     render();  
  12. }  

 

修改路由,定製更好看的URL

http://localhost:9000/admin/new?id=6

增長路由

Html代碼   收藏代碼
  1. #open a form page use get method  
  2. GET     /admin/myPosts/{id} Admin.form  
  3. GET     /admin/new      Admin.form  

第1條路由:若是一個id參數被提交,將使用第1條路由模式顯示URL=== myPosts/6

第2條路由:若是沒有id參數被提交,則使用舊的模式顯示URL=== new?id=6

 

以後,URL變爲了這種格式:http://localhost:9000/admin/myPosts/6

 

 

 

 

 區分建立與編輯

如今還存在一個問題,新建博文沒有問題了

可是,編輯已經存在的博文,保存以後系統會自動將其做爲一個新的博文進行發佈,而不是更新

所以,須要在form()中加入判斷邏輯:

若是已經存在id了,則更新;不然做爲新的博文進行保存!

 

修改Admin控制器的save(),處理建立與編輯兩種狀況

Java代碼   收藏代碼
  1. /** 
  2.      * 接收form提交的數據並處理 
  3.      * 增長id參數,由頁面傳遞過來 
  4.      * 經過id參數是否爲空,判斷是新建保存仍是編輯保存 
  5.      */  
  6.     public static void save(Long id, String title, String content) {  
  7.         Post post = null;  
  8.         if(id==null) {  
  9.             //建立  
  10.             User author = User.find("username", controllers.Secure.Security.connected()).first();  
  11.             post = new Post(title, content, author);  
  12.         } else {  
  13.             //更新---取出已有對象,更新其內部屬性並同步到數據庫  
  14.             post = Post.findById(id);  
  15.             post.title = title;  
  16.             post.content = content;  
  17.         }  
  18.           
  19.         //Validate  
  20.         validation.valid(post);  
  21.         if(validation.hasErrors()) {  
  22.             //一種簡寫,等效於 render("Admin/form.html",post);  
  23.             render("@form",post);  
  24.         }  
  25.           
  26.         //Save object  
  27.         post.save();  
  28.         index();  
  29.     }  

 

 

修改form.html模板,加入建立與編輯的不一樣顯示,同時增長id參數的傳遞

以便後臺判斷是新建仍是編輯已有博文

Html代碼   收藏代碼
  1. #{extends 'admin.html' /}  
  2. <!--   
  3.     判斷post對象id是否爲空  
  4.     id==null,則新建博文  
  5.     id!=null,則編輯博文  
  6.  -->  
  7. #{ifnot post?:id}  
  8.     <h3>Write,<span>a new post</span></h3>  
  9. #{/if}  
  10. #{else}  
  11.     <h3>Edit,<span>this post</span></h3>  
  12. #{/else}  
  13.   
  14. <!-- 把id傳到 Admin控制器的save action中 -->  
  15. #{form @save(post?.id)}  
  16.     #{ifErrors}  
  17.         <class="error">  
  18.             Please correct these errors.  
  19.         </p>  
  20.     #{/ifErrors}  
  21.       
  22.     <p>  
  23.         #{field 'title'}  
  24.             <label>Post title:</label>  
  25.             <input type="text" name="${field.name}" value="${post?.title}" />  
  26.             <span class="error">#{error 'post.title' /}</span>  
  27.         #{/field}  
  28.     </p>  
  29.       
  30.       
  31.     <p>  
  32.         #{field 'content'}  
  33.             <label>Write here:</label>  
  34.             <textarea name="${field.name}">${post?.content}</textarea>  
  35.             <span class="error">#{error 'post.content' /}</span>  
  36.         #{/field}  
  37.     </p>  
  38.       
  39.       
  40.     <p>  
  41.         <input type="submit" value="Publish this post to the blog" />  
  42.     </p>  
  43. #{/form}  

 

 

點擊建立一個新的博文



 

 

點擊一個已存在的博文


 

一樣,將編輯博文的URL路徑顯示風格進行改變

修改routes文件

帶id參數提交時的將使用第1條路由,不帶參數則按第2條路由顯示URL

Java代碼   收藏代碼
  1. #submit form use post method  
  2. POST    /admin/myPosts/{id} Admin.save  
  3. POST    /admin/new      Admin.save  

  

 建立新的博文,保存時的URL使用第1條路由:

 http://localhost:9000/admin/myPosts/1 (POST提交)

 

 編輯已存在的博文,保存時的URL使用第2條路由:

http://localhost:9000/admin/new (POST提交)

相關文章
相關標籤/搜索