使模板变得更容易的JSP技巧?

在工作中,我的任务是让一群人HTML文件变成一个简单的JSP项目。它实际上是静态的,没有服务器端的逻辑来编程。我应该指出,我对Java完全陌生。JSP文件似乎使处理公共包含和变量变得很容易,就像PHP,但是我想知道一个简单的方法来获得类似于模板继承的东西(Django样式),或者至少能够有一个base.jsp文件,其中包含页眉和页脚,这样以后我就可以插入内容了。

本灵他的回答似乎带来了一些希望: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但是,我需要一个顶部和一个底部包含每个包装,这有点麻烦。

使模板变得更容易的JSP技巧?

当年话下
浏览 374回答 3
3回答

翻阅古今

这是我神奇的单标签可扩展模板引擎。它甚至包括文档和一个示例:-)web-INF/tag/block.tag:<%-- &nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;block&nbsp;tag&nbsp;implements&nbsp;a&nbsp;basic&nbsp;but&nbsp;useful&nbsp;extensible&nbsp;template&nbsp;system. &nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;base&nbsp;template&nbsp;consists&nbsp;of&nbsp;a&nbsp;block&nbsp;tag&nbsp;without&nbsp;a&nbsp;'template'&nbsp;attribute. &nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;template&nbsp;body&nbsp;is&nbsp;specified&nbsp;in&nbsp;a&nbsp;standard&nbsp;jsp:body&nbsp;tag,&nbsp;which&nbsp;can &nbsp;&nbsp;&nbsp;&nbsp;contain&nbsp;EL,&nbsp;JSTL&nbsp;tags,&nbsp;nested&nbsp;block&nbsp;tags&nbsp;and&nbsp;other&nbsp;custom&nbsp;tags,&nbsp;but &nbsp;&nbsp;&nbsp;&nbsp;cannot&nbsp;contain&nbsp;scriptlets&nbsp;(scriptlets&nbsp;are&nbsp;allowed&nbsp;in&nbsp;the&nbsp;template&nbsp;file, &nbsp;&nbsp;&nbsp;&nbsp;but&nbsp;only&nbsp;outside&nbsp;of&nbsp;the&nbsp;body&nbsp;and&nbsp;attribute&nbsp;tags).&nbsp;Templates&nbsp;can&nbsp;be &nbsp;&nbsp;&nbsp;&nbsp;full-page&nbsp;templates,&nbsp;or&nbsp;smaller&nbsp;blocks&nbsp;of&nbsp;markup&nbsp;included&nbsp;within&nbsp;a&nbsp;page. &nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;template&nbsp;is&nbsp;customizable&nbsp;by&nbsp;referencing&nbsp;named&nbsp;attributes&nbsp;within &nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;body&nbsp;(via&nbsp;EL).&nbsp;Attribute&nbsp;values&nbsp;can&nbsp;then&nbsp;be&nbsp;set&nbsp;either&nbsp;as&nbsp;attributes &nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;block&nbsp;tag&nbsp;element&nbsp;itself&nbsp;(convenient&nbsp;for&nbsp;short&nbsp;values),&nbsp;or&nbsp;by &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;nested&nbsp;jsp:attribute&nbsp;elements&nbsp;(better&nbsp;for&nbsp;entire&nbsp;blocks&nbsp;of&nbsp;markup). &nbsp;&nbsp;&nbsp;&nbsp;Rendering&nbsp;a&nbsp;template&nbsp;block&nbsp;or&nbsp;extending&nbsp;it&nbsp;in&nbsp;a&nbsp;child&nbsp;template&nbsp;is&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;just&nbsp;a&nbsp;matter&nbsp;of&nbsp;invoking&nbsp;the&nbsp;block&nbsp;tag&nbsp;with&nbsp;the&nbsp;'template'&nbsp;attribute&nbsp;set &nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;the&nbsp;desired&nbsp;template&nbsp;name,&nbsp;and&nbsp;overriding&nbsp;template-specific&nbsp;attributes &nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;necessary&nbsp;to&nbsp;customize&nbsp;it. &nbsp;&nbsp;&nbsp;&nbsp;Attribute&nbsp;values&nbsp;set&nbsp;when&nbsp;rendering&nbsp;a&nbsp;tag&nbsp;override&nbsp;those&nbsp;set&nbsp;in&nbsp;the&nbsp;template &nbsp;&nbsp;&nbsp;&nbsp;definition,&nbsp;which&nbsp;override&nbsp;those&nbsp;set&nbsp;in&nbsp;its&nbsp;parent&nbsp;template&nbsp;definition,&nbsp;etc. &nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;attributes&nbsp;that&nbsp;are&nbsp;set&nbsp;in&nbsp;the&nbsp;base&nbsp;template&nbsp;are&nbsp;thus&nbsp;effectively&nbsp;used &nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;defaults.&nbsp;Attributes&nbsp;that&nbsp;are&nbsp;not&nbsp;set&nbsp;anywhere&nbsp;are&nbsp;treated&nbsp;as&nbsp;empty. &nbsp;&nbsp;&nbsp;&nbsp;Internally,&nbsp;attributes&nbsp;are&nbsp;passed&nbsp;from&nbsp;child&nbsp;to&nbsp;parent&nbsp;via&nbsp;request-scope &nbsp;&nbsp;&nbsp;&nbsp;attributes,&nbsp;which&nbsp;are&nbsp;removed&nbsp;when&nbsp;rendering&nbsp;is&nbsp;complete. &nbsp;&nbsp;&nbsp;&nbsp;Here's&nbsp;a&nbsp;contrived&nbsp;example: &nbsp;&nbsp;&nbsp;&nbsp;======&nbsp;WEB-INF/tags/block.tag&nbsp;(the&nbsp;template&nbsp;engine&nbsp;tag) &nbsp;&nbsp;&nbsp;&nbsp;<the&nbsp;file&nbsp;you're&nbsp;looking&nbsp;at&nbsp;right&nbsp;now> &nbsp;&nbsp;&nbsp;&nbsp;======&nbsp;WEB-INF/templates/base.jsp&nbsp;(base&nbsp;template) &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;page&nbsp;trimDirectiveWhitespaces="true"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;taglib&nbsp;prefix="t"&nbsp;tagdir="/WEB-INF/tags"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<t:block> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<jsp:attribute&nbsp;name="title">Template&nbsp;Page</jsp:attribute> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<jsp:attribute&nbsp;name="style"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.footer&nbsp;{&nbsp;font-size:&nbsp;smaller;&nbsp;color:&nbsp;#aaa;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.content&nbsp;{&nbsp;margin:&nbsp;2em;&nbsp;color:&nbsp;#009;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${moreStyle} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</jsp:attribute> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<jsp:attribute&nbsp;name="footer"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div&nbsp;class="footer"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Powered&nbsp;by&nbsp;the&nbsp;block&nbsp;tag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</jsp:attribute> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<jsp:body> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<html> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<head> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<title>${title}</title> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<style> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${style} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</style> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</head> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<body> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<h1>${title}</h1> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div&nbsp;class="content"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${content} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${footer} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</body> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</html> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</jsp:body> &nbsp;&nbsp;&nbsp;&nbsp;</t:block> &nbsp;&nbsp;&nbsp;&nbsp;======&nbsp;WEB-INF/templates/history.jsp&nbsp;(child&nbsp;template) &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;page&nbsp;trimDirectiveWhitespaces="true"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;taglib&nbsp;prefix="t"&nbsp;tagdir="/WEB-INF/tags"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<t:block&nbsp;template="base"&nbsp;title="History&nbsp;Lesson"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<jsp:attribute&nbsp;name="content"&nbsp;trim="false"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p>${shooter}&nbsp;shot&nbsp;first!</p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</jsp:attribute> &nbsp;&nbsp;&nbsp;&nbsp;</t:block> &nbsp;&nbsp;&nbsp;&nbsp;======&nbsp;history-1977.jsp&nbsp;(a&nbsp;page&nbsp;using&nbsp;child&nbsp;template) &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;page&nbsp;trimDirectiveWhitespaces="true"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;taglib&nbsp;prefix="t"&nbsp;tagdir="/WEB-INF/tags"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<t:block&nbsp;template="history"&nbsp;shooter="Han"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;======&nbsp;history-1997.jsp&nbsp;(a&nbsp;page&nbsp;using&nbsp;child&nbsp;template) &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;page&nbsp;trimDirectiveWhitespaces="true"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;taglib&nbsp;prefix="t"&nbsp;tagdir="/WEB-INF/tags"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<t:block&nbsp;template="history"&nbsp;title="Revised&nbsp;History&nbsp;Lesson"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<jsp:attribute&nbsp;name="moreStyle">.revised&nbsp;{&nbsp;font-style:&nbsp;italic;&nbsp;}</jsp:attribute> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<jsp:attribute&nbsp;name="shooter"><span&nbsp;class="revised">Greedo</span></jsp:attribute> &nbsp;&nbsp;&nbsp;&nbsp;</t:block>--%><%@&nbsp;tag&nbsp;trimDirectiveWhitespaces="true"&nbsp;%><%@&nbsp;tag&nbsp;import="java.util.HashSet,&nbsp;java.util.Map,&nbsp;java.util.Map.Entry"&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<%@&nbsp;tag&nbsp;dynamic-attributes="dynattributes"&nbsp;%><%@&nbsp;attribute&nbsp;name="template"&nbsp;%><% &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;template&nbsp;name&nbsp;(adding&nbsp;default&nbsp;.jsp&nbsp;extension&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;contain &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;any&nbsp;'.',&nbsp;and&nbsp;/WEB-INF/templates/&nbsp;prefix&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;start&nbsp;with&nbsp;a&nbsp;'/') &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;template&nbsp;=&nbsp;(String)jspContext.getAttribute("template"); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(template&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!template.contains(".")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;+=&nbsp;".jsp"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!template.startsWith("/")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;=&nbsp;"/WEB-INF/templates/"&nbsp;+&nbsp;template; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;copy&nbsp;dynamic&nbsp;attributes&nbsp;into&nbsp;request&nbsp;scope&nbsp;so&nbsp;they&nbsp;can&nbsp;be&nbsp;accessed&nbsp;from&nbsp;included&nbsp;template&nbsp;page &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;(child&nbsp;is&nbsp;processed&nbsp;before&nbsp;parent&nbsp;template,&nbsp;so&nbsp;only&nbsp;set&nbsp;previously&nbsp;undefined&nbsp;attributes) &nbsp;&nbsp;&nbsp;&nbsp;Map<String,&nbsp;String>&nbsp;dynattributes&nbsp;=&nbsp;(Map<String,&nbsp;String>)jspContext.getAttribute("dynattributes"); &nbsp;&nbsp;&nbsp;&nbsp;HashSet<String>&nbsp;addedAttributes&nbsp;=&nbsp;new&nbsp;HashSet<String>(); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Map.Entry<String,&nbsp;String>&nbsp;e&nbsp;:&nbsp;dynattributes.entrySet())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(jspContext.getAttribute(e.getKey(),&nbsp;PageContext.REQUEST_SCOPE)&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jspContext.setAttribute(e.getKey(),&nbsp;e.getValue(),&nbsp;PageContext.REQUEST_SCOPE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addedAttributes.add(e.getKey()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}%><%&nbsp;if&nbsp;(template&nbsp;==&nbsp;null)&nbsp;{&nbsp;//&nbsp;this&nbsp;is&nbsp;the&nbsp;base&nbsp;template&nbsp;itself,&nbsp;so&nbsp;render&nbsp;it&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<jsp:doBody/><%&nbsp;}&nbsp;else&nbsp;{&nbsp;//&nbsp;this&nbsp;is&nbsp;a&nbsp;page&nbsp;using&nbsp;the&nbsp;template,&nbsp;so&nbsp;include&nbsp;the&nbsp;template&nbsp;instead&nbsp;%> &nbsp;&nbsp;&nbsp;&nbsp;<jsp:include&nbsp;page="<%=&nbsp;template&nbsp;%>"&nbsp;/><%&nbsp;}&nbsp;%><% &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;clean&nbsp;up&nbsp;the&nbsp;added&nbsp;attributes&nbsp;to&nbsp;prevent&nbsp;side&nbsp;effect&nbsp;outside&nbsp;the&nbsp;current&nbsp;tag &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(String&nbsp;key&nbsp;:&nbsp;addedAttributes)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jspContext.removeAttribute(key,&nbsp;PageContext.REQUEST_SCOPE); &nbsp;&nbsp;&nbsp;&nbsp;}%>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java