2010/01/28

Play!(2-2)

資料的作成和保存

那麼、為MsgData類別準備一個新的應用程式吧,在這裡準備了一個「add」的動作。首先先製作好模板。「views」裡的「Application」內新增一個新的「add.html」文件,然後將如下內容加入:

#{extends 'main.html' /}
#{set title:'Home' /}
<h1>メッセージの作成</h1>
${msg}
<form method="post" action="@{Application.add}">
<table>
        <tr><td>name:</td><td><input type="text" id="name" name="name" /></td></tr>
        <tr><td>message:</td><td><input type="text" id~"message" name="message" /></td></tr>
        <tr><td></td><td><input type="submit" value="送信" /></td></tr>
</table>
</form>

這次準備了name和message這兩個輸入欄位,傳送目地指定為action="@{Application.add}"。這樣一來我們知道只要在Application類別裡準備好add方法就可以了。

這樣子模板就完成了,可是只有這樣子似乎讓人覺得少了些什麼、那麼讓我們使用Stylesheet吧。Play!裡像Stylesheet這樣的靜態檔案是配置在「public」資料夾內。在這裡面有個名為「stylesheets」的資料夾,在裡面作成一個「main.css」文件。這個是使用標準作成的Stylesheet的文件檔。把這個打開之後,加入下面的內容:

body {
        font-size:10pt;
        background-color:#F6FFFF;
        color:#003366;
}
h1 {
        font-size:12pt;
        background-color:#CCDDFF;
        padding: 3px;
}

因為這是Stylesheet,內容可以因人而異,請自己適當的調整。

那麼,接下來來製作Controller。來定義Application類別裡的add方法吧。

public static void add(String message,String name){
        String msg = "Please input data";
        if (request.method.equals("POST")) {
                MsgData data = new MsgData(message,name);
                data.save();
                msg = "data is saved";
        }
        render(msg);
}

這樣子就完成了。嘗試著存取http://localhost:9000/application/add看看就會表示出一個表單,在這裡面輸入值然後傳送的話,資料就會被保存起來(只是還沒顯示)。每次位置都得要輸入/application/add讓人覺得有點麻煩、所以我們在「routes」檔案裡加入下面這行內容:


* /{action} Application.{action}


這樣一來、Application類別的動作方法就全部都被映射到根目錄了。以後想要呼叫add的話就用http://localhost:9000/add

add方法的流程

那麼,來看看這裡的處理過程吧。首先、方法add(String message, String name)就像這樣有引數被設定好,
以動作方法而言,被送出的參數會將值交給同名的變數。這樣一來從表單送出的message和name的值就能作為引數取得

request.method.equals("POST")是為了要確認是否是POST送出,true的話就將MsgData保存到資料庫裡


MsgData data = new MsgData(message,name);
data.save();



這裡就連說明都不用說明了。用new MsgData來作成實例,然後呼叫出「save」方法。這樣一來MsgData的實例就被保存
在資料庫裡了。這就是Model類別的威力。為了將Model保存到資料庫的具體程式碼完全都不需要特別敘述什麼。

原文參考:http://codezine.jp/article/detail/4751?p=2

No comments:

Post a Comment