我非常欢迎这样的功能,但根据我上次关于它的对话,它真的很难解决,并且需要对相当多的组件进行重大更改。鉴于 jsp 编辑器已经有些脆弱(有时它会显示不存在的验证错误),我认为在不久的将来不会有人攻击它。但我会以此为理由再次唠叨。(您可能想在https://issues.liferay.com/browse/IDE上发布功能请求或找到现有的并支持它)
但是,有一些解决方法:
使用<liferay-util:include />
jsp-tag 您可以指定一个 servletContext 并从您自己的钩子中包含另一个 JSP。这将在指定的 webapp 的类加载器中运行,并且 eclipse 可以很好地处理那个。在您的 jsp-hook 中,您仍然需要停用 jsp 验证,但剩余的 JSP 只是执行包含业务的几个字符,这很好。
您将需要更多的工作来获取所有上下文等,但如果您正在做一些更繁重的工作,这可能是一个选择。您还可以使用来自钩子的自定义类 - 当您将新的 jsp 引入门户类加载器时通常不能这样做。
伪代码示例:
在您的钩子中,从门户覆盖 jsps,例如在my-hook/custom-jsps/html/portlet/navigation/view.jsp
<%-- omitted taglib includes --%>
<liferay-util:include
page="/jsp/navigation/view.jsp"
servletContext="<%=this.getServletContext().getContext("/my-hook")%>" />
这将用您自己的实现覆盖 Liferay 的导航 portlet 的默认 jsp。但是,它显然并没有做太多,而是包含/jsp/navigation/view.jsp
它将在您自己的钩子中找到的内容(注意:/custom-jsps
包含覆盖门户的 jsps - 文件/jsp
将在钩子的上下文中提供:
在my-hook/jsp/navigation/view.jsp
<%-- omitted taglib includes --%>
<ul>
<li>build</li><li>your</li><li>navigation</li>
</ul>
<!-- you also have access to classes introduced by your hook -->
<%=CustomClassInHook.doSomething() %>
缺点是您必须“重复”每个 Liferay jsp 通常自行获取的初始化 - 例如导入语句、使 themeDisplay 可用等。
另外,请注意:以上是伪代码。我只是从一些(笔和纸)笔记中在这里输入的,而不是运行它。所以它可能需要更多的工作并且有其他缺点或缺点。
另一种可能性是在 Liferay 的源代码中开发复杂的覆盖 jsps,并在完成后将它们带到您自己的钩子中。如果您需要重建 Liferay(但谁为 jsp 更改而重建?),您将在构建时受到打击,但您获得了所有 IDE 的奢华