簡體   English   中英

Struts 2,多個視圖和jQuery-如何重用常見代碼?

[英]Struts 2, multiple views and jQuery - How do I reuse common code?

我已經閱讀了有關使用Java和Struts 2構建簡單的“ Hello World”應用程序的大多數在線資源。我了解這些簡單的知識。 我的問題是,我正在嘗試擴大學習范圍並構建一個大型應用程序,而我只是看不到如何連接點。

場景:我從三個視圖開始:Home.jsp,MyAccount.jsp,Contact.jsp。 每個都有以下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> [ 無效,因為jQuery無法使用<s:>標簽生成代碼。 ]

  • 僅使用一個.jsp視圖文件,並將特定於視圖的代碼放置在common.js中,以便通過jQuery .html()調用生成。 [ 由於相同的原因而無法正常工作-jQuery無法生成帶有<s:>標簽的代碼。 ]

  • 將所有視圖組件放在.jspf文件中,並使用來自common.js的jQuery .load()調用加載每個視圖組件。 [ 不起作用-我猜.jspf文件需要每個文件都包含Struts 2 <%taglib ...%>,但是jQuery .load()將<%taglib ...%>視為文本在<div> ...中顯示,並且也無法正確生成<s:>標記。 ]

正確的方法是什么? 如何構建我的視圖以便代碼重用?

如果這不是尋求架構幫助的合適論壇,我深表歉意,但是我在這里確實很掙扎...也許讓我指向一個更合適的論壇或解決此類架構的在線教程?

提前致謝!

我使用了幾種方法來完成這種類型的代碼重用,包括Tiles和Sitemesh和其他模板框架的工具。 我發現,就像史蒂文·貝尼特斯一樣,最后,我更喜歡使用JSP標簽庫,本機的Struts2標簽庫和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>

您可以按照此答案中的說明將通用模板代碼封裝在JSP標記文件中,也可以使用裝飾器框架(例如TilesSiteMesh)來執行此操作。

就個人而言,我更喜歡JSP標記文件。 不要試圖寫出HTML與jQuery或把所有的代碼到一個單一的JSP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM