AbookController.groovyに追加
def vcfsave = { def abookInstance = Abook.get(params.id) if (abookInstance) { VCard vcard = new VCardImpl() vcard.setBegin(new BeginType()) vcard.setVersion(new VersionType(VCardVersion.V3_0)) vcard.setName(new NameType(abookInstance.name)) vcard.setFormattedName(new FormattedNameType(abookInstance.name)) AddressType addr = new AddressType() addr.setStreetAddress(abookInstance.address) addr.setPostalCode(abookInstance.postalnum) vcard.addAddress(addr) vcard.addTelephoneNumber(new TelephoneType(abookInstance.phone)) vcard.setEnd(new EndType()) VCardWriter writer = new VCardWriter() writer.setVCard(vcard) String vstring = writer.buildVCardString() response.setHeader "Content-disposition", "attachment; filename=test.vcf" response.contentType = 'text/x-vcard; charset=utf-8' response.outputStream << vstring.getBytes() response.outputStream.flush() } else { flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'abook.label', default: 'Abook'), params.id])}" redirect(action: "list") } }
message.properties に追加
default.vcfsave.label=Export VCF {0} default.vcfload.label=Import VCF as {0} default.button.vcfsave.label=Export As VCF default.file.blank.message=File cannot be empty
show.gsp内の div class="button" 内に追加
<span class="button"><g:actionSubmit class="vcfsave" action="vcfsave" value="${message(code: 'default.button.vcfsave.label')}" /> </span>