java - Struts 2、多 View 和 jQuery - 如何重用通用代码?

标签 java jquery jsp struts2

我已经阅读了大部分关于使用 Java 和 Struts 2 构建简单的“Hello World”应用程序的在线资源。我了解简单的内容。我的问题是,我正在尝试扩展学习范围并构建一个大型应用程序,但我只是不知道如何将这些点联系起来。

场景: 我首先有三个 View :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>

所以,显然每个 View 都有很多通用的代码(#content div 中没有的任何代码)。

如何构建这些 View 以实现代码重用?

我尝试过的:

  • 将通用代码放入 common.js 并使用 jQuery .html() 调用来填充 <div> s。 [不起作用,因为 jQuery 无法使用 <s:> 生成代码标签。]

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

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

执行此操作的正确方法是什么?如何构建我的 View 以实现代码重用?

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

提前致谢!

最佳答案

我使用了多种方法来完成这种类型的代码重用,包括 Tiles 以及 Sitemesh 和其他模板框架的工具。我发现,就像 Steven Benitez 一样,最终我更喜欢使用 JSP 标记库、 native Struts2 标记库和 JSTL 来构建我自己的模板例程。我更喜欢这样做的主要原因是,开销往往会更少,而且从长远来看,维护和扩展要容易得多。

一般来说,我所做的就是定义我的基本模板,例如index.jsp,然后在每个独立的Struts Controller 类中我将定义使用什么页面片段。我尝试以这样的方式拆分 Controller ,使每个页面或功能都由单个 Controller 处理,并实现 Preparable 接口(interface)。这样我就可以设置一个参数供页面引用。有时我将其设置为 Controller 类中的变量,有时设置为 session 变量,具体取决于应用程序所需的声明类型。

一旦我有了要引用的页面变量,我就可以使用 JSTL 导入或 Struts include 标记来加载页面片段。

Controller 类看起来像这样:

@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>

关于java - Struts 2、多 View 和 jQuery - 如何重用通用代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17688825/

相关文章:

java - 当我在 main 方法中没有使用 setter 时,为什么会出现 NullPointerException?

jquery - 目标 ID 隐藏带有伪 ID 的事件链接?

jsp - 尝试执行操作时出现 HTTP 403

java - JSP JDBC SERVLET 显示 classnotfound 异常....一切都正确

java - 为服务类创建对象不起作用

java - "even teams"代码的迭代运行速度更快

Java Maven MOJO - 从项目 POM 中获取信息

基于 Java spring 的 webapp 与纯 javascript webapp

jQuery 在站点/内容加载后淡入淡出?

jquery - 更改后可编辑设置默认选定值