Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Struts 2、多视图和jQuery—如何重用公共代码?_Java_Jquery_Jsp_Struts2 - Fatal编程技术网

Java Struts 2、多视图和jQuery—如何重用公共代码?

Java Struts 2、多视图和jQuery—如何重用公共代码?,java,jquery,jsp,struts2,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="

我已经阅读了关于使用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()调用填充
    s。[无法工作,因为jQuery无法生成带有
    标记的代码。]

  • 只使用一个.jsp视图文件,并将特定于视图的代码放在common.js中,以便通过jQuery.html()调用生成。[出于同样的原因,jQuery无法生成带有
    标记的代码。]

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

正确的方法是什么?如何为代码重用设计视图

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


提前谢谢

您可以将公共模板代码封装在JSP标记文件中,也可以使用诸如或之类的装饰器框架来实现这一点


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

我使用了几种方法来实现这种代码重用,包括使用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";
    }
    ...
}
<%@ 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>
然后JSP看起来像这样:

@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";
    }
    ...
}
<%@ 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>

${pageTitle}
编辑:片段页面示例:

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

欢迎回家!
$(文档).ready(函数(){
//页面特定的脚本(如果需要)
);

Hi,非常感谢你们两位的回复!Russell,你能详细介绍一下你导入的.jsp文件是什么样子的吗?它们看起来像普通的HTML文件吗(顶部是Struts,…[特定于视图的代码],等等)或者它们只包含特定于视图的代码?@user2507377使用S2标记库的JSP页面必须包含taglib指令,如果它们被动态地包含在其他地方,因为每个都是自己的servlet。是的。正如Dave Newton所说,每个片段都需要包含taglib。通常我使用的片段不是完整的HTML页面,而是十个d将片段与视图特定的代码一起使用,例如,内容包装在一个div中,而不是完整的html头体,因为这些元素在我的模板页面中声明。很抱歉延迟响应…我需要找一些时间坐下来编写代码。感谢Russell,这正是我正在寻找的解决方案!我有一个REST ful co例如,controller通过/Orders调用,它调用一个返回订单列表的服务。在我的控制器中,现在可以调用需要订单列表的多个位置-我不知道该列表是选择选项控件的基础,还是显示为
  • 列表或表-因此反过来迫使我s返回json或xml,这意味着使用jQuery编写HTML。如何处理此类问题?如果要构建AJAX单页应用程序,可能需要使用专门的框架,例如Angular.js或Knockout。