Java 如何避免在我的JSP页面中使用Scriptlet?
有人告诉我,在JSP页面中使用scriptlets()并不是一个好主意 有java/jsp经验的人能给我一些关于如何更改此代码以使其更“最佳实践”的建议吗 这个JSP实际上是我的sitemesh主装饰页面。基本上,我的web设计有一个选项卡条和一个子菜单,我希望通过查看当前请求URI来突出显示当前选项卡并显示正确的子菜单Java 如何避免在我的JSP页面中使用Scriptlet?,java,jsp,sitemesh,scriptlet,Java,Jsp,Sitemesh,Scriptlet,有人告诉我,在JSP页面中使用scriptlets()并不是一个好主意 有java/jsp经验的人能给我一些关于如何更改此代码以使其更“最佳实践”的建议吗 这个JSP实际上是我的sitemesh主装饰页面。基本上,我的web设计有一个选项卡条和一个子菜单,我希望通过查看当前请求URI来突出显示当前选项卡并显示正确的子菜单 <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %&
<%@ 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>
我的事件-
|
|
谢谢大家您需要使用一些web框架。或者至少是一些方便的标记库。或者像FreeMarker这样的模板引擎
<s:if test="%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
广告框架:
如果您喜欢JSP编码方式,那么我建议
<s:if test="%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
不会被执行
将被执行
不会被执行
然后是面向组件的JSF
<s:if test="%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
如果您喜欢OOP和用Java编写所有代码,请尝试(我最喜欢的)或Google Web Toolkit您可能希望从使用标记库开始。您可以使用标准标记库来完成大多数需要scriplets的常见操作。还有许多其他更丰富的标记库,如struts2框架或apache中使用的标记库
<s:if test="%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
e、 g
你的内容
将替换您的if语句。scriptlet的首选替代方案是JSTL表达式语言;'这是一个很好的概述。您需要添加标记库,如下所示:
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
例如,JSTL提供了一组隐式对象,为您提供所需的内容;您需要的是pageContext.request
因此,您可以将
替换为${pageContext.request.requestURI}
您可以使用
标记执行条件语句
顺便说一句,
是一种可以接受的使用Scriptlet的方式,但却不那么受欢迎吗
这可能是一个不受欢迎的观点,但如果您所做的只是简单的条件和文本插入,那么我在Scriptlet的使用中找不到太多错误。(注意if)
我可能会使用JSTL和表达式语言,但主要是因为它可以减少键入,并且IDE支持可能更好(但是一个好的JSPIDE也可以找到缺少的右括号之类的东西)
但从根本上说(如“将逻辑排除在模板之外”),我看不出两者之间有任何区别
<% if(request.getRequestURI().contains("/events/")) { %>
我认为,如果你亲眼看到,它实际上可以完全完成,而不需要scriptlet,这会更有帮助 这里有一个1对1的重写,在其他人的帮助下(只需访问
/WEB-INF/lib
)和taglib:
我的事件-
|
|
这里有一个更优化的重写,请注意,我使用了c:set
来“缓存”表达式结果以供重用,并且我使用HTML
标记来避免将上下文路径放在每个链接中(只需使网页中的所有相对URL与之相对,而不使用前导斜杠!):
我的事件-
|
|
如果您收集所有这些“硬编码”值,如事件
和人员
,并在应用程序范围内的地图
中链接文本,并在每个下使用JSTL
来显示选项卡,则实际上可以对其进行更多优化
至于您的实际问题,您可以通过在webapp的web.xml
中添加以下条目来禁用Scriptlet(并获取有关使用它的运行时错误)。这可能有助于发现被监督的脚本
*.jsp
真的
要了解有关EL的更多信息,请查看。描述了隐式EL对象,例如
${pageContext}
。要了解更多关于JSTL的信息,请查看。请注意,JSTL和EL是两个独立的东西。JSTL是一个标准的taglib,EL只允许以编程方式访问后端数据。虽然它通常用于标记库(如JSTL),但也可以在模板文本中单独使用。这并不是对您的问题的直接回答(已经有好几个问题了,所以我不会尝试添加),但您确实提到:
有没有人能更了解java/jsp
请给我一些经验
有关如何更改此代码的指针
所以这更像是“最佳实践”,不管怎样
可能是吧
在我看来,关于JSP的最佳实践是,它应该严格地用作模板引擎,而不仅仅是(即,这里没有业务逻辑)。正如许多人指出的那样,使用JSTL肯定会帮助您实现这一目标,但即使使用JSTL,在JSP中做很多事情也很容易
我个人喜欢在使用JSP开发时遵循Terence Parr在中列出的规则。本文介绍了模板引擎的目的(分离模型和视图),以及一个好的模板引擎的特点。它很好地研究了JSP,并指出它不是一个好的模板引擎。毫不奇怪,JSP基本上太强大了,允许开发人员做太多的事情。我强烈建议您阅读本文,它将帮助您将自己局限于JSP的“好”部分
如果你只读了那篇文章的一部分,请阅读第7章,其中包括以下规则: