Struts 2,多个视图和jQuery - 如何重用公共代码?

时间:2013-07-16 23:45:47

标签: java jquery jsp struts2

我已经阅读了大部分在线资源,用于使用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&lt;%taglib ...%&gt;包含在每个中,但jQuery .load()处理&lt;%taglib ...%&gt;作为要在<div>中显示的文字...而且无法正确生成<s:>代码。]

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

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

一般来说,我所做的是定义我的基本模板,例如index.jsp,然后在每个独立的Struts控制器类中,我将定义使用的页面片段。我尝试将控制器分开,使得每个页面或函数由单个控制器处理,并实现Preparable接口。这样我就可以为要引用的页面设置参数。有时我将它设置为控制器类中的变量,有时会根据应用程序所需的说明类型来设置会话变量。

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

控制器类看起来像这样:

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

答案 1 :(得分:0)

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

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