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編へ!