前回のインク―ドですが、文字列以上の情報を渡すことはできませんでした。
いろいろ調べたり、上司に聞いてみるとカスタムタグという独自のタグを作る機能があるとのことでさっそく調査。
カスタムタグ
やりたかったこと
自分がやりたかったのは
1 2 3 4 5 6 7 8 9 |
<tr> <th>タイトル</th> <td> <select name="変数名" id="id名"> <option value="1">選択1</option> <option value="2">選択2</option> </select> </td> </tr> |
みたいなプルダウンを何か所も作る必要があったので下記のことがテンプレートでできればと思っていました。
- タイトル、変数名、id名を変数として渡したい。
- 選択肢のList(valueと表示部分のMapをListに格納したもの)を渡してプルダウンを動的に作りたい。
上記を実行するのに必要な処理を書きます。
テンプレートの定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class HTMLHelper extends TagSupport { @Getter @Setter private String var1;//←受け取りたい変数をセットしておく @Override public int doStartTag() throws JspException { try{ //なんらかの処理 html = 吐き出したいhtml pageContext.getOut().print(html); } catch (IOException e) { throw new JspException(e.getMessage()); } return SKIP_BODY;//←こう書く } } |
上記が変数を受け取ってHTMLを吐き出すプログラムです。
プログラムが絡むようですね・・(絡まなくても行けるようですが・・・)
内部のこまかい部分はわかってないですが、変数を受け取ってHTMLを出力することはできました。
で、このプログラムに渡す変数の定義をしないといけないです。
WEB-INFの下にtaglibsというディレクトリを作り下記のようなファイルを作ります。
htmlhelper.tld
↑上記は設定ファイルの名称ですが、これはもちろん任意です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_1.xsd"> <description>makeHTMLHelper</description>//タグの説明です。書かなくてもOK <display-name>HTMLHelper</display-name>//HTMLから呼び出すときのタグの名前です。 <tlib-version>1.0</tlib-version>//バージョン <short-name>pulldown</short-name>//略称 <uri>http://localost/sampleProject/htmlHelper-1.0</uri>//uriこのテンプレートの識別コードみたいなもの? <tag> <name>HTMLHelper</name>//タグの名前 <tag-class>パッケージ名.HTMLHelper</tag-class>//パッケージからクラスのパスを記述 <body-content>empty</body-content>//よくわかってません。とりあえずemptyで動きました(汗) //こっから渡す変数の説明です。基本的には<attribute>で挟み、nameで認識します。 <attribute> <description>field label name</description> <name>labelName</name> </attribute> <attribute> <description>var name</description> <name>varName</name> </attribute> <attribute> <description>pulldownlist</description> <name>pullDownList</name> <rtexprvalue>true</rtexprvalue>//#{}EL式を使いたいとき。 <type>java.util.List</type>//重要!LIstなどString以外を渡したいときはここにかかないとだめ </attribute> </tag> </taglib> |
メイン側の呼び出し
もともとのHTMLが書いてある場所からどう呼び出すかですが、下記でOK
1 2 3 4 5 |
<%@ taglib prefix="htmlhelper" uri="http://localost/redmineTemplateManager/htmlHelper-1.0" %> ↑タグを呼び出すのに一番最初上記のタグをかかないとだめです。 //実際にタグを使うとき(変数を埋め込むときです。) <htmlhelper:HTMLHelper labelName="プロジェクト名" varName="project_id" pullDownList="${requestScope.projectList}" /> |
web.xml
web.xmlにも下記のような記述が必要です。
1 2 3 4 5 6 |
<jsp-config> <taglib> <taglib-uri>http://localost/sampleProject/htmlHelper-1.0</taglib-uri> <taglib-location>/WEB-INF/taglibs/htmlhelper.tld</taglib-location> </taglib> </jsp-config> |
記述する場所が少々多いのがメンドイですね。JSFが恋しくなります・・・
しかも、半分以上わかっていないので、やっていくのと並行して覚えていきたいと思います。
一応参考リンクを紹介。
参考リンク
http://www.javaroad.jp/servletjsp/sj_jsp13.htm
http://www.javaroad.jp/servletjsp/sj_jsp14.htm