似乎有两种使用JSP进行模板化的方法.包含其中一个语句的文件
<%@ include file="foo.html" %>
<jsp:include page="foo.html" />
Run Code Online (Sandbox Code Playgroud)
或使用JSP标记文件
// Save this as mytag.tag
<%@ tag description="Description" pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<jsp:doBody/>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在另一个JSP页面中调用它
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:mytag>
<h1>Hello World</h1>
</t:mytag>
Run Code Online (Sandbox Code Playgroud)
那么我应该使用哪种方法?现在一个被认为已被弃用,或者它们是否有效且涵盖不同的用例?
编辑
是否使用此标记文件与使用包含相同?
// 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/>
Run Code Online (Sandbox Code Playgroud)
并在另一个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>
Run Code Online (Sandbox Code Playgroud)
在我看来,这与使用include和传递参数非常相似.标签文件与包含相同吗?
我从JSF2.0开始看到,Facelets视图定义语言是首选的视图定义语言,而不是作为遗留后退而被弃用的JSP.我想理解为什么Facelets比JSF2.0以后的视图定义语言更优先于JSP?我知道JSP也有一些模板行为,这是采用Facelets的主要驱动点.
PS:我在stackoverflow上经历过这篇文章,但我不认为它回答了我的问题.因此将此作为单独的问题发布.
可能重复:
JSP技巧使模板更容易?
我是JSPs和Servlets的新手,我想知道是否有一种简洁的方法来创建一个布局jsp并在类似的jsp页面上重用它,比如asp.net母版页.
我用谷歌搜索,有人说使用模板 http://java.sun.com/developer/technicalArticles/javaserverpages/jsp_templates 使用jstl标签库.它说要放一个这样的标签:
<%@ taglib uri='/WEB-INF/tlds/template.tld' prefix='template' %>
Run Code Online (Sandbox Code Playgroud)
但我得到错误(因为jstl.jar和standard.jar在WEB-INF/lib /目录中).
不过有人说jstl模板根据这个
Struts OR Tiles OR ??? ...... JSP模板解决方案有问题
我很乐意帮助我了解最好的方法.
编辑:我需要的是将页面的布局拆分为内容,标题等部分,并在使用布局模板的页面中设置此部分,就像asp.net母版页一样.
来自Django的背景,我经常使用"模板继承",其中多个模板从公共基础继承.在JSP中有一种简单的方法吗?如果没有,是否有一个替代JSP来做到这一点(除了Jython上的Django :)
<html>
<body>
{% block content %}
{% endblock %}
</body>
<html>
Run Code Online (Sandbox Code Playgroud)
{% extends "base template" %}
{% block content %}
<h1>{{ content.title }} <-- Fills in a variable</h1>
{{ content.body }} <-- Fills in another variable
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
将呈现如下(假设conten.title是"Insert Title Here",而content.body是"Insert Body Here")
<html>
<body>
<h1>Insert title Here <-- Fills in a variable</h1>
Insert Body Here <-- Fills in another variable
</body>
<html>
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何最有效地重用JSP代码.我喜欢Rails/erb以这种方式工作的方式......有了yield,layout,content_for
例:
main_layout.erb.html
<html>
<head><%= yield :head %></head>
<body><%= yield %></body>
</html>
Run Code Online (Sandbox Code Playgroud)
使用
<% content_for :head do %>
<title>A simple page</title>
<% end %>
<p>Hello, Rails!</p>
Run Code Online (Sandbox Code Playgroud)
在控制器中
layout "main_layout"
Run Code Online (Sandbox Code Playgroud)
使用JSP(不使用额外的框架),我可以得到的最接近的是什么?我知道JSP包含,但这与yield不同.有什么建议?
谢谢
我遇到了以下教程JSP技巧,使模板更容易?使用JSP创建页面模板(我如何错过这么久?!?).但是,在做了一些搜索之后,我似乎无法弄清楚如何(或者是否可能)检查是否已经设置了JSP片段.
这是我正在尝试做的一个例子:
我有一个名为的模板default.tag.它有2个JSP属性,定义如下:
<%@attribute name="title" fragment="true" required="true" %>
<%@attribute name="heading" fragment="true" %>
Run Code Online (Sandbox Code Playgroud)
然后在页面的代码中,我将页面的<title>元素设置为<jsp:invoke fragment="title" />.然后在页面后面,我有以下内容:
<c:choose>
<c:when test="${true}">
<jsp:invoke fragment="heading" />
</c:when>
<c:otherwise>
<jsp:invoke fragment="title" />
</c:otherwise>
</c:choose>
Run Code Online (Sandbox Code Playgroud)
我有的地方<c:when test="${true}">,我希望能够检查heading片段是否已经设置以显示它,但如果没有,则默认为title片段.
我目前有以下JSP页面的代码结构:
MyPage.jsp
<jsp:include page="header.jsp"/>
Specific page content
<jsp:include page="footer.jsp"/>
Run Code Online (Sandbox Code Playgroud)
但是,这意味着页眉和页脚代码没有正确的HTML结构.例如,这是简化的页眉和页脚代码:
header.jsp中
<!DOCTYPE html>
<html lang="en">
<head>
<title>${param.pageTitle}</title>
</head>
<body>
<div class="container" style="margin-top: 80px;">
Run Code Online (Sandbox Code Playgroud)
footer.jsp中
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
因此,IDE会发出有关"缺少开始标记"/"缺少结束标记"的警告.我完全禁用警告感觉不太好,因为它可能会发现HTML结构的合法问题.
有没有更简洁的方法来构建JSP代码,以便我仍然可以以一些好的方式重用页眉和页脚代码?
我在我的jsp页面上应用spring security,我需要向具有不同角色的用户显示页面的不同部分,所有角色如下.
所有经过身份验证的用户>>编辑和添加新
管理>删除和编辑并添加新
匿名>添加新
<sec:authorize
access="isAuthenticated()">
Code of add new and edit buttons
</sec:authorize>
<sec:authorize
access="hasAnyRole('ADMIN')">
Code to add new, edit and delete buttons
</sec:authorize>
<sec:authorize
access="isAnonymous()">
Code to add new
</sec:authorize>
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更简单的方法,在这种情况下,如果我想修改特定角色的访问权限,我必须更改其在security.xml文件中的访问规则以及我已设置角色访问权限的每个页面.
例如,假设我想要Admin角色无法访问删除按钮,那么我必须更改security.xml的代码以及admin角色经过身份验证的所有JSP页面以查看删除按钮.
有没有更简单的方法来做到这一点!?
我是JSP的新手.到目前为止,处理流程似乎是先运行Java,然后填充JSP模板.
我想知道Java中是否有一种方法可以利用JSP模板.我的意思是,想象我在类路径上有一个简单的"SimpleDiv.jsp"模板,如下所示:
<div id="${id}" class="${class}">
${content}
</div>
Run Code Online (Sandbox Code Playgroud)
然后从一个任意Java文件(可能甚至不在servlet上运行)中,我可以做这样的事情:
private String getDivHtml( id, html ) {
Template simpleDiv = TemplateLoader.load("SimpleDiv.jsp");
simpleDiv.set("id", id);
simpleDiv.set("class", Whatever.CLASS_NAME);
simpleDiv.set("content", html);
return simpleDiv.toString();
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的例子,所以不要深究这个细节.主要问题是 - 我可以在Java中引入JSP模板并使其生成内联HTML吗?
给出了一个由Sitemesh 3渲染的简单模板JSP:
<%@include file="../jsp_inc/taglibs.jsp" %>
<!DOCTYPE html>
<head>
<link rel="stylesheet" type="text/css" href='<c:url value="/css/global.css" />' >
</head>
<body>
<h1>[HEADING]</h1>
<div>
<sitemesh:write property='body'/>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
该模板按预期工作,将JSP元素的内容插入模板中.
正如您对上述内容的期望,我希望能够将JSP中的值集(例如.h1元素)插入到模板中的相应元素中.
我试过了:
<sitemesh:getProperty property="page.heading"></sitemesh:getProperty>
Run Code Online (Sandbox Code Playgroud)
在模板/装饰器中:
<content tag="heading"></content>
Run Code Online (Sandbox Code Playgroud)
在JSP中,关于SO的另一个问题,但我认为可能是指Sitemesh 2.我正在使用Sitemesh 3.
有什么建议?