0

Java と Struts 2 を使用して単純な「Hello World」アプリを構築するためのオンライン リソースのほとんどを読みました。単純なことは理解しています。私の問題は、その学習を拡張して大規模なアプリを構築しようとしていることです。点と点をつなぐ方法がわかりません。

シナリオ: まず、Home.jsp、MyAccount.jsp、Contact.jsp の 3 つのビューがあります。それぞれに次の HTML があります。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html>

<html>
    <head>
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <script type="text/javascript" src="js/common.js"></script>
        ...
    </head>
    <body>
        <!-- If logged in, says "hello <s:property name="username">"
             Else displays link to .show() #loginPane -->
        <div id="accountHeader">...</div>

        <!-- Displays <s:textfield> tags and <s:submit> tag to accept username and password -->
        <div id="loginPane" style="display: none">...</div>

        <header>...</header>

        <nav>...</nav>

        <!-- Displays view-specific content that includes Struts 2 tags -->
        <div id="content">...</div>

        <footer>...</footer>
    </body>
</html>

したがって、明らかに、各ビュー (#content div 以外のもの) に共通するコードが多数あります。

コードを再利用するためにこれらのビューを設計するにはどうすればよいですか?

私が試したこと:

  • 共通コードを common.js に配置し、jQuery .html() 呼び出しを使用して<div>s を設定します。[ jQuery はタグ付きのコードを生成できないため、機能しません。<s:>]

  • .jsp ビュー ファイルを 1 つだけ使用し、ビュー固有のコードを common.js に配置して、jQuery .html() 呼び出しで生成します。[同じ理由で動作しません -- jQuery は<s:>タグ付きのコードを生成できません。]

  • すべてのビュー コンポーネントを .jspf ファイルに配置し、それぞれを common.js からの jQuery .load() 呼び出しでロードします。[動作しません -- .jspf ファイルにはそれぞれに含まれる Struts 2 <%taglib ...%> が必要だと推測していますが、jQuery .load() は <%taglib ...%> をテキストとして扱い、<div>...に表示されず、<s:>タグを適切に生成することもできません。]

これを行う適切な方法は何ですか?コードを再利用するためにビューを設計するにはどうすればよいですか?

これがアーキテクチャのヘルプを求める適切なフォーラムでない場合は申し訳ありませんが、私はここで本当に苦労しています...おそらく、このタイプのアーキテクチャに対処するより適切なフォーラムまたはオンラインチュートリアルを教えてください?

前もって感謝します!

4

2 に答える 2

1

この種のコードの再利用を実現するために、タイルや、Sitemesh やその他のテンプレート フレームワークを使用したツールなど、いくつかの方法を使用しました。私が見つけたのは、Steven Benitez と同じように、最終的には JSP taglibs、ネイティブ Struts2 taglibs、および JSTL を使用して、基本的に独自のテンプレート ルーチンを構築することを好みました。私がこれを好む主な理由は、オーバーヘッドが少なくなる傾向があり、長期的には保守と拡張がはるかに簡単になるからです。

一般的に、たとえば index.jsp などのベース テンプレートを定義し、それぞれの独立した Struts コントローラー クラスで、どのページ フラグメントを使用するかを定義します。各ページまたは機能が単一のコントローラーによって処理されるようにコントローラーを分割し、Preparable インターフェイスを実装しようとしています。このようにして、参照するページのパラメーターを設定できます。コントローラークラスの変数として設定することもあれば、アプリケーションに必要な状態のタイプに応じてセッション変数として設定することもあります。

参照するページの変数を取得したら、JSTL インポートまたは Struts インクルード タグを使用してページ フラグメントをロードするだけです。

コントローラ クラスは次のようになります。

@Results({
    @Result(name = "success", location = "/WEB-INF/content/index.jsp")
})
public class IndexController extends RestActionSupport implements Preparable{
    private String page;
    private String pageTitle;

    @Override
    public void prepare() throws Exception {
        page = "home";
        pageTitle= "My Home Page";
    }
    ...
}

そして、JSP は次のようになります。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="s" uri="/struts-tags"%> 
<html>
    <head>
        <title> ${pageTitle}</title>
    </head>

    <body>
        <c:import url="${page}.jsp" />
    </body>
</html>

編集: フラグメントページの例:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="s" uri="/struts-tags"%>

<div>
    <h1>Welcome Home!</h1>
</div>

<script type='text/javascript'>
    $(document).ready(function() {
        // page specific scripting if needed
    );
</script>
于 2013-07-17T02:13:32.673 に答える