【问题标题】:liferay, jsf. How to javascript json object save to database利夫雷, jsf.如何将javascript json对象保存到数据库
【发布时间】:2013-12-16 13:45:46
【问题描述】:

在以下情况下需要一些帮助:

我已经将一个应用程序设置为 Liferay portlet,并且我正在使用 JSF/Primefaces 来构建我的视图。对于数据建模,我使用的是 Hibernate。

在某个视图中,我加载了一个所谓的“图像注释器”,它使用 Javascript 工具来收集用户输入(图像画布上的注释)。我希望能够将这些信息保存在文件/数据库中,然后在用户再次编辑特定图像时重新使用。

这是我的看法:

<h:head>
    <script src="#{facesContext.externalContext.requestContextPath}/js/OpenLayers.js" />
    <script src="#{facesContext.externalContext.requestContextPath}/js/image-viewer.js" />
    <script src="#{facesContext.externalContext.requestContextPath}/js/xml2js/xml2json.js" />
    <script src="#{facesContext.externalContext.requestContextPath}/js/xml2js/xml2json.min.js" />
    ...
</head>
...
<p:fieldset legend="Viewer">
    <p:outputPanel layout="block" styleClass="imageEditorImagePanel" />
</p:fieldset>
....

所以图像和相关的 jscript 工具(OpenLayers)被加载到 imageEditorPanel 占位符中。

The javascript code (image-viewer.js) gathers user input in a json (GEOJson) object, and this object i would like to pass to a back bean controller when Save button (jscript) is selected:

...
//define save button
var save = new OpenLayers.Control.Button({
        title: 'Save', text: 'Save',
        trigger: function(){

        var GEOJSON_PARSER = new OpenLayers.Format.GeoJSON();        
        var vectorLayerAsJson = GEOJSON_PARSER.write(vlayer.features);
        ...

所以我想将“vectorLayerAsJson”对象传递给 java 控制器(backbean)...

我正在尝试实现一个 ajax 调用,例如:

jQuery.ajax({
    type: 'POST',
    url: 'imageannotations',
    contentType: 'application/json',
    data: vectorLayerAsJson,
    success : function(data) { alert("success")}
});

任何人都可以帮助我如何提出这个 ajax 请求以及我将如何实现我的控制器类吗?

【问题讨论】:

    标签: ajax json jsf jsf-2 primefaces


    【解决方案1】:

    您可以使用primefaces p:remoteCommand 通过Javascript 发起对Java 托管bean 的调用。关于如何将字符串作为参数发送的答案可以在here找到。

    在托管 bean/java 控制器中,只有一个带有 getter/setter 的 String 变量和一个启动反序列化的操作方法(以下是未经测试的代码):

    @ManagedBean(name="testBean")
    public class Test {
      public String actionOnString() {
        String value = FacesContext.getCurrentInstance()
                         .getExternalContext().getRequestParameterMap().get("param");
      // do your unserialize and actions here
      return "";
      }
    }
    

    在 JSF 中有类似的东西

    <p:remoteCommand name="sendJSONToServer" action="#{testBean.actionOnString}" />  
    

    并作为 javascript 在所需位置

    sendJSONToServer({param: vectorLayerAsJson});
    

    应该做的工作。

    也可以通过PrimePush 使用athmosphere 框架直接进行ajax-push。可能,这对于您试图实现的目标来说可能是多余的。

    更新 1

    当然,当您获得序列化的 JSON 对象(即“n 字符串格式”)时,您必须在 Javascript 中对其进行 JSON 化 - 这个答案 "How to parse JSON in JavaScript" 可能会帮助您进一步了解这一点。

    希望对你有帮助...

    【讨论】:

    • 我不认为这正是我想要的,因为一切都是通过 javascript 构建的。实际上我只有一个占位符“imageEditorImagePanel”,它加载一个成像工具。这个成像工具有几个生成 json 对象的图像处理子工具。所以我想直接从我的javascript代码将json对象传递给托管bean。
    • 那么,您将做什么/您打算如何在服务器端接收 json 数据?只需通过 getter/setter 将其设置为 String 并从那里开始反序列化,这就是我们在以前的项目中所做的。
    • 是的,类似的东西。因为这是我第一次实现这样的功能,所以我想要实现的第一件事就是将我的 JSON 对象发布到 java bean。然后我要么在那里对其进行操作,要么在发送之前对其进行后处理。但是在这个阶段,我的兴趣点是进行适当的 ajax 后调用并通过我的后 bean 接收它!希望它足够清楚。
    • L-Ray,因为我是那个(JSON)的新手,我有一个新手问题:顺便提一下(我已经实现并且我成功地得到了 Json 字符串)我猜我是什么get 是实际 Json 对象的反序列化版本!真的吗?因此,为了稍后将其反馈给 javascript,我将不得不再次构建一个正确形式的 Json 对象。这也是真的吗?
    • 谢谢!最后一个:是否存在与 sendJSONToServer 类似的方法(jQuery?),用于从服务器获取 JSON 对象(反序列化)? getJSONFormServer 之类的东西?然后在我的后台bean中,我应该有一个方法返回一个字符串来发布JSON字符串和一个类似于我的xhtml中的 元素,以便从后台bean获取并发布到 javaascript 容器......
    猜你喜欢
    • 2017-06-22
    • 2020-02-03
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多