我已经阅读了大部分在线资源,用于使用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:>
代码。]
这样做的正确方法是什么?如何构建我的代码重用视图?
如果这不是寻求架构帮助的正确论坛,我表示歉意,但我真的在这里苦苦挣扎......或许请指向一个更合适的论坛或解决此类架构的在线教程?
提前致谢!
答案 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中,也可以使用Tiles或SiteMesh等装饰框架来执行此操作。
就个人而言,我更喜欢JSP标记文件。 不尝试使用jQuery编写HTML或将所有代码放入单个JSP中。