跨多个包含块的 Java 变量 - 无法解析变量

Posted

技术标签:

【中文标题】跨多个包含块的 Java 变量 - 无法解析变量【英文标题】:Java variable across multiple include blocks - variable cannot be resolved 【发布时间】:2013-05-11 17:32:43 【问题描述】:

我的 jsp 页面看起来像这样:

MyPage.jsp

<%@ include file = "/Title.jsp" %>
<%@ include file = "/Header.jsp" %>
<html>...</html>

在 Title.jsp 中有一个“用户”的实例,比如说:

User user = new User();

在 Header.jsp 中用户被引用为

user.setName("John");

Eclipse 在 header.jsp 文件中显示“用户无法解析为变量”的错误。我完全理解为什么。 有没有办法告诉 Eclipse 忽略这个特定变量的这个特定错误?这里有什么可以做的吗?

在工作中,我支持一些旧的(又大又丑的)Java 应用程序,它实际上是一个 Web 应用程序。我正在尝试将此 Java 项目转换为 Java 动态 Web 项目。在我转换它之前,不知何故 Eclipse 并不关心这些到处都是的悬挂变量。现在,在 Dynamic Web Project 中,Eclipse 正在抱怨。

重写代码是不可能的。每个 jsp 文件由多个包含大量全局变量的包含组成。我不会多碰它。

【问题讨论】:

我不认为你可以按变量名过滤验证,你可以按文件类型或文件夹来过滤。您显然可以摆脱对 JSP 文件的所有验证,但我想您不会对此感兴趣。顺便说一句,我可以想象 Emacs 用户会满意地阅读您的问题,肯定会有在 Emacs 中做到这一点的方法(我不确定,因为我使用...... Eclipse 或 Intellij) 我在这里发现了类似的问题:***.com/questions/2268153/… 基本上是一样的,要关闭验证... 是的,Eclipse 在 JSP 处理方面相当无望。 【参考方案1】:

最佳实践

理想情况下,JSP 中不应再有任何 &lt;% // scriptlet %&gt; 块。

JSP 已经发展了很多,从简单地将 Java 代码隐藏在标准操作和自定义标记后面,到使用表达式语言、JSTL 和现在的 OGNL 表达式来从任何一种可用的预填充 JavaBean 中获取结果(对于刚刚处理的请求)应用范围(如会话、请求、页面等)或复杂的数据存储(如 Struts 2 中的 ValueStack)。

所以,一个合适的解决方案看起来像 (不能使用 EL,因为我们需要一个“用户”引用)

 <jsp:useBean id="user" class="foo.User" /> <!-- scope="page" by default -->

添加到Title.jsp 的这行代码将创建一个新的User bean 并将其添加到page 范围内,然后Header.jsp 中的同一行代码将从中检索User bean page 范围并给它一个名为 user 的引用,然后可以在整个文件的其余部分中使用它。

但是,由于 Java 代码的其余部分不是用标签编写的,所以这没有多大意义。因此,您也可以使用 块之一简单地将两个 JSP 之间的 bean 作为请求属性传递。

<% // in Title.jsp
  request.setAttribute ("user", new User());
%>

<% // in Header.jsp
  User user = request.getAttribute ("user");
  user.setName ("John Doe");
%>

回答

如果代码库太大而无法挽救,并且使用任何最佳实践都是不切实际的;您可以将 Eclipse IDE 配置为忽略 JSP 语法验证错误,或者更好地仅针对 JSP 片段或特定文件和文件夹关闭它们。

在工作区中选择您的 Web 项目后,转到 Project &gt; Properties &gt; Validation &gt; JSP Syntax。然后Enable project specific settings关闭Validate JSP fragments如下图。

JSP 片段是一个.jspf 文件,其中包含一个没有打开和关闭页眉标记的JSP/HTML 段(当然,除非它是页眉或页脚片段)。因此,尽管您必须将文件重命名为 .jspf 以便 Eclipse 将它们识别为片段(而不是验证);主要优点是:

文件可以位于文件夹结构中的任何位置 扩展名清楚地表明它是一个包含 新片段将被自动识别

如果包含文件的数量很大或者由于某种原因它们无法重命名,您的下一个最佳选择是将它们移动到单独的文件夹(如includes),然后从 JSP 语法验证中排除文件夹本身.

再次,转到项目 > 属性 > 验证并启用项目特定设置,单击浏览类型 [...] 按钮以访问 JSP Syntax Validator 设置。

在这里,首先创建一个Exclude Group 然后Add Rule排除一个文件夹(如图片中的WebContent/includes ) 来自 JSP 语法验证。

现在 Eclipse 将停止报告此 includes 文件夹中放置的任何 JSP 文件的错误。您也可以对单个文件使用相同的方法,但它的实用程度又取决于您拥有多少这样的片段。

参考资料:How to avoid Java Code in JSP-Files?

【讨论】:

使用 eclipse neon 时,此选项似乎消失了。还是搬到别的地方了?【参考方案2】:

对于你的问题:有没有办法告诉 Eclipse 忽略这个特定变量的这个特定错误?如上所述,错误来自 Eclipse 中的验证框架。您能做的最好的事情就是告诉 eclipse 忽略那个文件——而不是那个错误或那个变量。为此,请右键单击该项目并拉出它的属性对话框。在那里,选择“验证”并单击“启用项目特定设置”复选框。从那里您可以打开或关闭特定的验证。就个人而言,我发现 Eclipse 验证器并不是很有用,而且它们需要相当多的处理时间,所以我几乎把它们都关掉了!但是,您可以通过“设置”列进行一些细粒度控制。您点击 JSP Content Validator 旁边的省略号(例如),您可以从那里专门排除 Header.jsp。

希望这会有所帮助,但它仅向早期的 cmets 提供详细信息。

【讨论】:

以上是关于跨多个包含块的 Java 变量 - 无法解析变量的主要内容,如果未能解决你的问题,请参考以下文章

如何跨多个函数使用变量?

按名称汇总跨多个变量的数据

用于多个同步块的Java

VS2013 调试器无法再解析包含源代码路径的系统环境变量

使 PHP 变量跨多个网页成为全局变量

Java(静态)变量和(静态)代码块的执行顺序