繁体   English   中英

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

[英]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>

您可以按照此答案中的说明将通用模板代码封装在JSP标记文件中,也可以使用装饰器框架(例如TilesSiteMesh)来执行此操作。

就个人而言,我更喜欢JSP标记文件。 不要试图写出HTML与jQuery或把所有的代码到一个单一的JSP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM