いろいろ
- 記事の取得はonInitではなく、onRenderの方がよさそう。そうしないと投稿時に取得してからインサートとなる
- Formの値のクリアのいい方法はないかなと
- フィールドの名前に「name」を使用すると、hiddenで込められる、form_nameと値が一致するので避けた方がいいと思う。もちろんFormの名前を「form」ではない名前に変更しても避けられます。
入力エラー時のリンクでフォーカスが移動しないなどいう場合は名前が衝突しています。きっと。
- 一部だけ行単位で制御するのは結構難しい。たとえば、本文欄にのみ投稿した文字色で。。。となると・・・どうなる?今は値のColumnにstyle埋め込んでるけど、きっと、getMessageの結果をhtmlタグで装飾して、Tableに渡すとかになりそうだよね・・・
最終的なPage
package click.bbs.ui.page; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sf.click.control.Column; import net.sf.click.control.Field; 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.Table; import net.sf.click.control.TextArea; import net.sf.click.control.TextField; import net.sf.click.extras.control.EmailField; import net.sf.click.util.HtmlStringBuffer; import click.bbs.logic.service.BbsService; import click.bbs.logic.vo.Article; public class BbsPage extends net.sf.click.Page { private Form form = null; private List articles; private Form deleteForm = new Form("deleteForm"); private Table outerTable = new Table("parent"){ protected void renderHeaderRow(HtmlStringBuffer buffer) { //ヘッダは表示させないように修正 } }; public BbsPage(){ createPostInputForm(); //外側のテーブルの編集 createArticleListTable(); //deleteForm createDeleteForm(); } private void createDeleteForm() { PasswordField delPasswordText = new PasswordField("delpassword", "パスワード", true); deleteForm.add(delPasswordText); Submit deleteBtn = new Submit("deleteBtn", "delete"); deleteForm.add(deleteBtn); HiddenField idHidden = new HiddenField("delid", String.class); deleteForm.add(idHidden); addControl(deleteForm); } private void createArticleListTable() { Column column = new Column("child"); column.setEscapeHtml(false); outerTable.addColumn(column); outerTable.setPageSize(2); //isi,its,mars,simple,nocol,report outerTable.setAttribute("class", "simple"); addControl(outerTable); } 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); Submit submitBtn = new Submit("submitBtn", "投稿"); form.add(submitBtn); addControl(form); } @Override public void onInit() { } private void clearForm() { List fieldList = form.getFieldList(); for (Iterator iter = fieldList.iterator(); iter.hasNext();) { Field element = (Field) iter.next(); element.setValue(null); } } _/** * Bbsサービスオブジェクトを返す。 * @return Bbsロジッククラス */ BbsService getBbsService() { return new BbsService(); } @Override public void onGet() { } @Override public void onPost() { BbsService bbsService = getBbsService(); if(form.getFieldValue("submitBtn").length() != 0) { Article article = new Article(); form.copyTo(article, true); bbsService.registArticle(article); clearForm(); } else if(deleteForm.getFieldValue("deleteBtn").length() != 0) { String id = deleteForm.getFieldValue("delid"); String pass = deleteForm.getFieldValue("delpassword"); Article article = new Article(); article.setId(Integer.parseInt(id)); article.setPassword(pass); //パスワードのクリア deleteForm.getField("delpassword").setValue(null); bbsService.deleteArticle(article); } } @Override public void onRender() { loadAllArticles(); List<Map> articleTableList = new ArrayList<Map>(); for (Iterator iter = articles.iterator(); iter.hasNext();) { Article article = (Article) iter.next(); String table = createArticleTable(article); Map<String, String> map = new HashMap<String, String>(); map.put("child", table); articleTableList.add(map); } outerTable.setRowList(articleTableList); } private String createArticleTable(Article article) { Table table = new Table("child"); table.addColumn(new Column("koumoku")); Column valueColumn = new Column("atai"); valueColumn.setEscapeHtml(false); valueColumn.setAutolink(true); //メッセージだけにする場合はコメントアウト valueColumn.setAttribute("style", "{color:"+ article.getColor() + ";}"); table.addColumn(valueColumn); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); list.add(createArticleRow("たいとる", article.getTitle())); list.add(createArticleRow("名前", article.getName())); _/* メッセージだけ文字装飾する場合これでいいかな? HtmlStringBuffer sb = new HtmlStringBuffer(); sb.append("<font color=\"" + article.getColor() + "\">"); sb.append(article.getMessage()); sb.append("</font>"); list.add(createArticleRow("メッセージ", sb.toString())); */ list.add(createArticleRow("メッセージ", article.getMessage())); Field idHidden = deleteForm.getField("delid"); idHidden.setValue(String.valueOf(article.getId())); list.add(createArticleRow("削除", deleteForm.toString())); list.add(createArticleRow("メール", article.getEmail())); table.setRowList(list); return table.toString(); } private Map<String, Object> createArticleRow(String label, Object value) { Map<String, Object> row = new HashMap<String, Object>(); row.put("koumoku", label); row.put("atai", value); return row; } private void loadAllArticles() { BbsService logic = getBbsService(); //DAOとの接続に失敗した場合はIllegalStateExceptionが発生 articles = logic.getAllBbsList(); } }
具体的にはサービス以降はダミーだけど
とりあえずこれで終了。
あとは、Pageをシンプルに、テンプレートでがんばる方でやってみようと思います。
きっとこっちの方が簡単だろうなぁと。
・・・CallBackActionBase使用していない。。。。。
clickExampleがサーバに乗ってくれない・・・
Java6がどうこう言われるんですが・・・