intellij 未在 JSP 代码检查或自动完成中解析 el 变量

2022-09-02 23:23:30

总结一下这里显示的答案 Eclipse 中 Spring MVC 模型对象的代码辅助 (jsp /jstl) 视图根本不适合我,是否有我需要更改的设置?

我刚刚在github上下载了示例spring-mvc-showcase,它在该项目上无法开箱即用(11.1.3或EAP 12版本都是完整的企业版),请参阅以下内容(我不知道它从哪里得到formBean):

fruit and foo, both work, but not available as autocomplete options

这是我自己项目中的一个例子,下面的屏幕截图(底帧)显示我的控制器向模型添加字符串属性并返回正确的视图名称。然后,我希望在编辑该视图时将shopString作为自动完成选项提供,但它不是:JSP shown abover controller, the autocomplete offered up when "s" typed

sg是一个javascript变量 - 它是如此之好,它应该在那里,但是“shopString”在哪里?是否有我需要更改的设置或缺少其他设置才能获得此功能(使用带有所有spring插件的11.1.3企业版)。

它在弹簧特定变量上也失败了:enter image description here

他们是开源的(春季教程项目之一?)这绝对有效吗?或者是否有一个设置,我需要在我的Intellij安装中更改(我已经使用版本12 EAP的全新下载进行了测试)?

下面的另一个屏幕截图显示了我通过自动检测正确设置的所有弹簧coifg文件,但代码检查失败...这是春季mvc展示项目:code inspection and spring config


答案 1

有一种标准的方法可以做到这一点,这不是特定于IntelliJ的。

<jsp:useBean id="someModel" scope="request" type="foo.bar.SomeModelClass"/>

这里的 type 属性不需要是一个具体的类,它也可以是一个接口类型。通常,您会将这些声明放在 JSP/JSPX 文件的开头,以提供类似于“模型输入声明”的内容。

事实上,在关于Spring的原始书中,以这种声明性的方式使用JSP是推荐的(专家一对一J2EE设计和开发)。IntelliJ至少7年来一直在为这些页面提供完整的代码完成。

请注意,IntelliJ中还有其他相关的便利功能:如果EL变量引用被标记为未定义,则可以按Alt-Enter选择QuickFix,这将插入如上所述的声明。它甚至会尝试根据您正在访问的属性找出实际类型。


答案 2

根据我对Spring的理解,没有关于可以放入模型中的变量定义的声明。该调用可以向模型添加一个对象,该对象由参数标识,也可以由对象的类名自动生成。model.addAttribute()

因此,想象一下以下情况,其中您有多个方法:

@RequestMapping("foo") public String foo(Model model) { 
    model.addAttribute("model", new Foo());
    return new Random().nextBoolean() ? "page" : "someOtherPage";
}
@RequestMapping("bar") public String bar(Model model) { 
    model.addAttribute("model", new Bar());
    model.addAttribute("model", new Foo());
    model.addAttribute("model", new Bar());
    return new Random().nextBoolean() ? "page" : "someOtherPage";
}

而 JSP 会像这样

<c:out ${model.value} />

由于没有适当的映射来说明哪些控制器在某些情况下可以转发到哪些视图,或者模型中究竟有什么,因此您的 IDE 没有真正的机会为您提供适当的信息。

但是,为了支持 IDE 为您提供一些有用的信息,您可以使用类型提示。因此,您必须复制对象的整个引用,例如 foo 并添加一个 JSP 注释,如下所示:

<%--@elvariable id="foo" type="com.mycompany.SomeObject"--%>

警告将消失,并且完整的 IDE 支持在您这边,允许您遍历 的字段。最好的事情之一是,未使用的getter警告也会消失。您可以直接从 JSP 或 POJO 直接调用显示用法操作。foo

这也适用于 JSF,特别是在 JSF 组件中。非常整洁的功能,具有这种代码完成,显示警告和错误。

希望这有助于您切换到Intellij Idea。

编辑:我还向一位朋友报告了这一发现,wo将整个事情包装成一个不错的博客条目。也许你有兴趣阅读它:打开链接