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へ移動してもいいんだけどね)