如何避免在我的 JSP 页面中使用 scriptlet? [英] How to avoid using scriptlets in my JSP page?

查看:20
本文介绍了如何避免在我的 JSP 页面中使用 scriptlet?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人告诉我,在我的 JSP 页面中使用 scriptlet (<%= ... %>) 并不是一个好主意.

有更多 java/jsp 经验的人可以给我一些关于如何更改此代码以使其更最佳实践"的指示,无论是什么?

这个 JSP 实际上是我的 sitemesh 主装饰页面.基本上我的网页设计有一个标签条和一个子菜单,我希望以某种方式突出显示当前标签并通过查看当前请求 URI 来显示正确的子菜单.

<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %><头><title>我的活动 - <decorator:title/></title><link href="<%= request.getContextPath() %>/assets/styles.css" rel="stylesheet" type="text/css"/><身体><div class="tabs">href='<%= request.getContextPath() %>/events/Listing.action'>Events</a>href='<%= request.getContextPath() %>/people/Listing.action'>People</a>

<div class="子菜单"><% if(request.getRequestURI().contains("/events/")) {%><a href="Listing.action">活动列表</a>|<a href="New.action">新活动</a><%}%><% if(request.getRequestURI().contains("/people/")) { %><a href="Listing.action">人员名单</a>|<a href="New.action">新人物</a><%}%>&nbsp;

<div class="body"><装饰器:主体/>

谢谢大家

解决方案

我认为,如果您亲眼看到它实际上可以完全无需 scriptlet 来完成,那么这会更有帮助.

这是在其他人的帮助下进行的一对一重写JSTL(只需删除 jstl-1.2.jar/WEB-INF/lib) 核心函数 标签库:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %><头><title>我的活动 - <decorator:title/></title><link href="${pageContext.request.contextPath}/assets/styles.css" rel="stylesheet" type="text/css"/><身体><div class="tabs">

<div class="子菜单"><c:if test="${fn:contains(pageContext.request.requestURI, '/events/')}"><a href="Listing.action">活动列表</a>|<a href="New.action">新活动</a></c:if><c:if test="${fn:contains(pageContext.request.requestURI, '/people/')}"><a href="Listing.action">人物名单</a>|<a href="New.action">新人物</a></c:if>&nbsp;

这是一个更优化的重写,请注意我使用 c:set 来缓存"表达式结果以供重用,并且我使用 HTML 标记来避免将上下文路径放在每个链接中(只需将网页中的所有相对 URL 都相对于它——不带前导斜杠!):

<%@ 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/')}"/><头><title>我的活动 - <decorator:title/></title><base href="${pageContext.request.contextPath}"><link href="assets/styles.css" rel="stylesheet" type="text/css"/><身体><div class="tabs"><a ${isEvents ?'class="selected"' : ''} href="events/Listing.action">Events</a><a ${isPeople ?'class="selected"' : ''} href="people/Listing.action">People</a>

<div class="子菜单"><c:if test="${isEvents}"><a href="Listing.action">活动列表</a>|<a href="New.action">新活动</a></c:if><c:if test="${isPeople}"><a href="Listing.action">人物名单</a>|<a href="New.action">新人物</a></c:if>&nbsp;

如果您收集所有这些硬编码"值(例如 eventspeople)并在 Map 中链接文本,则实际上可以对其进行更多优化应用范围,并在每个JSTL下使用来显示标签.

至于您的实际问题,您可以通过在 webapp 的 web.xml.这可能有助于发现受监督的脚本.

<jsp-property-group><url-pattern>*.jsp</url-pattern><scripting-invalid>true</scripting-invalid></jsp-property-group></jsp-config>

要了解有关 EL 的更多信息,请查看 Java EE 教程部分第二章 5.隐式 EL 对象,例如 ${pageContext} 被描述为 此处.要了解有关 JSTL 的更多信息,请查看 Java EE 教程第二部分第 7 章.请注意,JSTL 和 EL 是两个独立的东西.JSTL 是一个标准标签库,EL 只允许以编程方式访问后端数据.虽然它通常用于像 JSTL 这样的标签库中,但它也可以在模板文本中独立使用.

I've been told that the use of scriptlets (<%= ... %>) in my JSP pages isn't such a great idea.

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?

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>
  <% } %>  
  &nbsp;
</div>

<div class="body">
  <decorator:body />
</div>

</body>
</html>

Thanks all

解决方案

I think it helps more if you see with your own eyes that it can actually be done entirely without scriptlets.

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>
  &nbsp;
</div>

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>
  &nbsp;
</div>

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.

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>

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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆