JSPからRailsの機能を使う

制御構造にはJSTLが使えるからいいけど、フォームやリンクを生HTMLで書くのは不便なのでカスタムタグを用いて記述したいところ。
いろいろ考えたが、Railsの機能を使いつつタグファイルによるカスタムタグ作成ができたのでメモ。

JSPエスケープシーケンスを使う

<%や%>はRailsでも使うがJSPでもスクリプトレットとして解釈されてしまう。
これをJSPで解釈されずにRailsに解釈させたい。
そこでエスケープシーケンスを用いて<\%と\%>にすることで、JSPでの解釈を回避できた。
JSPにそのまま書く場合はこんな感じ

<\%= link_to "linkName", :action => "add", :v1 => 3, :v2 => 8 \%>

タグファイルの作成

JSP2.0からは便利なタグファイルの機能があるので、それを使ってカスタムタグを作成する。
まずは/WEB-INF/tags/railsディレクトリを作成し、その中にlink.tagファイルを作成する。
こうすることでJSPの中で以下のようにしてタグを使える。

<%@ taglib tagdir="/WEB-INF/tags/rails" prefix="r"%>
<r:link 〜〜〜/>


link.tagの中身をこんな感じで書けば

<%@ tag pageEncoding="UTF-8"%>
<%@ attribute name="action" required="true"%>
<%@ attribute name="params"%>
<%@ attribute name="attrs"%>
 
<\%= link_to "<jsp:doBody/>", {:action => "${action}"<% 
if(params != null) out.print(", "+ params); %>}<%
if(attrs != null) out.print(", "+ attrs); %> \%>

JSPではこうして使える

<r:link action="add" params=":v1 => 11, :v2 => 12" 
attrs=":id => :someId, :style => 'font-weight:bold'">Link</r:link>