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