2016-10-25 1 views
0

Я пытаюсь создать дерево додзе, пока что с данными теста. Боб всегда возвращает то же самое. Когда я помещаю данные в файл внутри ресурсов nsf, он работает. Используя компонент, он терпит неудачу. Он отображает только слово «Континент», и я не могу открыть и опустить узел.Застрял, пытаясь использовать customRestService и serviceBean для дерева dojo в XPages

Может кто-нибудь помочь мне? Я был бы очень признателен!

Мой код, где работает store2, ошибки store1 из и store0 только показывает континент:

   <xe:restService id="restService1" pathInfo="treeData"> 
        <xe:this.service> 
         <xe:customRestService serviceBean="com.sefip.TreeData" requestContentType="application/json" requestVar="tree"></xe:customRestService> 
        </xe:this.service> 
       </xe:restService> 
       <!-- 
        xp:text disableTheme="true" value="#{javascript:getBoxValue(compositeData.boxName)}" styleClass="readonly" style="margin-top:2px"> 
        <xp:this.rendered><![CDATA[#{javascript:getBoxValue(compositeData.boxName)}]]></xp:this.rendered> </xp:text> <xp:div id="boxTree" 
        dojoType="dijit.Tree"></xp:div 
       --> 

       <xp:scriptBlock id="scriptBlock2"> 
        <xp:this.value><![CDATA[ 
    dojo.require("dojox.data.JsonRestStore"); 
    dojo.require("dojo.store.JsonRest"); 
    dojo.require("dojo.data.ItemFileReadStore"); 
    dojo.require("dijit.tree.ForestStoreModel"); 
    dojo.require("dijit.Tree"); 

    dojo.addOnLoad(function() { 

// Create a data store to retrieve data from 

     var store0 = new dojox.data.JsonRestStore({ 
      //url: "countries.json" 
      target: "aCRM2.xsp/treeData/", 
      labelAttribute: "name" 
     }); 

     var store1 = new dojo.store.JsonRest({ 
      target: "aCRM2.xsp/treeData/", 
      labelAttribute: "name" 
     }); 

     var store2 = new dojo.data.ItemFileReadStore({ 
      url: "countries.json" 
     }); 


// secondly we create a treeModel. 
     var treeModel = new dijit.tree.ForestStoreModel({ 
      store: store0, 
      query: {type: "continent"}, 
      rootId: "root", 
      rootLabel: "Continents", 
      childrenAttrs: ["children"] 
     }); 

// Last but not least we create a new instance of our tree. 
     var tree= new dijit.Tree({ 
      model: treeModel 
     }, 
     "#{id:treeOne}"); 
    }); 
    ]]></xp:this.value> 
       </xp:scriptBlock> 

       <!-- The domnode we will use to render the tree --> 
       <xp:div id="treeOne" /> 

      </xp:div> 

countries.json содержит:

{ 
    "items" : [{ 
      "id" : "EU", 
      "children" : [{ 
        "_reference" : "NL" 
       } 
      ], 
      "type" : "continent", 
      "name" : "Europe" 
     }, { 
      "id" : "NL", 
      "type" : "country", 
      "name" : "Netherlands" 
     } 
    ], 
    "label" : "name", 
    "identifier" : "id" 
} 

Компонент генерирует точно такой же, но для полноты Я добавлю здесь код:

package com.sefip; 

import java.io.IOException; 
import java.util.Map; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.ibm.commons.util.io.json.JsonException; 
import com.ibm.commons.util.io.json.JsonGenerator; 
import com.ibm.domino.services.ServiceException; 
import com.ibm.domino.services.rest.RestServiceEngine; 
import com.ibm.jscript.InterpretException; 
import com.ibm.jscript.JSContext; 
import com.ibm.jscript.json.JsonJavaScriptFactory; 
import com.ibm.jscript.std.ArrayObject; 
import com.ibm.jscript.std.ObjectObject; 
import com.ibm.jscript.types.FBSUtility; 
import com.ibm.xsp.extlib.component.rest.CustomService; 
import com.ibm.xsp.extlib.component.rest.CustomServiceBean; 
import com.ibm.xsp.util.JavaScriptUtil; 

public class TreeData extends CustomServiceBean { 

    @Override 
    public void renderService(CustomService service, RestServiceEngine engine) throws ServiceException { 

     HttpServletRequest request = engine.getHttpRequest(); 
     HttpServletResponse response = engine.getHttpResponse(); 
     String method = request.getMethod(); 

     response.setHeader("Content-Type", "application/json; charset=UTF-8"); 

     if (method.equals("GET")) { 
      this.get(engine); 
     } else if (method.equals("POST")) { 
      this.post(engine, request); 
     } else { 
      this.other(engine); 
     } 
    } 

    public void get(RestServiceEngine engine) { 
     HttpServletResponse response = engine.getHttpResponse(); 
     try { 
      JSContext jsContext = JavaScriptUtil.getJSContext(); 
      JsonJavaScriptFactory factory = new JsonJavaScriptFactory(jsContext); 
      String json = null; 
      ObjectObject returnJSON = new ObjectObject(); 
      returnJSON.put("identifier", FBSUtility.wrap("id")); 
      returnJSON.put("label", FBSUtility.wrap("name")); 
      ArrayObject countries = new ArrayObject(); 
      ObjectObject continent = new ObjectObject(); 
      continent.put("id", FBSUtility.wrap("EU")); 
      continent.put("name", FBSUtility.wrap("Europe")); 
      continent.put("type", FBSUtility.wrap("continent")); 
      ArrayObject children = new ArrayObject(); 
      ObjectObject child = new ObjectObject(); 
      child.put("_reference", FBSUtility.wrap("NL")); 
      children.addArrayValue(child); 
      continent.put("children", children); 
      countries.addArrayValue(continent); 
      ObjectObject country = new ObjectObject(); 
      country.put("id", FBSUtility.wrap("NL")); 
      country.put("name", FBSUtility.wrap("Netherlands")); 
      country.put("type", FBSUtility.wrap("country")); 
      countries.addArrayValue(country); 
      returnJSON.put("items", countries); 
      UserData.get().addLog("call generator"); 
      json = JsonGenerator.toJson(factory, returnJSON); 
      UserData.get().addLog(json); 
      response.getWriter().write(json); 
      response.getWriter().close(); 
      return; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterpretException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void post(RestServiceEngine engine, HttpServletRequest request) { 
     HttpServletResponse response = engine.getHttpResponse(); 
     Map parameters = request.getParameterMap(); 
     try { 
      response.getWriter().write("post()"); 
      response.getWriter().write(request.getParameter("form")); 
      String[] form = (String[]) parameters.get("form"); 
      String val = form[0]; 
      response.getWriter().write(val); 
      response.getWriter().close(); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 

    } 

    public void other(RestServiceEngine engine) { 
     HttpServletResponse response = engine.getHttpResponse(); 
     try { 
      response.getWriter().write("other()"); 
      response.getWriter().close(); 
      return; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Все это в значительной степени основано на работе d один из них - Jeroen Somhorst и другие, см. http://www.jeroensomhorst.eu/uncategorized/viewpanel-vs-dijit-tree-part-1/ и часть 2.

PS Dank je, Jeroen, maar waar is part-3 ?? ;-)

+0

Есть ли ошибки в консоли сервера? Если вы откроете инструменты разработчика своего браузера, что вы видите? Что возвращает вызов? – jjtbsomhorst

+0

Ошибок в журнале, программе чтения журналов или в инструментах разработчика нет. Второй вызов возвращает точно так же, как и содержимое файла country.json. См. Метод get() выше. Я также вижу в Devtools/Network, что json передан, поэтому все кажется правильным. С store2 в модели он работает. С store0 это не так. –

+0

Вы проверили этот URL http://www.ibm.com/developerworks/java/library/wa-jsonreststore/?ca=drs-? – jjtbsomhorst

ответ

2

Наконец-то нашли решение.

Оказывается, что структура для JsonRestStore должна быть вложенным массив с объектами и детьми, как это:

[{ 
    "id" : "EU", 
    "children" : [{ 
     "id" : "NL", 
     "type" : "country", 
     "name" : "Netherlands" 
     }], 
    "type" : "continent", 
    "name" : "Europe" 
}] 

Простой и простой ...

Спасибо Jeroen, за ссылку, комментарии там показали мне этот путь.

Смежные вопросы