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>