跨多个包含块的 Java 变量 - 无法解析变量我的页面.jsp

2022-09-02 01:03:33

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

我的页面.jsp

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

在标题中.jsp有一个“user”的实例,假设:

User user = new User();

在标头中.jsp用户被引用为

user.setName("John");

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

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

重写代码是没有问题的。每个 jsp 文件都由多个包含和大量全局变量的包含组成。我不会比我需要的更多触摸它。


答案 1

最佳实践

理想情况下,JSP中不应该再有任何块。<% // scriptlet %>

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

因此,正确的解决方案看起来像这样(不能使用EL,因为我们需要“用户”引用)

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

当添加到 时,这行代码将创建一个新的 Bean 并将其添加到作用域中,然后,同一行代码将从作用域中检索该 Bean,并为其提供一个名为的引用,然后可以在文件的其余部分使用该引用。Title.jspUserpageHeader.jspUserpageuser

但是,由于Java代码的其余部分不是用标签编写的,因此这没有多大意义。因此,您也可以使用<% // scriptlet %>块之一,简单地将两个 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 > Properties > Validation > JSP SyntaxEnable project specific settingsValidate JSP fragments

JSP validation off for fragments

JSP 片段是包含 JSP/HTML 段而没有开始和结束页眉标记的文件(当然,除非它是页眉或页脚片段)。因此,尽管您必须重命名文件才能使Eclipse将它们识别为片段(而不是验证);主要优点是:.jspf.jspf

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

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

同样,转到“项目>属性>验证”,并在启用项目特定设置的情况下,单击浏览类型按钮以访问设置。[...]JSP Syntax Validator

Validation settings

在这里,首先创建一个,然后从 JSP 语法验证中排除一个文件夹(如图像中的 WebContent/include)。Exclude GroupAdd Rule

Exclude folder

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

参考文献:
如何避免JSP文件中的Java代码?


答案 2

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

希望这有帮助,它只提供了早期评论的细节。