【问题标题】:Access Spring MVC Model data in imported js file在导入的 js 文件中访问 Spring MVC 模型数据
【发布时间】:2015-06-08 17:10:55
【问题描述】:

我正在开发一个使用 Spring MVC 的项目,其中 java 作为后端,HTML(JSP)/CSS/JS 作为前端。 在我的 Java 控制器中,我正在向模型中添加数据,如下所示

model.addAttribute("someData", theData);

我可以像这样在 JSP 文件中轻松访问

${theData} or "${theData}"

对我来说问题是这只适用于我的 JSP 文件。我正在那里导入其他 css 和 js 文件,例如

<script src="<c:url value='/resources/javascript/main.js'/>"></script>

他们似乎无法访问模型。我知道客户端在运行时没有模型,但是服务器提供的 javascript 文件与 HTML/JSP 文件的服务方式相同,那么为什么这不起作用?或者有什么我必须使用的设置吗?

我意识到我的 JSP 文件中的内联 js 代码可以工作,但这不是很灵活,对我来说不是一个“真正的”解决方案。此外,我想避免额外调用服务器(如 AJAX)来获取我的数据。

感谢您的帮助!

【问题讨论】:

    标签: java javascript spring jsp spring-mvc


    【解决方案1】:

    ...但是 javascript 文件由服务器以与 HTML/JSP 文件相同的方式提供...

    不,这不是真的。 Web 服务器按原样提供静态 JavaScript、CSS 和 HTML 文件,无需处理。您示例中的 EL sn-p...

    <script src="<c:url value='/resources/javascript/main.js'/>"></script>
    

    ...仅根据您作为参数提供给函数的相对 URL 生成具体 URL。没有关于 main.js 是什么或做什么的知识。您的 JSP 文件由 Java servlet 容器显式处理。这就是它了解您的应用程序、bean、模型和所有内容的原因。这是一个严重的过度简化,但希望它能够理解这一点。

    编辑

    您可以在 JSP 中使用来自静态文件的 JSON,但您必须在应用程序的 bean 中读取、处理和存储它们作为 Java 对象。不过,我不确定您为什么要这样做,因为通过 JavaScript 读取 JSON 数据非常容易。

    【讨论】:

    • 谢谢,我认为可能有一种方法可以处理 js 文件,如 ths JSP 文件。所以唯一的方法就是使用内联脚本。不是一个非常优雅的解决方案:(但感谢您的解释。
    • 你到底想对你的 JavaScript 文件做什么?您是否尝试在运行时动态生成它们?
    • 是的,不错。我的模型中的数据会不时更改,每当用户打开网页时,它都会绘制一些图表,这些图表应始终包含(此时)当前数据。这些图表是用 js 制作的,所以我需要那里的数据。最简洁的方法是简单地编写类似 var data = "${theData}" 的内容,然后让 spring 插入数据。在重新加载之前不必更改。
    • 我认为在这里做的更好的事情是创建一个控制器方法,它只返回在运行时生成的 JSON 数据,然后让 JavaScript 函数使用它。这样可以更安全地处理数据。
    • @CodeO - is 有一种方法可以处理 js、css 以及像 jsp 文件这样的任何文件,但该过程所做的远不止替换变量和结果通过它运行 js 或 css 会使这些类型的文件无法使用。编写您自己的仅执行变量替换的处理器(在我看来)并不难。
    【解决方案2】:

    willOEM 给了你一个很好的背景。因此静态文件不知道模型值,但也没有必要这样做,因为您始终可以编写自己的出路。

    如果您在 jsp 中从 main.js 调用任何函数,那么此时您应该使用 ${theData} 作为函数参数。如果没有,您总是可以在 dom 元素上使用数据属性,将模型变量存储在那里,然后在 js 文件中访问它,例如

    <div data-the-data="${theData}">Lorem ipsum</div>
    

    【讨论】:

    • 我发现使用 data-* 这样的数据属性非常有用,比制作 s--- up 并将数据隐藏在页面中的某个位置要好得多。
    【解决方案3】:

    我现在通过在 html 文档中定义数据绑定内联来“解决”它

    var theData = "{theData}";
    

    然后在我的标准 javascript 文件中使用它。 不是很完美,但似乎是最好的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2023-04-06
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多