JSP技巧使模板更容易?

2022-08-31 05:02:41

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

Ben Lings似乎在他的答案中提供了一些希望:JSP模板继承 有人可以解释一下如何实现这一目标吗?

鉴于我没有太多时间,我认为动态路由有点多,所以我很高兴让URL直接映射到文件上,但我对建议持开放态度。.jsp

谢谢。

编辑:我不想使用任何外部库,因为这会增加我自己和其他从事该项目的人的学习曲线,而我工作的公司已经签约这样做。

另一个编辑:我不确定是否有用,因为我的内容实际上没有任何模板变量。我需要的是一种能够做到这一点的方法: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


答案 1

正如skaffman所建议的那样JSP 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几乎篡夺了诸如此类的东西,至少对我来说是这样。我发现它们更容易使用,因为唯一的结构是你给它的东西,没有什么先入为主的。另外,您可以将 JSP 标记文件用于其他用途(如上面的用户详细信息片段)。Tiles

下面是一个类似于我完成的 DisplayTag 的示例,但这一切都是使用 Tag Files(以及框架,即 s: tags..) 完成的。这将产生一个包含行、交替颜色、页面导航等的表格:Stripes

<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>

当然,标签与(如 等)一起使用。在标签文件标签的正文中,您唯一不能做的就是添加Java scriptlet代码,但这并不像您想象的那么大。如果我需要 scriptlet 的东西,我只需将逻辑放入一个标签中,然后把标签放进去。容易。JSTL tagsc:if

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

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


答案 2

我制作了非常简单的Django风格的JSP模板继承标签库。https://github.com/kwon37xi/jsp-template-inheritance

我认为在没有学习曲线的情况下管理布局变得容易。

示例代码 :

底座.jsp:布局

<%@page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>JSP Template Inheritance</title>
    </head>

<h1>Head</h1>
<div>
    <layout:block name="header">
        header
    </layout:block>
</div>

<h1>Contents</h1>
<div>
    <p>
    <layout:block name="contents">
        <h2>Contents will be placed under this h2</h2>
    </layout:block>
    </p>
</div>

<div class="footer">
    <hr />
    <a href="https://github.com/kwon37xi/jsp-template-inheritance">jsp template inheritance example</a>
</div>
</html>

查看.jsp : 内容

<%@page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<layout:extends name="base.jsp">
    <layout:put name="header" type="REPLACE">
        <h2>This is an example about layout management with JSP Template Inheritance</h2>
    </layout:put>
    <layout:put name="contents">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin porta,
        augue ut ornare sagittis, diam libero facilisis augue, quis accumsan enim velit a mauris.
    </layout:put>
</layout:extends>

推荐