【问题标题】:Struts 2, multiple views and jQuery - How do I reuse common code?Struts 2、多视图和 jQuery - 如何重用通用代码?
【发布时间】:2013-07-15 08:36:55
【问题描述】:

我已经阅读了大部分关于使用 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() 调用来填充 &lt;div&gt;s。 [不起作用,因为 jQuery 无法生成带有 &lt;s:&gt; 标签的代码。]

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

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

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

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

提前致谢!

【问题讨论】:

    标签: java jquery jsp struts2


    【解决方案1】:

    您可以将常用模板代码封装在JSP标记文件as explained in this answer中,也可以使用TilesSiteMesh等装饰器框架来实现。

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

    【讨论】:

    • 我有一个 REST-ful 控制器,它通过例如 /Orders 调用返回订单列表的服务。在我的控制器中,现在可以调用多个需要订单列表的位置 - 我不知道这个列表是选择选项控件的基础,还是显示为
      • 列表或表格- 这反过来又迫使我返回 json 或 xml,这意味着用 jQuery 编写 HTML。您如何处理此类问题?
    • 如果您正在构建 AJAX 单页应用程序,您可能需要为此使用专门的框架,例如 Angular.js 或 Knockout。
    【解决方案2】:

    我已经使用了几种方法来完成这种类型的代码重用,包括 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>
    

    【讨论】:

    • 嗨,非常感谢你们两位的回复! Russell,您能否详细说明您正在导入的 .jsp 文件是什么样的?它们看起来像普通的 HTML 文件吗(Struts 在顶部,...,
      [view-specific code]
      body> 等)还是它们只包含特定于视图的代码?
    • @user2507377 使用 S2 标记库的 JSP 页面必须包含 taglib 指令,如果它们在其他地方动态包含,因为每个都是它自己的 servlet。
    • 是的。正如 Dave Newton 所说,每个片段都需要包含标签库。通常我使用的片段不是完整的 HTML 页面,而是我倾向于使用带有视图特定代码的片段,例如包含在 div 中的内容,而不是完整的 html-head-body,因为这些元素是在我的模板页面中声明的。
    • 抱歉延迟回复...我需要找点时间坐下来编写代码。谢谢拉塞尔,这正是我正在寻找的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2013-07-31
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多