2010/01/31

Play!(2-3)

展現資料


那麼來展現我們已經儲存的資料吧,這要修改index動作來達成。首先先修正動作方法。

public static void index() {
        List<msgdata> datas = MsgData.findAll();
        render(datas);
}

非常的簡單。要取得MsgData的全部資料,只要呼叫「findAll」這個方法就可以了。這將MsgData的實例作為List將值返回。
這裡將datas這個變數交由render的引數呼叫出來。之後在模板那一邊只要從datas順序取出MsgData,然後將必要的值顯
示出來就好。修改index.html如下:

#{extends 'main.html' /}
#{set title:'Home' /}
<h1>Message List</h1>
#{list items:datas, as:'data'}
    <li>${data.id}: ${data.message}(${data.name})</li>
#{/list}

在這裡的#{list itmes:datas, as:'data'}~#{/list}的部份,從datas順序取出的值設定為data這個變數,
然後重複的執行。語法就像下面這樣的型態。

#{list items:$Container, as:'$var'}

items:的後面的$Container指定收納的容器名稱,這樣一來就會從裡面順序取出物件,並代入用as:指定的變數$var,
不斷重複直到#{/list}為止的處理。因為取出的值為MsgData的實例,所以${data.message}可以寫出message欄位
的值。

話說回來,再更清楚的來看,最一開始寫著${data.id}。這是寫出實例的「id」的值。但是想一下卻發現MsgData並沒有準
備id這個欄位才對。

因為這個id欄位是Model類別自動追加的特別欄位,所有的MsgData實例都有事先準備好這個id,自動分配給每個人唯一
的id值。簡單來說就是「自動生成的主鍵」。

資料的查詢


要取出所有的資料只要用findAll就能簡單的做到,但是符合特定的條件的搜索時要該怎麼辦呢。改寫剛才的index,使用
name來檢索看看吧。

#{extends 'main.html' /}
#{set title:'Home' /}
<h1>Message List/h1>
<form method="post" action="@{Application.index}">
name:<input type="text" name="name" />
<input type="submit" value="Submit" />
</form>
<hr />
#{list items:datas, as:'data'}
    <li>${data.id}: ${data.message}(${data.name})</li>
#{/list}

修改index.html,加入表單。在這裡輸入name送出,藉由這個來最資料的搜索然後表示。那麼、來修改index方法吧。

public static void index(String name) {
        List<msgdata> datas = null;
        if (request.method.equals("POST")) {
                datas = MsgData.find("name like ?", "%" + name + "%").fetch();
        } else {
                datas = MsgData.findAll();
        }
        render(datas);
}

這樣一來就完成了。從瀏覽器存取index,輸入名字然後送出看看吧。只有含有這個名字的資料會被搜尋出來。這裡如果被
POST送出後,會用下面這樣來取得資料。

datas = MsgData.find("name like ?", "%" + name + "%").fetch();

「find」透過引數,實際上是生成為了要從資料庫中取得資料的JPAQuery實例。這裡的從JPAQuery呼叫出「fetch」方法,
將資料作為List來取得。

find使用"name like ?"簡單的詢問作為第一個引數,這個?的部份裡、第2引數的"%"+name+"%"被埋在裡面。
也就是說、"name like %$text%"使用這樣的方法被實行。

這雖然跟SQL的語法相似,但是select什麼的並不需要被使用。這就是「JPQL詢問」,透過JPA使用的簡單語法。
可能會想說「雖然說不用SQL語法,結果還不是不得用相似的東西來寫嘛」,確實是這樣沒錯,可以看出Model部份
的實裝還不是很完全。資料的作成和修正、消除等雖然只是用方法呼叫出來,但是有關詳細的檢索還是得需要寫類似
SQL語法的部份還是有的。

雖然這樣,如果有單純「這個屬性值=檢查值」這樣簡單的檢索的話,像搜索一般的搜索語法也不需要了,只要簡單的輸入
「find(屬性、值)」就足夠了。請想也只有在要一些細節設定的搜索語句時才需要寫它們就好了。

No comments:

Post a Comment