0

我已经阅读了使用 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>s。[不起作用,因为 jQuery 无法生成带有<s:>标签的代码。]

  • 仅使用一个 .jsp 视图文件并将特定于视图的代码放在 common.js 中,以通过 jQuery .html() 调用生成。[出于同样的原因不起作用——jQuery 无法生成带有<s:>标签的代码。]

  • 将所有视图组件放在 .jspf 文件中,并使用来自 common.js 的 jQuery .load() 调用加载每个组件。[不起作用——我猜 .jspf 文件需要包含在每个文件中的 Struts 2 <%taglib ...%> ,但是 jQuery .load() 将 <%taglib ...%> 视为文本显示在<div>... 并且也无法正确生成<s:>标签。]

这样做的正确方法是什么?如何构建我的视图以实现代码重用?

如果这不是寻求架构帮助的适当论坛,我深表歉意,但我在这里真的很挣扎......也许给我一个更合适的论坛或解决此类架构的在线教程?

提前致谢!

4

2 回答 2

1

我使用了几种方法来完成这种类型的代码重用,包括 Tiles 和使用 Sitemesh 和其他模板框架的工具。我发现,与 Steven Benitez 一样,最终我更喜欢使用 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>
于 2013-07-17T02:13:32.673 回答
0

您可以将通用模板代码封装在 JSP 标记文件中,如本答案中所述,或者您也可以使用TilesSiteMesh等装饰器框架来执行此操作。

就个人而言,我更喜欢 JSP 标记文件。不要试图jQuery 写出 HTML 或将所有代码放入单个 JSP。

于 2013-07-17T01:04:55.550 回答