似乎有两种使用JSP进行模板化的方法。包含带有这些陈述之一的文件
<%@ include file="foo.html" %>
<jsp:include page="foo.html" />
或使用JSP标记文件
// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<jsp:doBody/>
</body>
</html>
在另一个JSP页面中用
调用它<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:mytag>
<h1>Hello World</h1>
</t:mytag>
那我应该使用哪种方法?现在一个被认为已被弃用,或者它们是否有效并涵盖不同的用例?
修改
是否使用此标记文件与使用include? p>相同
// Save this as product.tag
<%@ tag description="Product templage" pageEncoding="UTF-8"%>
<%@ tag import="com.myapp.Product" %>
<%@ attribute name="product" required="true" type="com.myapp.Product"%>
Product name: ${product.name} <br/>
Quantity: ${product.quantity} <br/>
使用
在另一个JSP上调用它<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:product>
<c:forEach items="${cart.products}" var="product">
<t:product product="${product}"/>
</c:forEach>
</t:product>
在我看来,与使用include和传递参数非常相似。标记文件与包含相同吗?
答案 0 :(得分:280)
有几种机制可以重用JSP文件中的内容。
以下 4在JSP中包含内容的机制可归类为直接重用:
(引用"Head First Servlets and JSP")的前3个机制
1)include指令:
<%@ include file="header.html" %>
静态:将文件属性值的内容添加到当前页面转换时间。该指令是 最初用于静态布局模板,如HTML标题。
2)
<jsp:include>
标准行动:<jsp:include page="header.jsp" />
动态:将页面属性值中的内容添加到当前页面请求时。更多是为了动态 来自JSP的内容。
3)
<c:import>
JSTL标签:
<c:import url=”http://www.example.com/foo/bar.html” />
动态:将网址属性值中的内容添加到当前页面,在请求时。它很有用
<jsp:include>
,但它更强大,更灵活:不像 另外两个包括,<c:import>
网址可以来自外部 web容器!4)前奏曲和密码:
静态:前奏曲和密码只能应用于页面的开头和结尾。
您可以隐式包含前奏(也称为标题)和 codas 通过添加一组JSP页面(也称为页脚) 分别在<include-prelude>
和<include-coda>
元素内 Web应用程序 web.xml 部署描述符中的<jsp-property-group>
元素。在这里阅读更多:
•Configuring Implicit Includes at the Beginning and End of JSPs
•Defining implicit includes
标记文件是内容重用的间接方法,封装可重用内容的方式。 标记文件是一个源文件,其中包含可作为自定义标记重用的JSP代码片段。
包含和标记文件的目的不同。
Tag file(JSP 2.0引入的概念)是用于创建自定义标记的选项之一。这是构建自定义标记的更快捷,更简单的方法。 Custom tags,也称为标记扩展,是JSP元素,允许将其他Java组件提供的自定义逻辑和输出插入到JSP页面中。通过自定义标记提供的逻辑由称为标记处理程序的Java对象实现。
自定义标记可以执行的任务的一些示例包括操作隐式对象,处理表单,访问数据库和其他企业服务(如电子邮件和目录)以及实现流控制。
也许在您的示例中(在编辑中),使用直接包含和标记文件之间没有区别。但自定义标记具有丰富的功能。他们可以
通过从调用页面传递的属性进行自定义。
将变量传递回调用页面。
访问JSP页面可用的所有对象。
互相沟通。您可以创建和初始化JavaBeans组件,创建一个公共EL变量,在一个标记中引用该bean,然后在另一个标记中使用该bean。
彼此嵌套并通过私有变量进行通信。
另请阅读&#34; Pro JSP 2&#34;:Understanding JSP Custom Tags。
Difference between include directive and include action in JSP
来自 coreservlet.com 的非常丰富且易于理解的教程
包含<jsp:include> VS. <%@ include %>
的解释
比较表:
Including Files and Applets in JSP
Pages
来自 coreservlets.com 的另一个很好的教程,与标签库和
标签文件:
Creating Custom JSP Tag Libraries: The
Basics
官方Java EE 5教程及其示例:
Encapsulating Reusable Content
Using Tag
Files。
官方Java EE 5教程中的这个页面应该可以提供
更多的理解:
Reusing Content in JSP
Pages
摘自本书&#34; Pro JSP 2&#34;还讨论你为什么需要
标记文件而不是使用静态包含:
Reusing Content with Tag
Files
为每项任务使用正确的工具。
使用标记文件 作为创建自定义标记的快捷方式,可以帮助您封装可重用内容。
关于JSP中的包含内容(引自here):
- 如果文件很少更改,请使用include指令。这是最快的机制。如果容器未自动检测到更改,则可以通过删除主页面类文件来强制更改生效。
- 仅对经常更改的内容使用包含操作,以及在请求主页面之前无法确定要包含的页面。
答案 1 :(得分:21)
<@include>
- 指令标记指示JSP编译器在创建生成的servlet代码之前将包含文件的内容合并到JSP中。这相当于将包含页面中的文本剪切并粘贴到JSP中。
<jsp:include>
- 另一方面,JSP Action标记指示容器暂停执行此页面,运行包含的页面,并将该页面的输出合并到此页面的输出中。
根据您的需要,您可以使用
<@include>
或<jsp:include>
答案 2 :(得分:8)
<jsp:include />
优于<%@ include >
的主要优势是:
<jsp:include />
允许传递参数
<jsp:include page="inclusion.jsp">
<jsp:param name="menu" value="objectValue"/>
</jsp:include>
在<%@include file="somefile.jsp" %>
答案 3 :(得分:5)
所有三个模板选项 - <%@include>
,<jsp:include>
和<%@tag>
均有效,并且所有三个都涵盖不同的用例。
使用<@include>
,JSP解析器在编译之前将包含文件的内容内联到JSP中(类似于C #include
)。您可以将此选项与简单的静态内容一起使用:例如,如果您想在页面,页脚或导航元素中包含Web应用程序的每个页面。包含的内容成为已编译JSP的一部分,并且在运行时没有额外的成本。
<jsp:include>
(和JSTL的<c:import>
相似但功能更强大)最适合动态内容。当您需要包含来自本地或远程的其他URL的内容时,请使用这些内容;当你所包含的资源本身是动态的;或者,当包含的内容使用与包含页面冲突的变量或bean定义时。 <c:import>
还允许您将包含的文本存储在变量中,您可以进一步操作或重用该变量。这两个都会导致调度的额外运行时成本:这是最小的,但您需要知道动态包含不是“免费”。
如果要创建可重用的用户界面组件,请使用标记文件。如果你有一个小部件列表,比如说,你想要遍历小部件并显示每个小部件的属性(在表格中,或在表格中),你就可以创建一个标签。标签可以使用<%@tag attribute>
来获取参数,这些参数可以是强制的也可以是可选的 - 有点像方法参数。
标记文件是一种更简单的,基于JSP的编写标记库的机制,您必须使用Java代码编写(JSP 2.0之前的版本)。在标记中进行大量渲染时编写JSP标记文件要清晰得多:如果用Java编写标记,则不需要混合使用Java和HTML代码。
答案 4 :(得分:1)