【问题标题】:Creating liferay portlet - How to pass data to to myScript.js from Java class via view.jsp创建 liferay portlet - 如何通过 view.jsp 从 Java 类将数据传递给 myScript.js
【发布时间】:2013-10-04 13:55:46
【问题描述】:

我正在开发 Liferay Portlet,但遇到了一些问题。我想要实现的是访问在 java 类中呈现页面时创建的一些数据并将其传递给我的 JavaScript。我认为我的问题是我对变量范围的理解。

我已经从这两个中弄清楚了如何在 view.jsp 文件中将变量传递给 JavaScript:

Creating liferay portlet - how to pass data to view.jsp from Java class?

http://www.opensource-techblog.com/2012/08/creating-custom-liferay-mvc-portlet.html

我现在拥有的:

java-servlet 类:

public class TestPortlet extends MVCPortlet {

  @Override
  public void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
    renderRequest.setAttribute("test_variable_actionRequest_setAttribute", "TestValue");
    super.doView(renderRequest, renderResponse);
  }
}

我的view.jsp:

<%@page%>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>

<portlet:defineObjects />
<%
  String testVariable = (String)renderRequest.getAttribute("test_renderRequest_setAttribute");
%>

<b><%= testVariable %></b>
<script type="text/javascript">
  $(document).ready(function() {
    myNamespace.control.init();
  });
</script>

testVariable 的打印在这里起作用,打印出“TestValue”作为唯一的输出。

我的 control.js:

var myNamespace = myNamespace || {};
myNamespace.control = (function($, OL, ns) {
  "use strict";
  function init() {
    //How on earth do I access the variable here?
    console.log(testVariable); // error: testVariable not defined
    console.log(renderRequest.getAttribute("test_renderRequest_setAttribute")); // error: renderRequest not defined
  }      
  // public interface
  return {
    init : init,
  };
}());

我在这里的想法是,我显然对这些变量的范围和 renderRequest 对象的工作方式非常迷茫。我确定解决方案很简单,但我似乎找不到它。

【问题讨论】:

    标签: java javascript jsp servlets


    【解决方案1】:

    您在上面所做的并不是创建一个名为 testVariable 的 javascript 变量。您只是将 HTML 中 Java 变量 testVariable 的值打印为粗体文本,而不是打印到 javascript 中。

    我想你想要的是:

     <script type="text/javascript">
       var testVariable  = "<%= testVariable %>";
       $(document).ready(function() {
         myNamespace.control.init();
       });
     </script>
    

    至于在javascript中使用*renderRequest.getAttribute("test_renderRequest_setAttribute")*,我对liferay了解不多,所以我不知道renderRequest是否通过一些javascript库在javascript端以某种方式定义liferay,但直觉上我猜它只在 Java 端定义。

    【讨论】:

    • 感谢您的回答。我认为你是正确的,它只能在渲染阶段访问服务器端。难道没有更常见的简单方法可以从 servlet 传递变量/对象等以供 JavaScript 访问吗?您在这里写的内容并不像推荐的编码实践那样让我印象深刻。我应该考虑 Ajax 吗?
    • Cookies、Ajax 或者这是我所知道的唯一方法。
    • 好的。再次感谢您的回答! :)
    猜你喜欢
    • 2011-10-17
    • 2014-06-13
    • 1970-01-01
    • 2022-06-18
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多