ku-sukeのブログ

Just another hatena blog

SAStrutsでなんか作ってみる。

明日は東京のほうでseasarの集まりがあるんですね。うちの会社の東京の人も見に行くのかなー。

dewaさんがカンファレンス中でデモをするってLLみたいな芸当をやるので、僕もダイアリー書きながらできるかな。

ブックマークサイトつくってみる。

  • まったく何も考えずに作る。
  • 必要なDBはUSERとBOOKMARKくらい?
  • phpMyAdminを使う。xamppにはいってるやつ。
 CREATE TABLE `sabook`.`bookmark` (
`ID` INT( 8 ) NOT NULL ,
`URL` VARCHAR( 255 ) NOT NULL ,
`COMMENT` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`TIMESTAMP` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY ( `ID` )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_bin 

うん。いろいろ足りないけど、ちょっとづつ作る感じでOK

Struts.configの追加

は、いりません。

初期画面をつくる。IndexActionね。よくわからんねんけど、まずは画面から作る。
index.vm velocity文法忘れたのでまずはダミーで。

<html>
<head>
  <title>SABook</title>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
  #errorMarkup()
  <h1>SABoooooook!!!</h1>

登録済みのブックマーク一覧:
<hr />
<!-- foreachかくよてい -->
<div>
 <p><a href="http://example.com/sameurl/">ページタイトル</a>: http://example.com/sameurl/</p>
 <p>ここにコメントが入る予定。</p>
</div>
</body>
</html>

indexAction

package com.kusuke.action;

import org.seasar.struts.annotation.Execute;

public class IndexAction {

	@Execute(validator = false)
	public String index() {
		return "index.vm";
	}

}

うん。なにもない。おまけにEclispeの設定がcp932だったから文字化けした。
http://localhost:8080/sa-struts-wtp/
にアクセスしたら無事表示できた〜

トップページに一覧表示を作る前に、登録画面を作ろう。

はてブっぽく、エントリポイント名はentryにしよう。

entry.vm

<html>
<head>
  <title>SABook</title>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
  #errorMarkup()
  <h1>SABoooooook!!!</h1>

ブックマークを登録します:
<hr />
<form name="EntryActionForm" method="POST">
 <p>ページタイトル: <input type="text" name="title" value="" /></p>
 <p>URL: <input type="text" name="url" value="" /></p>
 <p>コメント: <input type="text" name="comment" value="" /></p>
 <p><input type="submit" name="result" value=" 登録する " /></p>
</form>
</body>
</html>

やっべ!titleカラムがない!!!追加せな

気づいたらphpMyAdminですぐ追加。

ALTER TABLE `bookmark` ADD `TITLE` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL AFTER `USER_ID` ;

次なにつくろ。ActionForm?

べつにいらないっぽい。あまり複雑にならないうちは、Actionに記載してもいいみたい。

publicのメンバとしてEntryActionに記述します。

	@Required
	public String title;

	@Required
	@UrlType
	public String url;
	
	@Required
	public String comment;

予想やけど、org.seasar.annotation.xxxxでバリデータができるんちゃうかな。

完了Actionをつくる。

まずからっぽでつくる。validator=trueで。

	@Execute(validator = true, input = "input.vm")
	public String result() {
		
		return "result.vm";
	}

あーこれだけでValidatorもいけた。普通のStrutsでいうところの、validator.configとかActionMappingのValidator属性がPOJOの中にかけるんですね。
setter/getterがいらないとか、そういう無駄な処理を書かなくてよいのがところが便利。無駄な繰り返し処理を、ジェネレータでコマンドたたいて生成するって言うのは邪道だと最近感じていたので、ますます好感が持てます。

エンティティをつくる。

DBに書き込むためのエンティティクラスを作ります。
パッケージを先に作る。

チュートリアルのEmployeeを参考にするけど、こっちのアノテーションの意味があんまりわからなかった。
Java Persistence API っていうらしい。
しかしこちらもsetter/getterがないのっていいね。ソースコード略。

insertしてみる。

まずjdbcManagerの宣言。

	public JdbcManager jdbcManager;

エンティティに画面からの値をセットするのも簡単。

	Bookmark bmk = Beans.createAndCopy(Bookmark.class, this).execute();

insertも一行必殺。JAVAなので、control+cで保管させれば間違いもないし、返り値もintって表示されるので、マニュアル要らずです。

	resultCount = jdbcManager.insert(bmk).execute();

あれ、ぬるぽでた、、、

  1. s2jdbc.diconがhsqldbのままだった。
  2. jdbc.diconのmysqlがコメントアウトされてた
  3. かつ、dns書いてない
  4. そもそもjdbcドライバがない。

行き当たりばったりだけど、とりあえずなおします。でもだめだった

SQLで例外(Message=[Field 'ID' doesn't have a default value

むーEntityの宣言があかんのかな。mysqlのauto_incrementなんだけど、@GeneratedValueはちゃうのかな。

auto_incrementがはいってないだけやったorz

insertできたーー

長くなったのでその2に続く予定