Shale Clay Plugin その8

昨日,終了とか言いながら再び書いてます.
面白い発見をしたので.

HTML View でカスタムタグを使う

さて,テストコードを見ていたら,面白いものを発見しました.
本来,HTML Viewに

<h:outputText value="#{@managed-bean-name.name}" />

と書いても,HTMLにはそのまま出力されてしまいます.
出力されたHTMLのソースを見ると,valueは,正しく置き換えられてますが,タグがそのまま表示されています.
エスケープされて画面に出ているという意味ではない)

では,カスタムタグを使用するにはどうすればよいのか?

tagsample.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:h="http://java.sun.com/jsf/html">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>タグも書けるよ</title>
</head>
<body>
<h:messages globalOnly="false" showDetail="true" />
<form>
入力:<h:inputText value="#{@managed-bean-name.value}" /><br />
<h:commandButton action="#{@managed-bean-name.doSubmit}" />
</form>
入力値:<h:outputText value="#{@managed-bean-name.value}" />
</body>
</html>

このように,htmlの属性に名前空間をつけてやります.
そうすると,なんと上記のHTMLテンプレートは,正しくHTMLに変換されます.
どうしてもカスタムタグを使用したい!と,いう人には朗報ですね.

タグをそのまま表示したい

ずいぶん前に,以下のタグは自動的に置き換えられると書きました.

・<a></a>
・<form></form>
・<input type=text>
・<input type=checkbox>
・<input type=radio>
・<input type=submit>
・<label></label>
・<select></select>
・<select multiple></select>
・<option>
・<textarea></textarea>

例えば,レルム認証などを使用したい場合など,レンダラによって差し替えてほしくない場合があります.
その場合は,以下のようにします.

plain.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>そのまま表示</title>
</head>
<body>

<span jsfid="ignore">
  <form method="POST" action="j_security_check">
      Username:<input type="text" name="j_username" /><br />
      Password:<input type="password" name="j_password" />
      <input type="submit" value="submit" />
  </form>
</span>

</body>
</html>

jsfidに'ignore'を指定すると,ignoreで囲まれた中は,そのまま表示されるようになります.

Tokenを使う

Shale Frameworkには,Tokenが用意されています.
HTML View以外にも,JSPでも使用することが出来ます.

それでは,Tokenを使用してみます.

registration.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>登録</title>
</head>
<body>
<span jsfid="globalErrorMsg" style="color:red;">Error</span>
<form>
<span jsfid="s:token" />
<input type="text" value="#{@managed-bean-name.value}" />
<br />
<input type="submit" action="#{@managed-bean-name.doSubmit}" />
</form>
</body>
</html>

registrationConfirm.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>メッセージ</title>
</head>
<body>
<form>
登録しました.<br />
<input type="submit" action="#{@managed-bean-name.doReturn}" value="戻る" />
</form>
</body>
</html>

sample.RegistrationBean

package sample;

public class RegistrationBean {

    private String value_;

    public String getValue() {
        return value_;
    }

    public void setValue(String value) {
        value_ = value;
    }

    public String doSubmit() {
        return "registrationConfirm";
    }
}

sample.RegistrationConfirmBean

package sample;

public class RegistrationConfirmBean {

    public String doReturn() {
        return "registration";
    }
}

faces-config.xml

<managed-bean>
    <managed-bean-name>registration</managed-bean-name>
    <managed-bean-class>sample.RegistrationBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>registrationConfirm</managed-bean-name>
    <managed-bean-class>
        sample.RegistrationConfirmBean
    </managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
    <navigation-case>
        <from-outcome>registration</from-outcome>
        <to-view-id>/registration.html</to-view-id>
    </navigation-case>
</navigation-rule>
<navigation-rule>
    <navigation-case>
        <from-outcome>registrationConfirm</from-outcome>
        <to-view-id>/registrationConfirm.html</to-view-id>
    </navigation-case>
</navigation-rule>

それでは,実行してみます.

http://localhost:8080/sample/registration.html

値を入力して,登録ボタンを押します.
ここで,登録されていると仮定して,戻るボタンで戻ります.
そして,再び登録してみます.

うまくいきましたね.

それでは,ブラウザの戻るボタンで戻ってみます.
登録ボタンを押すと,バリデーションエラーになります.

Tokenが効いているようです.

以上で終了.便利ですね.

次は,本当にView Controller編へ!