JSP技巧使模板更容易?

问题:

在工作中,我已经将HTML个文件转成一个简单的JSP项目。这真的是静态的,没有服务器端的逻辑来编程。我应该提到我完全是Java的新手。 JSP文件似乎可以很容易地与普通的include和变量一起使用,就像PHP一样,但是我想知道一个简单的方式来获得类似模板继承(Django风格)的东西,或至少能够拥有一个包含页眉和页脚的base.jsp文件,以便稍后插入内容。
 Ben Lings在他的答案中似乎有一些希望:
 JSP template inheritance
有人可以解释一下如何实现吗?
鉴于我没有太多时间,我认为动态路由有点多,所以我很高兴只有将URL直接映射到.jsp文件,但我可以建议。
 Thanks.
 编辑:我不想使用任何外部图书馆,因为它会增加我自己和其他在项目上工作的人的学习曲线,而我所工作的公司已经签约了。
 另一个编辑:我不知道JSP tags是否有用,因为我的内容没有任何模板变量。我需要的是一种能够做到这一点的方法:
 base.html:

<html><body>
{ content.body }
</body></html>

 somepage.html

<wrapper:base.html>
<h1>Welcome</h1>
</wrapper>

输出为:

<html><body>
<h1>Welcome</h1>
</body></html>

我认为这将给我足够的多才多艺来做我需要的一切。这可以用includes来实现,但是对于每个包装器,我需要一个顶部和底部的包装,这是一个凌乱的事情。

回答:

由于skaffman suggestedJSP 2.0标签文件是蜜蜂的膝盖。
我们来看你的简单例子。
将以下内容放在WEB-INF/tags/wrapper.tag

<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
  <jsp:doBody/>
</body></html>

现在您的example.jsp页面:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:wrapper>
    <h1>Welcome</h1>
</t:wrapper>

这完全符合你的想法。
所以,让我们把它扩展到一些更通用的东西。
 WEB-INF/tags/genericpage.tag

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>
<%@attribute name="header" fragment="true" %>
<%@attribute name="footer" fragment="true" %>
<html>
  <body>
    <div id="pageheader">
      <jsp:invoke fragment="header"/>
    </div>
    <div id="body">
      <jsp:doBody/>
    </div>
    <div id="pagefooter">
      <jsp:invoke fragment="footer"/>
    </div>
  </body>
</html>

使用这个:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:genericpage>
    <jsp:attribute name="header">
      <h1>Welcome</h1>
    </jsp:attribute>
    <jsp:attribute name="footer">
      <p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
    </jsp:attribute>
    <jsp:body>
        <p>Hi I'm the heart of the message</p>
    </jsp:body>
</t:genericpage>

那你买什么真的很好,但它变得更好…
 WEB-INF/tags/userpage.tag

<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@attribute name="userName" required="true"%>

<t:genericpage>
    <jsp:attribute name="header">
      <h1>Welcome ${userName}</h1>
    </jsp:attribute>
    <jsp:attribute name="footer">
      <p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</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>
    First Name: ${user.firstName} <br/>
    Last Name: ${user.lastName} <br/>
    Phone: ${user.phone}<br/>
  </p>
</t:userpage>

但是它会让你想在其他地方使用该用户细节块。所以我们会重构它。
 WEB-INF/tags/userdetail.tag

<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@tag import="com.example.User" %>
<%@attribute name="user" required="true" type="com.example.User"%>

First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${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 Tag Files几乎篡夺了Tiles等等。我发现它们更容易使用,因为唯一的结构是你给它,没有什么先入为主。此外,您可以使用JSP标签文件进行其他操作(如上面的用户细节片段)。
这是一个类似于我已经完成的DisplayTag的例子,但是这完全是用Tag文件(和Stripes框架,就是s:tags ..)完成的。这导致一行行,交替颜色,页面导航等:

<t:table items="${actionBean.customerList}" var="obj" css_class="display">
  <t:col css_class="checkboxcol">
    <s:checkbox name="customerIds" value="${obj.customerId}"
                onclick="handleCheckboxRangeSelection(this, event);"/>
  </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="/Customer.action" event="preEdit">
      Edit
      <s:param name="customer.customerId" value="${obj.customerId}"/>
      <s:param name="page" value="${actionBean.page}"/>
    </s:link>
  </t:col>
</t:table>

当然,这些标签与JSTL tags(如c:if等)一起使用)。在标签文件标签的正文内唯一不能做的事情就是添加Java scriptlet代码,但这并不是你想像的那么多限制。如果我需要scriptlet的东西,我只是把逻辑放在一个标签中,放入标签。
 So, tag files can be pretty much whatever you want them to be. At the most basic level, it’s simple cut and paste refactoring. Grab a chunk of layout, cut it out, do some simple parameterization, and replace it with a tag invocation.
在更高层次上,您可以执行像这里的表格标签那样的复杂的事情。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: JSP tricks to make templating easier?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

71 + = 73