JSP显示源代码而不是执行

Posted

技术标签:

【中文标题】JSP显示源代码而不是执行【英文标题】:JSP displaying source code instead of executing 【发布时间】:2011-06-09 12:27:23 【问题描述】:

我是 jsp 新手,遇到了一些麻烦。最初,在测试 Tomcat 服务器上构建和测试了 jsp 文件和相关的 java 类。现在,它们已经转移到我认为相同设置的另一台服务器(除了它现在是 linux 而不是 windows)。但是当访问 jsp 页面时,显示的是源代码,而不是实际执行的 jsp。我用谷歌搜索了一段时间,但没有成功。

这是我正在测试的jsp文件的代码:

<html>
<BODY>
Hello!  The time is now <%= new java.util.Date() %>
</BODY>
</HTML>

这是我在导航到页面时在浏览器中看到的内容:

 Hello! The time is now <%= new java.util.Date() %> 

页面的来源是在示例文件中键入的确切代码:

<HTML>
<BODY>
Hello!  The time is now <%= new java.util.Date() %>
</BODY>
</HTML>

服务器似乎正在运行。以下是我从 Firebug 获得的响应标头:

Date    Sat, 15 Jan 2011 20:53:24 GMT
Server  Apache/2.2.3 (CentOS)
Last-Modified   Sat, 15 Jan 2011 02:20:18 GMT
Etag    "b385d8-55-499d931205c80"
Accept-Ranges   bytes
Content-Length  85
Content-Type    text/html; charset=UTF-8

我曾认为this page 可能会解决问题,因为在 WEB-INF 文件夹中的 web.xml 文件中没有引用我正在使用的 jsp 文件,甚至没有引用以下 sn-ps:

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>logVerbosityLevel</param-name>
        <param-value>WARNING</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
</servlet-mapping>

我尝试插入这些行并重新启动 Tomcat,但没有成功。有什么想法吗?

【问题讨论】:

您确定请求确实到达了 Tomcat?前面有另一个网络服务器吗? servlet 怎么样?它们有用吗? 您在 JSP 中到底有什么,您在浏览器中看到了什么? HTML 源代码中到底有什么? (在浏览器中单击鼠标右键,选择查看源代码)我很想知道您对“源代码”的确切含义。 JSP标签? JSTL 标签?埃尔?小脚本?甚至是 HTML?您不需要发布完整的代码,只需展示该行为的最小 JSP 文件就足够了。 @Thilo:如果请求没有到达 Tomcat,他就不会从 JSP 中看到任何东西,更不用说源代码了。然而,我希望 OP 将 JSP 文件放到另一个网络服务器而不是 Tomcat 中并不是那么愚蠢:) 当我在浏览器中输入jsp文件的地址时,显示的是jsp文件的源代码,而不是jsp执行。以下是我在浏览器中看到的前几行: @DJStroky:这还不够详细。您是在浏览器屏幕还是在 HTML 源代码中看到的那样?如果在浏览器屏幕中,则意味着它已作为text/plain 发送,或者&amp;lt;&amp;gt; 等以某种方式被HTML 转义(然后您应该看到&amp;lt;&amp;gt; 和以此类推在页面源代码中)。另外,我很想知道 HTTP 响应标头到底包含什么。请编辑您的问题,为我在此评论和之前评论中提出的所有问题添加答案。 【参考方案1】:

来自响应标头:

服务器 Apache/2.2.3 (CentOS)

这不是由Apache Tomcat 提供的,而是由Apache HTTPD 提供的。您根本没有将它部署到 Tomcat。

【讨论】:

"@Thilo:如果请求没有到达 Tomcat,他就不会从 JSP 中看到任何东西,更不用说源代码了。但是我希望 OP 并不是那么愚蠢将 JSP 文件放到另一个网络服务器而不是 Tomcat 中 :) " :-)【参考方案2】:

我刚刚遇到了同样的问题,这就是我偶然发现这篇文章的原因。对我来说,问题在于 CATALINA_HOME 和 CATALINA_BASE 之间的区别。我想很多人没有意识到这是两个不同的地方。在我的 Ubuntu 上,CATALINA_HOME 位于 /usr/share/tomcat6,但 CATALINA_BASE 位于 /var/lib/tomcat6。这很重要,因为您需要将 jsp 文件放在 CATALINA_BASE 中。所以,事实上,我会说 Tomcat 没有找到您的代码,即使您的浏览器找到了该文件并像其他文本文件一样愉快地为您显示它。

希望这可以帮助遇到同样问题的其他人——这是我第一次尝试在 *** 上发布答案。

【讨论】:

【参考方案3】:

看到“logVerbosityLevel”和“WARNING”的位置了吗?将警告更改为调试。您还可以找到您的 catalina.sh 脚本并找到您的 java 命令并确保标志 -DDEBUG 包含在启动选项中。

在完全调试模式下查看您的日志将告诉您在新服务器上启动 Tomcat 是否有任何问题。

例如,您可能缺少依赖项或依赖项冲突,而这些冲突未显示在信息量较少的日志记录级别。

最后,你尝试过简单的 JSP 测试页面吗?

      <% out.println("Hello"); %>

如果你把它放在一个 JSP 中并尝试加载它,你看到的是 JSP 还是输出?

您是否尝试过在请求中使用 Tomcat 端口?通常,这是 8080。我认为其中一位评论者提到了这种可能性。

【讨论】:

【参考方案4】:

迁移 java 6 --> 8, tomcat 5 --> 8 如果您在 app web.xml

中有类似的东西
<!--need this so that this work:  jsp:include page="WEB-INF...xxx.jspf-->
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jspf</url-pattern>
</servlet-mapping>

这将产生 JSP 显示源代码而不是在 tomcat 8 上执行,因为它似乎覆盖了 tomcat web xml 中关于 jsp 的内容。

解决办法是删除app web.xml中的这段代码,把所有东西都放到tomcat web.xml中,比如:

<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspx</url-pattern>
    <url-pattern>*.jspf</url-pattern>
</servlet-mapping>

【讨论】:

以上是关于JSP显示源代码而不是执行的主要内容,如果未能解决你的问题,请参考以下文章

在jsp页面中显示图像而不是图像url [复制]

NGINX 显示脚本代码而不是执行

浏览器显示 Python 代码而不是执行它

Apache 显示 PHP 代码而不是执行它

Apache 显示 PHP 代码而不是执行它

Apache 显示 PHP 代码而不是执行它