1


JavaでCMSまたは単純なテンプレートエンジンを作成しようとしているとしましょう。
私が現在持っているもの:

  • 3 つのクラスBlockで、ModuleいくつExtensionかの違いがあります。それらのすべてが拡張public abstract class AbstractElementされ、休止状態でデータベースにマップされます。このような構造により、後でこの混乱をすべて使用して、たとえば、ユーザーフレンドリーな要素を (Web サイトなどで) 管理したり、バージョンを確認したり、更新したりすることができます。
  • public class ElementControllerは、DAO と同様に機能します。登録された要素に関するデータをデータベースから取得し、それを HashMaps に配置して、テンプレート クラスからアクセスできるようにします。
  • 元のテンプレートが保存される /Database/Templates/{template_name} のようなフォルダー。すべてのテンプレートにはindex.jsp、基本的な「テンプレート」などがあります。

    やりたいこと:
    シンプルでベーシックなテンプレートエンジン(リード:ライト)。<template:includePanel panel="Left">現時点では、や などのテンプレート用の JSP タグがいくつか計画されていることがわかります<template:pageTitle>。私が必要としているのはそのような基本だけであり、ご覧のとおり、JSP タグを使用すると、コードを挿入するよりもテンプレートが読みやすくなります (既存のテンプレート エンジンを使用することは可能ですが、それでも適切なものが見つかりません)。
    問題のある部分:ブロックまたはモジュールの管理。モジュールは大きな問題であり、「プラグイン」システムに派生する可能性がありますが、ブロックは基本的な要素であり、JSP に見られるものを除いてビジネス ロジックはありません。次に、それぞれに個別の「説明」クラスを登録するのは悪い設計です。
    現在、上記のように、すべてのブロックの説明は、パネルのようなブロックの設定を処理するためにデータベースに保存され、それが属するパネルとパネル内での順序があります。したがって、唯一の問題はブロック (つまり、jsp ページ) の自動登録です。
    私が見ることができる亜種:
  • 次のようなカスタムタグを作成します

    <template:block name="BlockName">
    ...
    </template:block>
    

    このタグは、このブロックをテンプレートに追加する予定で、既に登録されているか、データベースに追加されている場合は、データベースから設定を更新します。ただし、JSP ページが実行時にコンパイルされている限り、このタグは処理されません。この場合、テンプレートを要求する前に各ブロックの JSP を呼び出す必要があります。これにより、ハッシュ (更新) からブロック情報が取得されます。長所: 1 つのページでいくつかの独立したブロックを定義し、それらをタグの本文を含むテンプレートに処理できます。情報を登録/取得/ブロックを含めるための他のコードは必要ありません。

  • ブロックの作成を強制して、public class AutoRegisterJSP ディレクティブで拡張させpageます。ブロックを登録するためのすべてのコードはコンストラクターに配置されますが、この場合、各ブロックのページを個別に呼び出す必要があります (この場合にリフレクションを使用しようとしましたが、ページがコンパイルされていない限り、見つかりません)。ページごとに 1 つのブロック (jsp/jspf) を除いて、前のバリアントに似ています。
  • ブロックまたはブロックのグループごとに「登録者」クラスを作成するようユーザーに強制し、データベースからのみ情報を取得します。長所:すべてのブロックが登録されることが保証され、ブロックのロジックを除いてブロックのページにコードはありません。レジストレータクラスは、抽象定義済みクラスから派生し、コンテナの開始時に自動的に呼び出されます。短所: Webアプリを再起動せずにブロックを追加または削除する機会はありません(おそらく展開は可能ですが、削除はそれほど簡単ではありません)、これが分離されたブロックであり、一部のシステムの一部ではない場合でも、そのような登録者を作成する必要があります/プラグイン;
  • すべてのブロックの必要な分離クラスを残し、クラス Block から派生し、Reflectionライブラリを介してそれらを解析します (これは現在行われています)。短所:機能がすべてのブロックを登録することだけである限り、多くの「ゴミ箱」クラス。

    答えを探しているときに、Velocityや などのテンプレート エンジンを簡単に調べましたFreeMarkerが、私が見る限り、そのような「自動登録」を提供することはできません。


    そして最後に、質問:
    どのメソッド (上記または別のものから) またはテンプレートエンジンが、そのようなメカニズムに「簡潔で美しい」使用法 (単純な JSP タグなど) を提供できるか? または、上記のバリアントを試してテストしているときに、何かを見逃しましたか?

  • 4

    0 に答える 0