Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免在我的JSP页面中使用Scriptlet?_Java_Jsp_Sitemesh_Scriptlet - Fatal编程技术网

Java 如何避免在我的JSP页面中使用Scriptlet?

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" %&

有人告诉我,在JSP页面中使用scriptlets()并不是一个好主意

有java/jsp经验的人能给我一些关于如何更改此代码以使其更“最佳实践”的建议吗

这个JSP实际上是我的sitemesh主装饰页面。基本上,我的web设计有一个选项卡条和一个子菜单,我希望通过查看当前请求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>

我的事件-
|
|

谢谢大家

您需要使用一些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章,其中包括以下规则:

  • 视图无法通过直接更改模型来修改模型 数据对象或通过调用 导致副作用的型号。 也就是说,模板可以访问数据 从模型和调用方法,但是 这样的引用肯定会有副作用 自由的这条规则部分产生 因为数据引用必须是 顺序不敏感。见第7.1节
  • 视图无法对相关数据执行计算 值,因为计算可能 未来的变化,他们应该 被整齐地封装在模型中 无论如何。例如,视图不能