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

时间:2012-10-02 16:28:44

标签: java jsp intellij-idea el

总结此处显示的答案Code assist in (jsp /jstl) view for Spring MVC model objects in Eclipse 对我来说根本不起作用,是否有需要改变的环境?

我刚刚在github上下载了样本spring-mvc-showcase,它在该项目中没有开箱即用(11.1.3或EAP 12版本都是完整的企业版),见下文(I不知道它从哪里得到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”在哪里? 是否有我需要更改的设置或我缺少的其他设置以获得此功能(使用带有所有弹簧插件的11.1.3企业版)。

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

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

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

4 个答案:

答案 0 :(得分:24)

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

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

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

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

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

答案 1 :(得分:12)

据我了解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向您提供一些有用的信息,您可以使用类型提示。因此,您必须复制对象的整个引用,例如。 G。 foo 并添加一条JSP评论,如:

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

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

这也适用于JSF,尤其是JSF组件。非常简洁的功能,可以完成这种代码,显示警告和错误。

希望能帮助您切换到Intellij Idea。

编辑:我还向朋友报告了这个发现,将整个事情包装成一个不错的博客文章。也许你有兴趣阅读它:open link

答案 2 :(得分:0)

这是intellij 122.694

的最新版本中的已修复

答案 3 :(得分:0)

当我开始编写自己的拦截器时,我遇到了类似的问题。问题是我在视图解析器配置中开始使用refference xml issue

不要使用像这样的结构

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" ref="prefix"/>
    <property name="suffix" ref="suffix"/>
</bean>-