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

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

MyPage.jsp

  ... 

在Title.jsp中有一个“user”的实例,让我们说:

 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中不应再有任何<% // scriptlet %>块。

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

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

    

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

但是,由于其余的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语法validation错误,或者更好地仅针对JSP片段或特定文件和文件夹关闭它们。

在工作区中选择Web项目后,转到“ Project > Properties > Validation > JSP Syntax 。 然后Enable project specific settings并关闭Validate JSP fragments ,如下所示。

关闭片段的JSP验证

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

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

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

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

验证设置

在这里,首先创建一个Exclude Group ,然后创建Add Rule以从JSP语法validation中排除文件夹 (如图像中的WebContent / includes )。

排除文件夹

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

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

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

希望这会有所帮助,但它只提供了之前评论的详细信息。