JSP技巧使模板制作更容易?

在工作中,我的任务是把一堆HTML文件变成一个简单的JSP项目。它实际上都是静态的,没有用于编程的服务器端逻辑。我应该提到,我对Java完全陌生。JSP文件似乎很容易使用常见的include和变量,很像PHP,但我想知道一种简单的方法来获得模板继承(Django样式),或者至少能够有一个包含页眉和页脚的base.JSP文件,以便以后插入内容

Ben Lings似乎在他的回答中提供了一些希望:
JSP模板继承
有人能解释一下如何做到这一点吗

考虑到我没有太多时间,我认为动态路由有点太多了,所以我很乐意让URL直接映射到.jsp文件上,但我愿意接受建议

谢谢。

编辑:我不想使用任何外部库,因为它会增加我自己和其他项目工作人员的学习曲线,而我工作的公司已经签订了这样做的合同

另一个编辑:我不确定JSP标记是否有用,因为我的内容实际上没有任何模板变量。我需要的是一种能够做到这一点的方法:

base.html:

<html&gt&书信电报;车身>
{content.body}
&lt/车身&gt&lt/html>

somepage.html

<包装器:base.html>
<h1>欢迎&lt/h1>
&lt/包装纸>

其输出为:

<html&gt&书信电报;车身>
<h1>欢迎&lt/h1>
&lt/车身&gt&lt/html>

我想这会给我足够的变通能力去做我需要的一切。它可以通过includes实现,但是我需要为每个包装提供一个顶部和底部includes,这有点混乱

Asskaffman建议,JSP 2.0标记文件是蜜蜂的膝盖

让我们举一个简单的例子

将以下内容放入WEB-INF/tags/wrapper.tag

<%@tag description=“Simple Wrapper tag”pageEncoding=“UTF-8”%>
<html&gt&书信电报;车身>
<jsp:doBody/>
&lt/车身&gt&lt/html>

现在在您的example.jsp页面中:

<%@page contentType=“text/html”pageEncoding=“UTF-8”%>
<%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%>
<t:包装纸>
<h1>欢迎&lt/h1>
&lt/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”/>
&lt/部门>
<div id=“body”>
<jsp:doBody/>
&lt/部门>
<div id=“pagefooter”>
<jsp:invoke fragment=“footer”/>
&lt/部门>
&lt/车身>
&lt/html>

要使用此选项,请执行以下操作:

<%@page contentType=“text/html”pageEncoding=“UTF-8”%>
<%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%>
<t:genericpage>
<jsp:attribute name=“header”>
<h1>欢迎&lt/h1>
&lt/jsp:attribute>
<jsp:attribute name=“footer”>
<p id=“版权”>1927年版权所有,未来Bits当有Bits公司时&lt/p>
&lt/jsp:attribute>
<jsp:body>
<p>嗨,我是信息的核心&lt/p>
&lt/jsp:body>
&lt/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}&lt/h1>
&lt/jsp:attribute>
<jsp:attribute name=“footer”>
<p id=“版权”>1927年版权所有,未来Bits当有Bits公司时&lt/p>
&lt/jsp:attribute>
<jsp:body>
<jsp:doBody/>
&lt/jsp:body>
&lt/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/>
&lt/p>
&lt/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}”/>
&lt/p>
&lt/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(此,事件);”/>
&lt/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}”/>
&lt/s:link>
&lt/t:col>
&lt/t:表>

当然,这些标记与JSTL标记一起工作(比如c:if,等等)。在标记文件标记体中唯一不能做的事情是添加Java scriptlet代码,但这并不像您想象的那样是一个限制。如果我需要scriptlet的东西,我只需将逻辑放入标记中,然后将标记放入。简单

因此,标记文件几乎可以是您想要的任何文件。在最基本的层面上,它是简单的剪切粘贴重构。抓取一块布局,将其剪切,进行一些简单的参数化,并用标记调用替换它。

在更高的层次上,你可以做一些复杂的事情,比如我这里的这个桌子标签

发表评论