gikoha’s blog

個人的メモがわり

Roo custom MVC

Roo で scaffolding するのは簡単だが、しかしそこから先に進むのが難しい

まず糞ったれな年賀状ソフトがLionに対応しないとかぬかすから、アドレスブック葉書ABで印刷することを考えた
はがきデザインキットでもいいんだけどね!
ファイルメーカーProやBentoでもいいかな...
でもデータベースならMySQLがあるじゃないか!

Web application で作ってみる?!ことにして、まず住所レコードから vcf ファイルを書きだすようにしたい

project --topLevelPackage abook --projectName webabook --java 6
persistence setup --provider HIBERNATE --database MYSQL --hostName localhost \
  --databaseName DBNAME \
  --userName XXX --password XXXX
entity --class ~.main.Abook
field string name --notNull --sizeMax 30
field string address --sizeMax 80
field string phone --sizeMax 30
field string postalnum --sizeMax 10
test integration
controller all --package ~.web
web mvc install language --code ja
security setup
finder list --class ~.main.abook
finder add --finderName findAbooksByNameEquals
finder add --finderName findAbooksByNameLike
perform eclipse

まあここまでは普通のrooだ

VMware vFabric tc Server を使うときは、やっぱり日本語サポートのために Server/server.xmlのConnectorにURIEncodingを追加、useBodyEncodingForURI="true"も追加

<Connector URIEncoding="UTF-8" acceptCount="100" connectionTimeout="20000" executor="tomcatThreadPool" maxKeepAliveRequests="15" port="${bio.http.port}" protocol="org.apache.coyote.http11.Http11Protocol" redirectPort="${bio.https.port}" useBodyEncodingForURI="true"/>

データベースにセッションをまたがって保存するため、persistence.xmlの変更 "create"→"update"

<property name="hibernate.hbm2ddl.auto" value="update"/>

security setupをしたからにはapplicationContext-security.xml の変更 (やっぱり他人には住所録見せられないでしょ)

<intercept-url pattern="/resources/**" access="permitAll" />
<intercept-url pattern="/login**" access="permitAll" />
<intercept-url pattern="/**" access="isAuthenticated()" />

さてこれからがMVCカスタマイズ
View 側:views/abooks/show.jspx に変更 の前に4行追加してリンクを張る
リンクをクリックすると/abooks/vCard/id を web serverから GET する

<spring:url value="/abooks/vCard/{user}" var="vCardUrl">
<spring:param name="user" value="${abook.id}"/>
</spring:url>
<a href="${fn:escapeXml(vCardUrl)}">vCard形式ダウンロード</a>
</page:show>

あーfn: とか spring: とかを使っているから冒頭も変えないと..

<div xmlns:field="urn:jsptagdir:/WEB-INF/tags/form/fields"
 xmlns:spring="http://www.springframework.org/tags"
  xmlns:fn="http://java.sun.com/jsp/jstl/functions"
   xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:jsp="http://java.sun.com/JSP/Page"
     xmlns:page="urn:jsptagdir:/WEB-INF/tags/form" version="2.0">


Model側:public class AbookController内に追加 /abooks/vCard/id を処理するロジック

@RooWebScaffold(path = "abooks", formBackingObject = Abook.class)
@RequestMapping("/abooks")
@Controller
public class AbookController
{
	@RequestMapping(value = "vCard/{userId}", method = RequestMethod.GET)
 	public String vCard(@PathVariable("userId") Long id, Model model)
	{       Abook person = Abook.findAbook(id);
		System.out.println("vCard!" + person.toString());

		// まだvcf書き出しはできていないが person.getName(), person.getAddress()など使えます

		model.addAttribute("abook", person);
		model.addAttribute("itemId", id);
		return "abooks/show";
	}
}

上のように、single viewのvCard形式ダウンロードリンクをクリックすると、consoleにperson.toString()が書き出されます. 書きだしたあとは同じ show/id へジャンプ (書き出し成功pageへ移動してもいいんだけどね)