问题描述
我被告知在我的JSP页面中使用scriptlet(<%= ...%>)并不是一个好主意。
I've been told that the use of scriptlets (<%= ... %>) in my JSP pages isn't such a great idea.
对于有更多java / jsp经验的人,请给我一些关于如何更改此代码的指示,以便更多最佳实践,无论可能是什么?
Can someone with a bit more java/jsp experience please give me some pointers as to how to change this code so its more 'best practice', whatever that may be?
这个JSP实际上是我的sitemesh主装饰页面。基本上我的网页设计有一个标签条和一个子菜单,我希望以某种方式突出显示当前标签,并通过查看当前请求URI显示正确的子菜单。
This JSP is actually my sitemesh main decorator page. Basically my web design has a tab strip and a submenu, and i wish to somehow highlight the current tab and show the correct submenu by looking at the current request URI.
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<html>
<head>
<title>My Events - <decorator:title /></title>
<link href="<%= request.getContextPath() %>/assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a
<%= request.getRequestURI().contains("/events/") ? "class='selected'" : "" %>
href='<%= request.getContextPath() %>/events/Listing.action'>Events</a>
<a
<%= request.getRequestURI().contains("/people/") ? "class='selected'" : "" %>
href='<%= request.getContextPath() %>/people/Listing.action'>People</a>
</div>
<div class="submenu">
<% if(request.getRequestURI().contains("/events/")) { %>
<a href="Listing.action">List of Events</a>
|<a href="New.action">New Event</a>
<% } %>
<% if(request.getRequestURI().contains("/people/")) { %>
<a href="Listing.action">List of People</a>
|<a href="New.action">New Person</a>
<% } %>
</div>
<div class="body">
<decorator:body />
</div>
</body>
</html>
全部谢谢
推荐答案
我认为如果你亲眼看到它实际上可以完全没有 scriptlet,它会有所帮助。
I think it helps more if you see with your own eyes that it can actually be done entirely without scriptlets.
这是一对一的重写,在其他人的帮助下(只需删除 a href =http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/c/tld-summary.html\"rel =noreferrer>核心和 taglib:
Here's a 1 on 1 rewrite with help of among others JSTL (just drop jstl-1.2.jar
in /WEB-INF/lib
) core and functions taglib:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>My Events - <decorator:title /></title>
<link href="${pageContext.request.contextPath}/assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a
${fn:contains(pageContext.request.requestURI, '/events/') ? 'class="selected"' : ''}
href="${pageContext.request.contextPath}/events/Listing.action">Events</a>
<a
${fn:contains(pageContext.request.requestURI, '/people/') ? 'class="selected"' : ''}
href="${pageContext.request.contextPath}/people/Listing.action">People</a>
</div>
<div class="submenu">
<c:if test="${fn:contains(pageContext.request.requestURI, '/events/')}">
<a href="Listing.action">List of Events</a>
|<a href="New.action">New Event</a>
</c:if>
<c:if test="${fn:contains(pageContext.request.requestURI, '/people/')}">
<a href="Listing.action">List of People</a>
|<a href="New.action">New Person</a>
</c:if>
</div>
这是一个更优化的重写,请注意我使用 c:set
缓存表达式结果以便重用,并且我使用HTML < base>
标记以避免在每个链接中放置上下文路径(只需使所有相对相对于它的网页中的URL - 没有前导斜杠!):
Here's a more optimized rewrite, note that I used c:set
to "cache" expression results for reuse and that I use HTML <base>
tag to avoid putting the context path in every link (just make all relative URL's in your webpage relative to it --without the leading slash!):
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<c:set var="isEvents" value="${fn:contains(pageContext.request.requestURI, '/events/')}" />
<c:set var="isPeople" value="${fn:contains(pageContext.request.requestURI, '/people/')}" />
<html>
<head>
<title>My Events - <decorator:title /></title>
<base href="${pageContext.request.contextPath}">
<link href="assets/styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="tabs">
<a ${isEvents ? 'class="selected"' : ''} href="events/Listing.action">Events</a>
<a ${isPeople ? 'class="selected"' : ''} href="people/Listing.action">People</a>
</div>
<div class="submenu">
<c:if test="${isEvents}">
<a href="Listing.action">List of Events</a>|<a href="New.action">New Event</a>
</c:if>
<c:if test="${isPeople}">
<a href="Listing.action">List of People</a>|<a href="New.action">New Person</a>
</c:if>
</div>
如果您收集所有硬编码值,例如事件和人
并在应用程序范围内的 Map
中链接文本并在下面使用每个JSTL < c:forEach>
显示标签。
It can actually be optimized more if you collect all those "hardcoded" values like events
and people
and link texts in a Map
in the application scope and use under each the JSTL <c:forEach>
to display the tabs.
至于你的实际问题,您可以通过在webapp的 web.xml
中添加以下条目来禁用 scriptlet(并获得有关使用它的运行时错误)。它可能有助于发现监督的小脚本。
As to your actual question, you can disable scriptlets (and get runtime errors about using it) by adding the following entry in webapp's web.xml
. It may help to spot overseen scriptlets.
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
要了解有关EL的更多信息,请查看。隐含的EL对象,例如 $ {pageContext}
被描述为。要了解有关JSTL的更多信息,请查看。请注意,JSTL和EL是两个独立的东西。 JSTL是标准taglib ,EL只允许以编程方式访问后端数据。虽然它通常用在像JSTL这样的taglib中,但它也可以在模板文本中单独使用。
To learn more about EL, check the Java EE tutorial part II chapter 5. Implicit EL objects, such as ${pageContext}
are described here. To learn more about JSTL, check the Java EE tutorial part II chapter 7. Note that JSTL and EL are two separate things. JSTL is a standard taglib and EL just enables to access backend data programmatically. Although it is normally used in taglibs like JSTL, it can also be used standalone in template text.
这篇关于如何避免在JSP页面中使用scriptlet?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!