Glassfish Jersey MVC Hello World の続き。mustache で mustache の使い方を書いてみた
[source] [reload] |
package com.mycompany.jerseymvcexam; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.glassfish.jersey.server.mvc.Template; @Path("generic") public class GenericResource { @Context private UriInfo context; public GenericResource() { } @GET @Path("hello") @Produces(MediaType.TEXT_HTML) @Template(name = "/hello1") public Person hello() { return new Person("Ms.","Yuko"); } @GET @Path("mexam") @Produces(MediaType.TEXT_HTML) @Template(name = "/mexam") public MExamBean mexam() { MExamBean me = new MExamBean(); me.setMessage("こんにちわ世界"); me.setHtml("<font color=\"red\">さようなら世界</font>"); me.setFlag1(true); me.setFlag2(false); me.setTeam1(Arrays.asList(new Person[]{ new Person("Ms.","Yuko"), new Person("Ms.","Kanae"), new Person("Ms.", "Sachi") })); me.setTeam2(new ArrayList<>()); me.setCopyrights((String input) -> input.replaceAll( "yyyy", Integer.toString(Calendar.getInstance().get(Calendar.YEAR)))); return me; } }
package com.mycompany.jerseymvcexam; import com.github.mustachejava.TemplateFunction; import java.util.List; import lombok.Data; @Data public class MExamBean { private String message; private String html; private boolean flag1; private boolean flag2; private List<Person> team1; private List<Person> team2; private TemplateFunction copyrights; }
<!DOCTYPE html output> <html> <head> <title>Mustache Exam</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> table.table010 { margin-top: 1em; margin-bottom: 1em; border-collapse: collapse; border: solid 1px #999; font-size: 100%; } table.table010 th, table.table010 td { border: solid 1px #999; padding: 4px 6px; vertical-align: top; } table.table010 th { background: #E6E6E6; text-align: center; white-space: nowrap; color: #666; width: 400px; } </style> </head> <body> <!-- ====================================================================== --> <h1>Variables</h1> <table class="table010"> <tr><th>mustache script</th><th>html output</th></tr> <tr><td>{{message}}</td><td>{{message}}</td></tr> </table> <hr> <!-- ====================================================================== --> <h1>HTML Escape</h1> <table class="table010"> <tr><th>mustache script</th><th>html output</th></tr> <tr><td>{{html}}</td><td>{{html}}</td></tr> <tr><td>{{{html}}}</td><td>{{{html}}}</td></tr> <tr><td>{{& html}}</td><td>{{&html}}</td></tr> </table> mustache は、デフォルト動作で文字列を Escape する。 (たとえば、<font> という文字列データは &lt;font&gt; にエスケープされる)<br> {{{ か {& で、エスケープを抑止することができる。 <hr> <!-- ====================================================================== --> <h1>IF ELSE</h1> <table class="table010"> <tr><th>mustache script</th><th>html output</th></tr> <tr> <td> {{#flag1}}<br> Flag1 ON<br> {{/flag1}}<br> </td> <td> {{#flag1}} Flag1 ON {{/flag1}} </td> </tr> <tr> <td> {{#flag2}}<br> Flag2 ON<br> {{/flag2}}<br> {{^flag2}}<br> Flag2 OFF<br> {{/flag2}}<br> </td> <td> {{#flag2}} Flag2 ON {{/flag2}} {{^flag2}} Flag2 OFF {{/flag2}} </td> </tr> </table> <hr> <!-- ====================================================================== --> <h1>ITERATIVE</h1> <table class="table010"> <tr><th>mustache script</th><th>html output</th></tr> <tr> <td> <ul><br> {{#team1}}<br> <li> {{title}} {{name}} </li><br> {{/team1}}<br> </ul> </td> <td> <ul> {{#team1}} <li> {{title}} {{name}} </li> {{/team1}} </ul> </td> </tr> <tr> <td> <ul><br> {{#team2}}<br> <li> {{title}} {{name}} </li><br> {{/team2}}<br> {{^team2}}<br> <li>NO MEMBER</li><br> {{/team2}}<br> </ul> </td> <td> <ul> {{#team2}} <li> {{title}} {{name}} </li> {{/team2}} {{^team2}} <li>NO MEMBER</li> {{/team2}} </ul> </td> </tr> </table> {{# セクションは、ITERATIVE の展開 <br> {{^ セクションは、ITERATIVE の要素数が 0 、または ITERATIVE 自体が null のとき、評価される。 <hr> <!-- ====================================================================== --> <h1>FUNCTION</h1> <table class="table010"> <tr><th>mustache script</th><th>html output</th></tr> <tr> <td> {{#copyrights}}<br> Copyright &copy; yyyy ACME Co. LTD All rights reserved<br> {{/copyrights}}<br> </td> <td> {{#copyrights}} Copyright © yyyy ACME Co. LTD All rights reserved {{/copyrights}} </td> </tr> <tr> <td> {{#copyrights}}<br> {{message}}<br><br> Copyright &copy; yyyy ACME Co. LTD All rights reserved<br> {{/copyrights}}<br> </td> <td> {{#copyrights}} {{message}}<br> Copyright © yyyy ACME Co. LTD All rights reserved {{/copyrights}} </td> </tr> </table> Java Bean のプロパティの TemplateFunction を実行することができる。<br> 引数は、{{#copyrights}}{{/copyrights}} に囲まれた文字列。 この文字列がテンプレートであればさらに展開される。 <hr> <!-- ====================================================================== --> <h1>IMPORT</h1> Mustache は、{{> /footer}} で、footer.mustache をインポートできる。<br> しかし、このタグは、Jersey MVC mustache の機能ではなく Mustache の機能であるため、 footer.mustache をカレントディレクトリから探してしまう。<br> まぁ Jersey MVC mustache からは使えないということで<br> <br> 必要があれば FUNCTION で実装しよう <hr> <!-- ====================================================================== --> <h1>日本語の文字化け</h1> う〜ん、Jersey MVC は、ところどころでファイルの読み込みや書き出しに デフォルトエンコーディングを使っているので、 Glassfish の管理コンソールで JVM オプションに、"-Dfile.encoding=utf-8" を追加すとよろし <hr> <!-- ====================================================================== --> <h1>コメント</h1> <table class="table010"> <tr><th>mustache script</th><th>html output</th></tr> <tr> <td>{{! Comment}}</td> <td>{{! Comment }}</td> </tr> </table> <hr> <!-- ====================================================================== --> <h1>{{ }} と表示したい</h1> <table class="table010"> <tr><th>mustache script</th><th>html output</th></tr> <tr> <td>&#123;{ }&#125;</td> <td>{{ }}</td> </tr> </table> mustache には、{{ }} をエスケープする文法がないので、 mustache テンプレート上では、実体参照文字を使い &#123;{ }&#125; と記述する。 <hr> </body> </html>