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