Как предоставить данные JSON в дерево Dojo с использованием инфраструктуры Struts2 - PullRequest
1 голос
/ 22 марта 2011

В настоящее время я занимаюсь разработкой веб-приложения с использованием инфраструктуры Struts2. Это приложение требует динамического обновления объектов на экране на основе данных, полученных из другого приложения.

В данный момент я хотел бы реализовать динамическое древовидное представление, узлы которого периодически обновляются данными, предоставленными классом Action. Я пытаюсь сделать это с помощью объекта dojo.dijit.tree из набора инструментов dojo. Мне известно, что я могу сделать это с помощью тегов dojo, которые являются частью структуры Struts, однако в ней отсутствует большая часть необходимой мне функциональности (постоянство, динамическое открытие и закрытие веток и т. Д.), Поэтому я выбрал использование вместо этого инструментарий Dojo.

Моя проблема с dojo.dijit.tree заключается в том, что я не знаю, как предоставить его данные, используя тип результата JSON. Я уже создал класс, который возвращает тип результата JSON с той же структурой, которая требуется компоненту дерева dojo. Я проверил генерацию дерева додзё с использованием файла «test.txt», который был сгенерирован классом, и он работает, как и ожидалось. Однако я хотел бы передать данные JSON непосредственно в компонент dojo.dijit.tree без сохранения файла на диске. Когда я выполняю приложение, я получаю окно «сохранить как», чтобы сохранить возвращенный результат JSON.

Это мой файл struts.xml:

<struts>
<constant name="struts.devMode" value="true" />

<package name="default" namespace="/" extends="struts-default">                     

    <action name="devResult" class="gui.JsonAction">                        
        <result name="success">/start1.jsp</result>                         
    </action>

</package>


<package name="example" namespace="/" extends="json-default">              

    <result-types>
        <result-type name="json" class="org.apache.struts2.json.JSONResult"></result-type>
    </result-types>  

    <action name="getJSONResult" class="gui.JsonAction">
        <result type="json"/>           
    </action>

</package>

Это файл JSP, который отображает дерево:

<head>
<title>Testing Tree</title>    

<style type="text/css">
  @import "js/dojo/dojo/resources/dojo.css";
  @import "js/dojo/dijit/themes/nihilo/nihilo.css";
</style>

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"
        djConfig="isDebug: true,parseOnLoad: true">
</script>

<script type="text/javascript">
    dojo.require("dojo.data.ItemFileReadStore");
    dojo.require("dijit.Tree");
    dojo.require("dojo.parser");        
</script>

<body class="nihilo">
    The Tree:<br><br>

    <s:url id="devResult" action="jsonAction.action"></s:url>
    <div dojoType="dojo.data.ItemFileReadStore" href="%{devResult}" jsid="popStore" />
    <div dojoType="dijit.Tree" store="popStore" labelAttr="sname" label="Tree" />
</body>

Это класс Action, который выдает результат JSON:

public class JsonAction extends ActionSupport {

private static final long serialVersionUID = 7392602552908646926L;
private String label = "name";
private String identifier = "name";
private List<ChildrenClass> items = new ArrayList<ChildrenClass>();

public JsonAction() {
    ChildrenClass item1 = new ChildrenClass("name1", "cat");
    ChildrenClass item2 = new ChildrenClass("name2", "cat");
    ChildrenClass item3 = new ChildrenClass("name3", "cat");
    ChildrenClass item4 = new ChildrenClass("name4", "cat");

    items.add(item1);
    items.add(item2);
    items.add(item3);
    items.add(item4);
}

public String execute() {       
    return SUCCESS;
}

public void setLabel(String label) {
    this.label = label;
}

public String getLabel() {
    return label;
}

public void setIdentifier(String identifier) {
    this.identifier = identifier;
}

public String getIdentifier() {
    return identifier;
}   

public void setItems(List<ChildrenClass> lists) {
    this.items = lists;
}

public List<ChildrenClass> getItems() {
    return items;
}

} * * тысяча двадцать-один

Это дочерний класс, который используется в вышеприведенном классе:

public class ChildrenClass {

private String name;
private String type;
private ChildrenClass[] children; 

public ChildrenClass() {
    name = "DefaultName";
    type = "DefaultType";
}

public ChildrenClass(String aName, String aType) {
    name = aName;
    type = aType;
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setType(String type) {
    this.type = type;
}

public String getType() {
    return type;
}

public void setChildren(ChildrenClass[] children) {
    this.children = children;
}

public ChildrenClass[] getChildren() {
    return children;
}

}

Я бы хотел попросить читателя stackoverflow указать, как мне выполнить чтение JSON-данных в файле jsp, чтобы заполнить дерево dojo. Кроме того, я хотел бы спросить, как я могу периодически обновлять его содержимое.

PS: Если у кого-то есть лучший способ реализовать нечто подобное, я был бы рад получить ваши комментарии.

Заранее спасибо.

1 Ответ

0 голосов
/ 23 марта 2011

Я нашел способ передачи данных непосредственно из результата JSON в компонент dojo.dijit.tree.Установка параметра "url" для имени действия, которое возвращает тип результата json.

Это мое новое тело файла .jsp:

Simple Tree:<br><br>
<div dojoType="dojo.data.ItemFileReadStore" url=getJSONResult handleAs="json" jsid="popStore" />
<div dojoType="dijit.Tree" store="popStore" labelAttr="sname" label="PID 512" />                        
...