【问题标题】:Sending dynamically generated javascript file发送动态生成的 javascript 文件
【发布时间】:2011-09-03 14:39:58
【问题描述】:

背景:

我有一个 servlet,我在其中动态生成 javascript 并将其放入变量 script。然后我将响应内容类型设置为text/javascript 并将脚本发送给客户端:

resp.setContentType("text/javascript");
resp.getWriter().println(script);

问题:

浏览器确实下载了 javascript 文件,但 它无法识别文件中的函数。如果我创建一个静态 javascript 文件并改用它,它可以正常工作。

问题:

应该怎么做才能使浏览器将来自 servlet 的响应视为常规 javascript 文件?

感谢您的帮助。

【问题讨论】:

  • 它应该可以正常工作。你到底是如何包括它的?如果直接在浏览器地址栏中输入servlet的URL请求响应看起来不错?
  • 听起来您的问题可能出在客户端,您是如何包含脚本的?
  • 响应是有效的 JavaScript 吗?检查您的浏览器错误日志;我倾向于进行单元测试,用 Rhino 解析生成的脚本,作为健全性检查。客户端是否接收到 Content-Type 标头?我遇到过资源管理器/VIP/反向代理会重写我精心设计的标头并在其中注入各种基于规则的垃圾的情况。如果是这样,请尝试使用 .js 结束 servlet 映射。提及浏览器、servlet 容器等可能会有所帮助。
  • @Nicklas 以下是我包含脚本的方式:
  • @BalusC 是的,它看起来不错。唯一的问题是所有内容都出现在一行中,没有任何换行符。

标签: java javascript servlets


【解决方案1】:

它应该可以正常工作。我怀疑您只是以错误的方式包含它或过早调用该函数或响应内容格式错误。

我刚刚做了一个快速测试:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>SO question 6156155</title>
        <script src="javaScriptServlet"></script>
        <script>test()</script>
    </head>
    <body>
    </body>
</html>

@WebServlet(urlPatterns={"/javaScriptServlet"})
public class JavaScriptServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/javascript");
        response.getWriter().write("function test() { alert('peek-a-boo'); }");
    }

}

我明白了

【讨论】:

  • 再次感谢@BalusC!
  • 当我像您一样使用简单的警报时,它可以工作,但是当我编写大型 javascript 代码时,它就无法工作。请帮帮我。
  • @snj:如果您有新问题,只需按右上角的按钮。
【解决方案2】:

我认为这种方式更好。

<%@ page language="java" contentType="text/javascript; charset=UTF-8" pageEncoding="UTF-8"%>
alert('Pure JavaScript right here!');

在 JSP 中设置内容类型:

contentType="text/javascript; charset=UTF-8"

【讨论】:

    【解决方案3】:

    您如何在浏览器中引用此 servlet?

    如果您想在 HTML 页面(现有页面)中包含它,您应该从页面的标签中引用它。

    例如。

    <html>
    <head>
    <script type='text/javascript' src='URL_TO_YOUR_SERVLET'></script>
    </head>
    </html>
    

    或者,如果您希望它作为 Ajax 调用的一部分执行,只需将响应传递给 eval 函数。

    否则,如果您只想发送输出并在浏览器中执行,您还需要发送 HTML 段。然后将您的 JS 包含在 body 标记中,作为脚本标记。

    例如。您的 servlet 使用内容类型 'text/html' 发送以下内容:

    <html>
    <body>
     <script type='text/javascript'>
         <!-- write your generated JS here -->
     </script>
    </body>
    </html>
    

    【讨论】:

      【解决方案4】:

      您总是可以将脚本“在线”写入网页。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多