JSP 技巧让模板制作变得更容易?

2024-01-21

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

本林斯似乎他的回答带来了一些希望:JSP模板继承 https://stackoverflow.com/questions/490390/jsp-template-inheritance有人可以解释如何实现这一目标吗?

鉴于我没有太多时间,我认为动态路由有点多,所以我很高兴将 URL 直接映射到.jsp文件,但我愿意接受建议。

Thanks.

edit:我不想使用任何外部库,因为这会增加我自己和其他参与该项目的人的学习曲线,而且我工作的公司已签约执行此操作。

另一个编辑:我不确定是否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但随后我需要为每个包装纸提供一个顶部和一个底部,这有点混乱。


As 斯卡夫曼建议 https://stackoverflow.com/questions/1296235#comment-1127458, 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:

<%@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 类似的示例,但这都是通过标签文件(以及Stripes框架,那就是 s: 标签..)。这会产生一个包含行、交替颜色、页面导航等的表格:

<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 (like c:if, ETC。)。在标记文件标记体内唯一不能做的事情是添加 Java scriptlet 代码,但这并不像您想象的那样是一个限制。如果我需要 scriptlet 内容,我只需将逻辑放入标签中,然后将标签放入即可。很简单。

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

在更高的级别上,您可以执行复杂的操作,例如我这里的表标签。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSP 技巧让模板制作变得更容易? 的相关文章

  • java本地时间格式不带年份

    我喜欢将本地时间格式格式化为不带年份的字符串 目前我可以显示包含年份的本地格式 java text DateFormat df java text DateFormat getDateInstance java text DateForma
  • 使用 TreeMap 和 Comparator 按值对 HashMap 进行排序

    我使用以下代码创建哈希图 然后使用树形图和比较器对哈希图中的值进行排序 然而 输出结果却出乎意料 所以任何关于我做错了什么的想法都会有帮助 Code public static void main String args System ou
  • Junit Mockito 测试一切

    我现在正在寻找更多时间但没有结果 请帮忙 这是我要测试的课程 public class DBSelectSchema extends Database private static final Logger LOG Logger getLo
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 使用 jstl 进行调试 - 具体如何进行?

    我一直试图理解BalusC的回答 https stackoverflow com questions 3177733 how to avoid java code in jsp files关于可调试性 我仍然无法弄清楚 jstl 标签如何比
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • 将字符串转换为字符并按降序排序(ascii)

    我正在创建一个程序 该程序将使用户输入整数 一个接一个 存储在数组中并按降序显示整数 该程序还要求用户输入一个字符串 使用以下命令将其转换为字符string toCharArray 我已经正确地按降序显示整数 问题是我不知道如何按降序显示字
  • 如何在Java中通过反射调用代理(Spring AOP)上的方法?

    一个接口 public interface Manager Object read Long id 实现该接口的类 Transactional Public class ManagerImpl implements Manager Over
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输
  • 找出该月第一个星期日/星期一等的日期

    我想在java中检测每个月第一周 第二周的第一个星期日 星期一的日期 我怎样才能实现它 我已经检查了 java 中的 Calendar 类和 Date 类 但无法找到解决方案 所以请帮助我解决这个问题 Calendar calendar C
  • Spring Boot中服务接口类的用途

    我的问题是关于接口类的使用 我对 Spring 还很陌生 所以如果这过于简单 请耐心等待 首先 当您可以在 BoxService 中声明 find all 时 这里拥有 IBoxService 接口有什么意义 其次 在控制器中如何使用IBo
  • JSTL - c:url 不适用于表单操作

    我在使用标签在 JSP 中设置表单路径时遇到问题 我也把它放在表单标签之外 效果很好 然而 它似乎不适用于 spring 表单标签 我做错了什么或者它在其他 JSTL 标签中不起作用吗 提前致谢 这是表单标签之外的版本打印的内容 这是正确的
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List

随机推荐

  • 从 DOxygen XML 输出中提取函数调用列表

    我发布了一个question https sourceforge net projects doxygen forums forum 130994 topic 3875842在 DOxygen 论坛上 也将其发布在这里以获得更好的回应 我有
  • 你们有 SQL 注入测试“Ammo”吗?

    当阅读有关 SQL 注入和 XSS 的内容时 我想知道你们是否有一个字符串可以用来识别这些漏洞和其他漏洞 可以放入网站数据库中的字符串 用于黑盒检查该字段是否安全 将对一些内部工具进行大型测试 粗略的例子 想知道你们是否知道更多 a 或 1
  • F# 中的“导入”相当于什么

    如何从 F 中的另一个文件导入函数 像你所做地import在Python中 我试过open using 没有任何效果 我看了官方文档 还是不明白如何使用 基本上 我想要这样的东西 Log fs module Log let log prin
  • 在 spring mvc log4j 中为每个日志消息添加字符串前缀

    我希望将我的字符串作为前缀添加到应用程序中的每个日志消息中 我的意思是 我有几个 java 应用程序 我希望其中一个在消息中具有一些前缀 例如 DATE INFO or other sample gt this is my added st
  • 在不同容器中渲染组件并共享状态

    我有一个由 WordPress 预渲染的 HTML 页面和三个 React 组件
  • 理解正则表达式 [\s\S-[<>]]*

    我有这个正则表达式 s S lt gt 你能帮我理解这个表达代表什么吗 据我所知 这意味着由空格和从非空格字符到 的范围组成的字符类 没有多大意义 Thanks 这是一个仅受少数正则表达式引擎 NET JGSoft XML Schema 和
  • 如何在laravel公共文件夹中安装wordpress

    我也点击此链接 但这不是我的解决方案 laravel 和 wordpress 在同一域中 laravel 在子文件夹中 https stackoverflow com questions 29018742 laravel and wordp
  • Gradle 子项目未包含在类路径中

    我们设置了 2 个项目 1 个主项目和 1 个子项目 它们是 Java 项目 它们都在同一个目录下 目录结构如下 dev Project A build gradle settings gradle Project B build grad
  • 如何每小时调用一次函数?另外,我怎样才能循环这个?

    我需要一种简单的方法来每 60 分钟调用一个函数 我怎样才能做到这一点 我正在制作一个 MineCraft bukkit 插件 这就是我所拥有的 package com webs playsoulcraft plazmotech java
  • 识别评论用户并发送通知 Laravel

    我有一个帖子系统 在我的网站上 用户可以发布文章并对每篇文章发表评论 我想发布 当任何用户 不是帖子的作者 评论帖子时 我需要向帖子的作者发送通知 该帖子由 UserName 评论 我这样做 在 CommentController 中 我有
  • 使用 HTTP 和 REGEX 清除 Varnish

    我想使用 HTTP 清除清漆中的元素 这个http调用是从varnish本身后面的后端服务器触发的 因此后端服务器除了HTTP之外没有其他访问权限 我已经使用相应的 ACL 实施了以下清除规则 该规则适用于 curl X PURGE htt
  • 在 git 中管理本地更改我不想提交

    所以我有一些已更改的文件版本 这些都是非常个人化的更改 例如 为 javascript 构建关闭缩小功能 我永远不会提交 但我确实想让它保持开放状态 以便根据其他人的更改进行更新 目前 每次更新工作区时我都必须进行堆栈保存 这变得非常烦人
  • 可启动和跨平台应用程序并使用delphi或Pascal

    是否可以使用 Delphi 或 Pascal 创建可启动 MBR 应用程序 应用程序 我知道我们不能使用 vcl RTL 和其他东西 因为它们依赖于操作系统 但我可以至少使用 Readln 和 writeln 吗 如果是真的的话 我们可以在
  • 如何暂停/恢复视频录制

    我想在录制视频时实现暂停 恢复功能 MediaRecorder 没有任何暂停 恢复方法 本机相机应用程序具有暂停 恢复功能 可以实施吗 请指导我 任何帮助或指导将不胜感激 None
  • Azure Pipeline 使用 YAML 触发 Pipeline

    当使用 YAML 完成另一个管道时尝试触发 Azure 管道 有文档 https github com microsoft azure pipelines yaml blob master design pipeline resources
  • Android ListView 有两个按钮设置可见性问题

    I have Drag Sort Listview https github com bauerca drag sort listview与以下项目 1 文本视图2 两个按钮 ON和OFF 一次只有一个按钮可见 关闭状态的图像 http p
  • 是否可以在自定义组件中使用骆驼组件?

    我最近开始使用 Apache Camel 我们正在考虑创建自定义组件来抽象大量逻辑并简化路由 但其中一些逻辑涉及 http 请求和其他部分 这些部分具有我们想要利用的现有 Camel 组件 是否可以从我们的自定义组件的生产者中调用其他组件
  • 使用ajax调用Struts 2动作,直接向响应写入字符串,不返回字符串

    在 struts2 应用程序中 我调用 Ajax 请求并将字符串直接写入响应 如下所示并返回null在操作的执行方法中 ServeletActionContext getResponse getOutputStream print samp
  • 如何将逻辑运算符应用于Python列表中的所有元素

    我有一个 python 中的布尔值列表 我想对它们进行 与 或 或 或 非 并得到结果 下面的代码可以工作 但不太Pythonic def apply and alist if len alist gt 1 return alist 0 a
  • JSP 技巧让模板制作变得更容易?

    在工作中我的任务是转动一堆HTML文件转化为简单的JSP项目 它实际上都是静态的 没有可编程的服务器端逻辑 我应该提到我对 Java 完全陌生 JSP 文件似乎可以轻松地使用常见的包含和变量 就像PHP 但我想知道一种简单的方法来获得模板继