Java Struts 2、多视图和jQuery—如何重用公共代码?
我已经阅读了关于使用Java和Struts 2构建一个简单的“Hello World”应用程序的大部分在线资源。我理解简单的东西。我的问题是,我正试图扩大这种学习,并建立一个大规模的应用程序,我只是不知道如何连接点 情景: 首先我有三个视图:Home.jsp、MyAccount.jsp、Contact.jsp。每个都有以下HTML: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="
<%@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。