ClickでBBS(Pageは極力簡単に・・・)
最終的にこんな感じにしました。
Serviceがstaticなのは、ちょっとダミーにがんばってもらってるだけので気にせずに・・・
package click.bbs.ui.page; import java.util.List; import net.sf.click.control.Form; import net.sf.click.control.HiddenField; import net.sf.click.control.PasswordField; import net.sf.click.control.Radio; import net.sf.click.control.RadioGroup; import net.sf.click.control.Submit; import net.sf.click.control.TextArea; import net.sf.click.control.TextField; import net.sf.click.extras.control.EmailField; import click.bbs.logic.service.BbsService; import click.bbs.logic.vo.Article; import click.bbs.ui.common.CallBackActionBase; public class BbsSimplePage extends net.sf.click.Page { private Form form; private Form deleteForm; private static BbsService service; public BbsSimplePage() { createPostInputForm(); createDeleteForm(); } public boolean onSecurityCheck() { //二重投稿と判断される場合はリダイレクトさせる。 //別に同じ画面でもよいがわかるように別画面 return form.onSubmitCheck(this, "/index.html"); } private void createDeleteForm() { deleteForm = new Form("deleteForm"); PasswordField delPasswordText = new PasswordField("delpassword", "パスワード"); deleteForm.add(delPasswordText); final Submit deleteBtn = new Submit("deleteBtn", "delete"); new CallBackActionBase(deleteBtn) { @Override public boolean actionPerformed() { if(deleteForm.isValid()) { Article article = new Article(); String pass = deleteForm.getFieldValue("delpassword"); article.setPassword(pass); String id = deleteForm.getFieldValue("delid"); article.setId(Integer.parseInt(id)); getBbsService().deleteArticle(article); } setRedirect(BbsSimplePage.class); return true; } }; deleteForm.add(deleteBtn); HiddenField idHidden = new HiddenField("delid", String.class); deleteForm.add(idHidden); addControl(deleteForm); } private void createPostInputForm() { form = new Form("inputForm"); TextField titleText = new TextField("title", "タイトル"); form.add(titleText); TextField nameText = new TextField("name", "名前", true); form.add(nameText); EmailField emailText = new EmailField("email", "e-mail"); form.add(emailText); TextArea messageArea = new TextArea("message", "本文", true); messageArea.setCols(40); messageArea.setRows(10); form.add(messageArea); PasswordField passwordText = new PasswordField("password", "パスワード", true); form.add(passwordText); RadioGroup colorRadio = new RadioGroup("color", "文字色"); Radio colorBlack = new Radio("black", "黒"); Radio colorRed= new Radio("red", "赤"); Radio colorBlue = new Radio("blue", "青"); colorRadio.add(colorBlack); colorRadio.add(colorRed); colorRadio.add(colorBlue); colorRadio.setVerticalLayout(false); colorRadio.setValue(colorBlack.getValue()); form.add(colorRadio); final Submit submitBtn = new Submit("submitBtn", "投稿"); new CallBackActionBase(submitBtn) { @Override public boolean actionPerformed() { if(form.isValid()) { Article aricle = new Article(); form.copyTo(aricle, true); getBbsService().registArticle(aricle); setRedirect(BbsSimplePage.class); } return true; } }; form.add(submitBtn); addControl(form); } private BbsService getBbsService() { synchronized (BbsSimplePage.class) { if(service == null) { service = new BbsService(); } } return service; } public void onRender() { List<Article> result = getBbsService().getAllBbsList(); addModel("result", result); } }
画面はこんなかんじ
<html> <head> <title>$messages.title</title> $imports </head> <h1>$messages.title</h1> $inputForm.startTag() <table> #foreach ($field in $inputForm.fieldList) #if (!$field.hidden) <tr> <td>#if($field.required)<span style="{color:red}">*</span>#end$field.label</td> <td>$field</td> <td style="{color:red}">#if(!$field.valid)$field.error #end</td> </tr> #end #end <tr> <td colspan="3"> #foreach ($button in $inputForm.buttonList) $button #end </td> </tr> </table> $inputForm.endTag() #foreach ($article in $result) <table> <tr> <td>名前</td> <td>$!article.name</td> </tr> <tr> <td>タイトル</td> <td>##$!でnullの場合を空文字で防ぐ $!article.title</td> </tr> <tr> <td>内容</td> <td><textarea rows=10 cols="50" readonly="readonly" style="{color:$article.color}">$!article.message</textarea></td> </tr> <tr> <td>削除</td> <td> ##hiddenの値を変更する。startTag()の前に #set($deleteForm.fields.delid.value=""+$article.id) $deleteForm.startTag() #foreach ($field in $deleteForm.fieldList) #if (!$field.hidden) $field #end #end #foreach ($button in $deleteForm.buttonList) $button #end $deleteForm.endTag() </td> </tr> </table> #end </html>
なんとなくあまりClickの恩恵にあずかってないような完成品となりました。
ネックになるのは、
結果を1行表示にすることがふさわしくないこと
削除用にパスワードを渡さなくてはいけないこと
だと思います。
結構1レコードを複数行で表さなくてはいけないような場合があると思いますが、
そういった際には・・・どうしたらいいんでしょうね?
結構商用だとありません?そういうの?
なんか解決方法あるといいんですが・・・
せっかくなのでもう少し画面遷移を伴うような場合を作ってみたいので
編集機能を付け加えようかとも思います。