在工作中,我的任务是把一堆HTML文件变成一个简单的JSP项目。它实际上都是静态的,没有用于编程的服务器端逻辑。我应该提到,我对Java完全陌生。JSP文件似乎很容易使用常见的include和变量,很像PHP,但我想知道一种简单的方法来获得模板继承(Django样式),或者至少能够有一个包含页眉和页脚的base.JSP文件,以便以后插入内容
Ben Lings似乎在他的回答中提供了一些希望:
JSP模板继承
有人能解释一下如何做到这一点吗
考虑到我没有太多时间,我认为动态路由有点太多了,所以我很乐意让URL直接映射到.jsp文件上,但我愿意接受建议
谢谢。
编辑:我不想使用任何外部库,因为它会增加我自己和其他项目工作人员的学习曲线,而我工作的公司已经签订了这样做的合同
另一个编辑:我不确定JSP标记是否有用,因为我的内容实际上没有任何模板变量。我需要的是一种能够做到这一点的方法:
base.html:
<;html>&书信电报;车身>;
{content.body}
</车身></html>;
somepage.html
<;包装器:base.html>;
<;h1>;欢迎</h1>;
</包装纸>;
其输出为:
<;html>&书信电报;车身>;
<;h1>;欢迎</h1>;
</车身></html>;
我想这会给我足够的变通能力去做我需要的一切。它可以通过includes实现,但是我需要为每个包装提供一个顶部和底部includes,这有点混乱
Asskaffman建议,JSP 2.0标记文件是蜜蜂的膝盖
让我们举一个简单的例子
将以下内容放入WEB-INF/tags/wrapper.tag
<;%@tag description=“Simple Wrapper tag”pageEncoding=“UTF-8”%>;
<;html>&书信电报;车身>;
<;jsp:doBody/>;
</车身></html>;
现在在您的example.jsp页面中:
<;%@page contentType=“text/html”pageEncoding=“UTF-8”%>;
<;%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%>;
<;t:包装纸>;
<;h1>;欢迎</h1>;
</t:包装纸>;
这正是你所认为的
所以,让我们把它扩展到更一般的东西。
WEB-INF/tags/genericpage.tag
<;%@tag description=“整个页面模板”pageEncoding=“UTF-8”%>;
<;%@attribute name=“header”fragment=“true”%>;
<;%@attribute name=“footer”fragment=“true”%>;
<;html>;
<;车身>;
<;div id=“pageheader”>;
<;jsp:invoke fragment=“header”/>;
</部门>;
<;div id=“body”>;
<;jsp:doBody/>;
</部门>;
<;div id=“pagefooter”>;
<;jsp:invoke fragment=“footer”/>;
</部门>;
</车身>;
</html>;
要使用此选项,请执行以下操作:
<;%@page contentType=“text/html”pageEncoding=“UTF-8”%>;
<;%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%>;
<;t:genericpage>;
<;jsp:attribute name=“header”>;
<;h1>;欢迎</h1>;
</jsp:attribute>;
<;jsp:attribute name=“footer”>;
<;p id=“版权”>;1927年版权所有,未来Bits当有Bits公司时</p>;
</jsp:attribute>;
<;jsp:body>;
<;p>;嗨,我是信息的核心</p>;
</jsp:body>;
</t:genericpage>;
这给你买了什么?真的很多,但它变得更好
WEB-INF/tags/userpage.tag
<;%@tag description=“用户页面模板”pageEncoding=“UTF-8”%>;
<;%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%>;
<;%@attribute name=“userName”required=“true”%>;
<;t:genericpage>;
<;jsp:attribute name=“header”>;
<;h1>;欢迎${userName}</h1>;
</jsp:attribute>;
<;jsp:attribute name=“footer”>;
<;p id=“版权”>;1927年版权所有,未来Bits当有Bits公司时</p>;
</jsp:attribute>;
<;jsp:body>;
<;jsp:doBody/>;
</jsp:body>;
</t:genericpage>;
要使用此选项,请执行以下操作:
(假设请求中有一个用户变量)
<;%@page contentType=“text/html”pageEncoding=“UTF-8”%>;
<;%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%>;
<;t:userpage userName=“${user.fullName}”>;
<;p>;
名字:${user.firstName}<;br/>;
姓氏:${user.lastName}<;br/>;
电话:${user.Phone}<;br/>;
</p>;
</t:userpage>;
但这会使您喜欢在其他地方使用该用户详细信息块。所以,我们将重构它。
WEB-INF/tags/userdetail.tag
<;%@tag description=“用户页面模板”pageEncoding=“UTF-8”%>;
<;%@tag import=“com.example.User”%>;
<;%@attribute name=“user”required=“true”type=“com.example.user”%>;
名字:${user.firstName}<;br/>;
姓氏:${user.lastName}<;br/>;
电话:${user.Phone}<;br/>;
现在,前面的示例变成:
<;%@page contentType=“text/html”pageEncoding=“UTF-8”%>;
<;%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%>;
<;t:userpage userName=“${user.fullName}”>;
<;p>;
<;t:userdetail user=“${user}”/>;
</p>;
</t:userpage>;
JSP标记文件的美妙之处在于,它允许您基本上标记通用标记,然后将其重构为您的核心内容
JSP标记文件几乎已经篡夺了Tiles等东西,至少对我来说是这样。我发现它们更容易使用,因为唯一的结构是你给它的,没有任何先入为主的东西。此外,您还可以将JSP标记文件用于其他事情(如上面的用户详细信息片段)
下面是一个与我所做的DisplayTag类似的示例,但这都是通过标记文件完成的(以及Stripesframework,即s:tags..)。这将生成一个行表、交替颜色、页面导航等:
<;t:table items=“${actionBean.customerList}”var=“obj”css\u class=“display”>;
<;t:col css_class=“checkboxcol”>;
<;s:checkbox name=“customerIds”value=“${obj.customerId}”
onclick=“handleCheckboxRangeSelection(此,事件);”/>;
</t:col>;
<;t:col name=“customerId”title=“ID”/>;
<;t:col name=“firstName”title=“First name”/>;
<;t:col name=“lastName”title=“Last name”/>;
<;t:col>;
<;s:link href=”https://stackoverflow.com/Customer.action“event=“preEdit”>;
编辑
<;s:param name=“customer.customerId”value=“${obj.customerId}”/>;
<;s:param name=“page”value=“${actionBean.page}”/>;
</s:link>;
</t:col>;
</t:表>;
当然,这些标记与JSTL标记一起工作(比如c:if,等等)。在标记文件标记体中唯一不能做的事情是添加Java scriptlet代码,但这并不像您想象的那样是一个限制。如果我需要scriptlet的东西,我只需将逻辑放入标记中,然后将标记放入。简单
因此,标记文件几乎可以是您想要的任何文件。在最基本的层面上,它是简单的剪切粘贴重构。抓取一块布局,将其剪切,进行一些简单的参数化,并用标记调用替换它。
在更高的层次上,你可以做一些复杂的事情,比如我这里的这个桌子标签