IntelliJ IDEA中的JSP调试

时间:2008-08-29 01:08:28

标签: debugging jsp intellij-idea

有人知道如何在 IntelliJ IDEA中调试JSP吗?

当我在JSP文件中设置断点时,这些断点似乎永远不会生效。调试器永远不会命中它们。 IDEA似乎认为断点是有效的。我确实看到一个红点放在我放置断点的线的左边。

我在IntelliJ论坛in this post中读到JSP个文件需要在web-inf下进行调试才能工作。

但后来我还读到,用户无法直接访问位于web-inf下的JSP个文件。

我不确定谁是对的。

6 个答案:

答案 0 :(得分:33)

对于Intellij中的JSP调试,有一些配置必须按顺序排列。 Intellij总是允许您在JSP行上添加断点这一事实并不一定意味着您已经配置了JSP调试。在下面我指的是Intellij 8配置,w.r.t。在以前的版本中,您需要执行类似的操作,因为概念是相同的。

为了启用JSP调试,您必须执行两个步骤:在项目中设置Web应用程序配置并添加Web应用程序服务器配置。

Web应用程序配置:为了进行JSP调试,您必须在项目结构中有一个“web”方面,指向正确的web.xml文件。根据您使用的Web应用程序结构的类型,Intellij可能会自动检测构面(无论如何要检查它已完成的内容),或者您可能需要手动添加它。请记住在“Java EE构建设置”选项卡中设置为“创建Web构面爆炸目录”;如果你不想复制,只需启用它并指向你现有的目录。

(Web)应用程序服务器:转到“编辑配置”,您必须添加到应用程序服务器的配置,而不是像任何其他应用程序一样启动Web服务器。通过这种方式,Intellij将能够拦截JSP调用。在应用程序服务器列表中,您应该具有默认的Tomcat。在执行此操作之前,请确保已安装本地Tomcat,并在添加Web应用程序服务器时指向该安装。最后一个技巧是进入“部署”选项卡并选择“部署源”,这是您在上一步中配置的相同方面。

如果您想使用其他Web应用程序服务器,我使用相同的配置,我使用最新的Caucho Resin版本测试它,并且调试工作正常(它没有使用以前的Intellij和Resin组合)。

如果您没有在要添加的可用应用程序服务器列表中看到Tomcat,请检查常规Intellij设置窗格中的插件:在最新版本中,越来越多的功能变得“可插拔”,甚至是非常基本的功能可能被禁用;这个插件叫做“Tomcat集成”。

最后,JSP文件需要在WEB-INF下才能进行调试。

答案 1 :(得分:24)

对于远程JSP调试(也适用于localhost),您需要安装JSR45support plugin请注意,此功能仅在IntelliJ的Ultimate版本中受支持,而不是社区版本。

  1. 转到 偏好设置 > 插件 ,搜索 JSR45 插件, 启用它。
  2. 创建运行配置: 运行 > 运行配置 >点击 + 按钮,然后选择 JSR45兼容服务器 ,然后在打开的对话框中选择远程,并设置服务器主机和端口。设置 应用服务器: 通用 应该可以正常工作。
  3. 确保在 启动/配置 >中设置正确的端口的 调试

  4. 打开模块设置(项目文件夹中的 F3 ),并在 Facets 下添加 Web Facet ,并在< strong> Web资源目录指定您的JSP根文件夹。

  5. 单击 配置... 按钮,然后选择包含JSP所依赖的bean,类和库的文件夹。

    < / LI>

    现在,只要您使用proper debug arguments启动服务器,JSP断点就可以正常工作。

答案 2 :(得分:6)

无论如何,您需要在IDEA中启动Tomcat,而不是从远程Tomcat启动。

答案 3 :(得分:1)

请确保您在tomcat的 conf / web.xml suppressSmap 中启用,因为IntelliJ的调试器需要支持JSR45

它应该是这样的:

<init-param>
  <param-name>suppressSmap</param-name>
  <param-value>false</param-value>
</init-param>

来自https://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html

  

suppressSmap - 是否应该抑制JSR45调试的SMAP信息的生成? true或false,默认为false。

答案 4 :(得分:0)

对于问题的第二部分(“web-inf下的jsp文件将无法由用户直接访问”),这是正确的。要允许用户访问WEB-INF文件夹中的JSP文件,需要在每个JSP页面的web.xml文件中创建servlet-mapping条目。

答案 5 :(得分:0)

如果您使用的是Intellij调试器,则可以通过在JSP中放置断点并评估表达式this.jspContext.request.getAttribute("attributeName")来获取单个属性的值。

请注意,这可能会返回Java Object类型,您可能必须将其强制转换为正确的类型。此外,如果您启动远程Tomcat,IDEA将不会遇到任何断点,因此您需要从IDEA内部以调试模式启动Tomcat。