[解決済み】テンプレを簡単にするJSPの裏技?
質問
仕事上、私はたくさんの
HTML
ファイルをシンプルな
JSP
プロジェクトです。本当にすべて静的で、サーバーサイドのロジックをプログラムすることはありません。私はJavaが全く初めてであることをお伝えしておきます。JSPファイルでは、一般的なインクルードや変数を簡単に扱えるようで、例えば
PHP
しかし、テンプレート継承のようなものを簡単に取得する方法を知りたいのです(
Django
または、少なくともヘッダーとフッターを含むbase.jspファイルを持つことができ、後でコンテンツを挿入することができます。
ベン・リングス は、この回答の中で、いくつかの希望を提示しているようです。 JSPテンプレートの継承 どうすれば実現できるのか、どなたか説明してください。
私はあまり時間がないため、ダイナミックルーティングは少しやりすぎだと思います。
.jsp
ファイルを作成することができますが、私は提案を受け入れることができます。
ありがとうございます。
を編集します。 外部ライブラリの使用は、私自身やプロジェクトに携わる人たちの学習コストが高くなるため、私の勤める会社が請け負っているのです。
またまた編集です。
というのは
JSP tags
というのも、私のコンテンツはテンプレート変数を持たないからです。私が必要としているのは、これを可能にする方法です。
base.html:
<html><body>
{ content.body }
</body></html>
somepage.html
<wrapper:base.html>
<h1>Welcome</h1>
</wrapper>
と出力されます。
<html><body>
<h1>Welcome</h1>
</body></html>
これなら、必要なことは何でもできるので、十分な汎用性があると思います。それは、次のようなもので実現できるかもしれません。
includes
しかし、その場合、各ラッパーにトップとボトムのインクルードが必要になり、ちょっと面倒です。
解決方法は?
として スカフマンの提案 , JSP 2.0タグファイル はバチ当たりです。
簡単な例で説明しましょう。
に以下を記述します。
WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
ここで、あなたの
example.jsp
ページがあります。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
それは、あなたが考えているとおりのことをするのです。
では、もう少し一般的な話に発展させましょう。
WEB-INF/tags/genericpage.tag
<%@tag description="Overall Page template" pageEncoding="UTF-8"%>
<%@attribute name="header" fragment="true" %>
<%@attribute name="footer" fragment="true" %>
<html>
<body>
<div id="pageheader">
<jsp:invoke fragment="header"/>
</div>
<div id="body">
<jsp:doBody/>
</div>
<div id="pagefooter">
<jsp:invoke fragment="footer"/>
</div>
</body>
</html>
これを使うには
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<p>Hi I'm the heart of the message</p>
</jsp:body>
</t:genericpage>
何が買えるの?たくさんあるんですが、もっといいことが......。
WEB-INF/tags/userpage.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@attribute name="userName" required="true"%>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome ${userName}</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<jsp:doBody/>
</jsp:body>
</t:genericpage>
これを使うには (リクエストの中にユーザー変数があると仮定します)
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
</p>
</t:userpage>
しかし、そのユーザー詳細ブロックを他の場所でも使いたいことがわかりました。そこで、リファクタリングしてみましょう。
WEB-INF/tags/userdetail.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@tag import="com.example.User" %>
<%@attribute name="user" required="true" type="com.example.User"%>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
これで、先ほどの例は、こうなります。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
<t:userdetail user="${user}"/>
</p>
</t:userpage>
JSPタグファイルの良さは、基本的に一般的なマークアップをタグ付けして、それを思いのままにリファクタリングできることです。
JSP Tag Files
のようなものに取って代わられました。
Tiles
など、少なくとも私にとっては 先入観にとらわれることなく、自分で考えた構造しか持たないので、とても使いやすいと思います。それに、JSPタグファイルを他のことに使うこともできます(上のユーザー詳細の断片のように)。
以下は、私が行ったDisplayTagに似た例ですが、これはすべてタグファイル(および
Stripes
フレームワークのs:タグです...)。この結果、行のテーブル、交互の色、ページナビゲーションなどが実現されます。
<t:table items="${actionBean.customerList}" var="obj" css_class="display">
<t:col css_class="checkboxcol">
<s:checkbox name="customerIds" value="${obj.customerId}"
onclick="handleCheckboxRangeSelection(this, event);"/>
</t:col>
<t:col name="customerId" title="ID"/>
<t:col name="firstName" title="First Name"/>
<t:col name="lastName" title="Last Name"/>
<t:col>
<s:link href="/Customer.action" event="preEdit">
Edit
<s:param name="customer.customerId" value="${obj.customerId}"/>
<s:param name="page" value="${actionBean.page}"/>
</s:link>
</t:col>
</t:table>
もちろんタグの動作は
JSTL tags
(例えば
c:if
など)。タグファイルのタグの本文の中でできないことは、Javaスクリプトレットコードを追加することだけですが、これはあなたが考えるほど制限されたことではありません。スクリプトレット的なものが必要な場合は、タグにロジックを入れて、タグをドロップすればいいんです。簡単ですね。
つまり、タグファイルは、あなたが望むものであれば、ほとんど何でもできるのです。最も基本的なレベルでは、単純なカットアンドペーストのリファクタリングです。レイアウトの塊をつかみ、それを切り取り、簡単なパラメータ化を行い、タグの呼び出しに置き換えます。
もっと高いレベルでは、ここにあるテーブルタグのような洗練されたこともできます。
関連
-
[解決済み] HashMapのtoString関数はなぜ異なる順序で自分自身を印刷するのですか?
-
[解決済み] Firebase クラスにシリアライズするプロパティが見つからない
-
[解決済み] なぜJPAには@Transientアノテーションがあるのですか?
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] Java UnknownFormatConversionException
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] JSP/Servletを使用してサーバーにファイルをアップロードするにはどうすればよいですか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javaで拡張子なしのファイル名を取得する方法は?
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] Java UnknownFormatConversionException
-
[解決済み] javax.mail.MessagingException: SMTPホストに接続できませんでしたか?
-
[解決済み] java.util.MissingFormatArgumentException: 形式指定子 '%s' がありません。
-
[解決済み] 型の不一致:ArrayListからListへの変換ができない
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] JSP include ディレクティブ、JSP include アクション、JSP Tag Files を使ってファイルをインクルードすることの違いは何ですか?