IntelliJ IDEA 中 JSP 调试

55

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

当我在JSP文件中设置断点时,那些断点似乎从未生效。调试器从未触发它们。IDEA似乎认为这些断点是有效的。我确实看到一个红点被放置在我设置断点的行左侧。

我在IntelliJ论坛的这篇帖子中读到,JSP文件需要位于web-inf下才能进行调试。

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

我不确定到底是谁正确。


刚刚检查了一下 - 对我来说是可以工作的。IntelliJ 6.0.5运行Tomcat 5。JSP在资源文件夹中,没有什么特别的。你需要提供关于你的配置更多的信息。尝试创建一个简单的项目,并使用不同的Tomcat/其他版本进行测试。 - itsadok
如果使用Eclipse:http://codeinventions.blogspot.com/2014/08/how-to-debug-jsp-with-help-of-compiled.html - Suresh Atta
6个回答

36
在Intellij中进行JSP调试需要一些配置才能实现。Intellij总是允许你在JSP代码行上添加断点,但并不一定意味着你已经配置好了JSP调试。以下内容是基于Intellij 8配置的,以前的版本需要执行类似的操作,因为这些概念都是相同的。
要启用JSP调试,必须执行两个步骤:在项目中设置Web应用程序配置并添加一个Web应用程序服务器配置。
Web应用程序配置:为了进行JSP调试,必须在项目结构中设置一个指向正确web.xml文件的“Web”facet。根据你使用的Web应用程序结构的不同,Intellij可能会自动检测到该facet(不管怎样,都要检查一下它是否已经完成),或者你可能需要手动添加它。记住,在“Java EE build settings”选项卡中将“Create web facet exploded directory”设置为可用;如果你不想重复,一个小技巧是只需启用它并指向你已经存在的目录即可。
(Web)应用程序服务器:进入“edit configurations”,在其中添加一个应用程序服务器配置,而不是像其他应用程序一样将Web服务器作为应用程序启动。这样,Intellij将能够截取JSP调用。在应用程序服务器列表中,你应该有默认的Tomcat。在添加Web应用程序服务器时,请确保本地安装了Tomcat,并指向它。最后一个技巧是进入“Deployment”选项卡并选择与之前步骤中配置的facet相同的“Deployment source”。
如果你想使用其他Web应用程序服务器,同样的配置也适用。我测试过最新的Caucho Resin版本和调试正常工作(之前的Intellij和Resin组合不行)。
如果在可用应用程序服务器列表中没有看到Tomcat,请检查通用Intellij设置窗格中的插件:在最新版本中,越来越多的功能已经成为了“可插拔”的,甚至一些非常基本的功能可能会被禁用;这个插件称为“Tomcat integration”。

最后,JSP 文件不一定需要位于 WEB-INF 目录下才能进行调试。


30

如果要进行远程JSP调试(也适用于localhost),您需要安装JSR45支持插件请注意,此功能仅受IntelliJ的Ultimate版本支持,而不是社区版本。

  1. 进入 Preferences > Plugins,搜索JSR45插件并启用。

  2. 创建运行配置:Run > Run Configuration > 点击+按钮,选择JSR45 Compatible Server,在打开的对话框中选择Remote,设置服务器主机和端口。将Application Server: Generic设置为可行。

  3. 确保您在Startup/Configuration > Debug中设置了正确的端口。

  4. 打开模块设置(在项目文件夹上按F3),在Facets下添加一个Web Facet,在Web Resource Directories下指定您的JSP根文件夹。

  5. 点击Configuration...按钮,选择包含JSP依赖项的bean、类和库的文件夹。

现在JSP断点应该可以工作了,前提是您使用适当的调试参数启动了服务器。

如果您有一个启用自动导入的Maven项目,则可能需要禁用自动导入,因为每次触发自动导入时,库设置都将被重置。

另请参见:


2
在第一步完成后,重新启动Idea。 此功能仅适用于Idea Ultimate。 - Amit G
5
你能否更新一下这个内容,因为似乎有些名称和用户界面已经发生了改变?更新到2018年的版本。 - shinzou
@AmitG 有没有什么方法可以在Community版中调试JSP? - Gaurav
"Preferences" 在2018年被翻译为 "设置"。 - Brett Slocum

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

1
谢谢这个提示!我无法在运行mvn tomcat:run时进行调试。当我使用本地tomcat运行配置时,我能够调试jsps。 - Jay

1
请确保您的Tomcat的conf/web.xmlsuppressSmap未启用,因为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。


1
如果您正在使用Intellij调试器,可以在JSP中设置断点,并通过评估表达式this.jspContext.request.getAttribute("attributeName")来获取单个属性的值。
请注意,这可能会返回Java Object类型,并且您可能需要将其强制转换为正确的类型。此外,如果您启动一个远程Tomcat,则IDEA不会命中任何断点,因此您需要从IDEA中以调试模式启动Tomcat。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接