1. ホーム

[解決済み】テンプレを簡単にするJSPの裏技?

2022-03-29 03:08:45

質問

仕事上、私はたくさんの 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スクリプトレットコードを追加することだけですが、これはあなたが考えるほど制限されたことではありません。スクリプトレット的なものが必要な場合は、タグにロジックを入れて、タグをドロップすればいいんです。簡単ですね。

つまり、タグファイルは、あなたが望むものであれば、ほとんど何でもできるのです。最も基本的なレベルでは、単純なカットアンドペーストのリファクタリングです。レイアウトの塊をつかみ、それを切り取り、簡単なパラメータ化を行い、タグの呼び出しに置き換えます。

もっと高いレベルでは、ここにあるテーブルタグのような洗練されたこともできます。