I just went through the same thing. In struts 2.1 there is a new href attribute 
on the tree tag. It points to an action that returns some json using the json 
plugin that gives all the info about the node. You should be able to use it in 
Struts 2.0.9 as well by using the dew dojo plugin and by using the json plugin. 
My code looks like this:

In my jsp I add a reference to the struts dojo tags in the new dojo plugin:

<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>

...
<s:url var="treeUrl" action="treeLookup" />
<sx:tree href="%{#treeUrl}" />


My action configuration for treeLookup is in a package extending json-default, 
to allow me to return json:

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

        ...

<action name="treeLookup"
        class="org.tds.eqd.website.actions.usermanager.UserManagerAction">
        <result type="json">
                <param name="root">options</param>
        </result>
</action>

</package>

Note that I made the root of my json the options parameter of my action. The 
options parameter gets turned into json automatically and gets sent back to the 
client.

The tree will call the treeLookup action passing a parameter called nodeId. 
When it's null, you return the root node. Otherwise return the children for the 
node passed.

public class UserManagerAction {

        private String nodeId;
        public String getNodeId() {
                return nodeId;
        }

        public void setNodeId(String nodeId) {
                this.nodeId = nodeId;
        }
        public Collection<TreeBean> getOptions() {
                ...
        }
}

public class TreeBean {
        private final boolean hasChildren;
        private final String id;
        private final String label;

        public TreeBean(boolean hasChildren, String id, String label) {
                this.hasChildren = hasChildren;
                this.id = id;
                this.label = label;
        }
        public boolean isHasChildren() {
                return hasChildren;
        }
        public String getId() {
                return id;
        }
        public String getLabel() {
                return label;
        }
}

In the getOptions method you send back a collection of beans that have a label, 
an id, and whether or not they have children.

You could look up the node in hibernate using the id, then iterate over that 
nodes children and create beans for them.

The final format for the json should look something like:


[
 {
    label: "text of node1",
    id: "id1",
    hasChildren: true
 },
 {
    label: "text of node2",
    id: "id2",
    hasChildren: false
 }
]

See https://issues.apache.org/struts/browse/WW-1910 for more info. Remember to 
put the json and dojo plugins in you lib directory.


-----Original Message-----
From: Cosmin Stanciu [mailto:[EMAIL PROTECTED]
Sent: October 18, 2007 1:50 PM
To: Struts Users Mailing List
Subject: Re: <s:tree> and Hibernate

Yes! My Jsp file looks exactly like the one provided into the "Example 
Applications" (struts-2.0.9-apps.zip).
<script>
    function treeNodeSelected(nodeId) {
        dojo.io.bind({
            url: "<s:url value='/tags/ui/ajax/dynamicTreeSelectAction.action' 
/>?nodeId="+nodeId,
            load: function(type, data, evt) {
                var displayDiv = dojo.byId("displayId");
                displayDiv.innerHTML = data;
            },
        mimeType: "text/html"
        });
    };
    dojo.event.topic.subscribe("treeSelected", this, "treeNodeSelected");
</script>


<s:tree
    theme="ajax"
    rootNode="%{treeRootNode}"
    childCollectionProperty="children"
    nodeIdProperty="id"
    nodeTitleProperty="name"
    treeSelectedTopic="treeSelected">
</s:tree>

The tree works fine with the data provided in the example application but I 
can't make it work with the data received from my Hibernate layer. So I just 
want to know I should write the "ShowDynamicTreeAction.java".

Thank you!
Cosmin



----- Original Message ----
From: Dave Newton <[EMAIL PROTECTED]>
To: Struts Users Mailing List <user@struts.apache.org>
Sent: Thursday, October 18, 2007 7:27:32 PM
Subject: Re: <s:tree> and Hibernate

--- Cosmin Stanciu <[EMAIL PROTECTED]> wrote:
> Action tab the funtionality is not shown. :(

Are you filling tree data via Ajax (which the example
on the wiki isn't)?

d.


---------------------------------------
Hi!
I have been trying for a week now to populate one <s:tree> with the data from a 
database table but with no luck . I would really apreciate some guidance in how 
to write the ShowDynamicTreeAction class that sends the date to the tree.

I'm using Hibernate DAO to receive the data from my database table and it looks 
like this.
Category: id, name, parent_category_id (from a a recursive 1:n relation to the 
same table using the id).
The Hibernate generated object (Category.java) has the fallowing fields:
private Integer id;
private Category category;
private String name;
private Set categories = new HashSet(0);

In the CategoryDAO class I have all the methods needed to retreive data from 
the table:
- Category findById(int Id), List findById(int Id), List findParents() and I 
can add any needed method...

My struts.xml has a reference to the class showDynamicTreeAction:
        <action name="showDynamicTreeAction" 
class="struts2.ShowDynamicTreeAction">
            <result>/jsp/CategoryList.jsp</result>
        </action>

I'm sure that helping solving this issue would be of much interest for all 
those that intend to use s:tree in their application, as there no example or 
help regarding this matter on the internet.

Thanks a lot!
Cosmin



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around
http://mail.yahoo.com


********************
NOTICE OF CONFIDENTIALITY
This communication including any information transmitted with it is 
intended only for the use of the addressees and is confidential. 
If you are not an intended recipient or responsible for delivering 
the message to an intended recipient, any review, disclosure, 
conversion to hard copy, dissemination, reproduction or other use 
of any part of this communication is strictly prohibited, as is the 
taking or omitting of any action in reliance upon this communication. 
If you receive this communication in error or without authorization 
please notify us immediately by return e-mail or otherwise and 
permanently delete the entire communication from any computer, 
disk drive, or other storage medium.

If the above disclaimer is not properly readable, it can be found at 
www.td.com/legal
                                                           
AVERTISSEMENT DE CONFIDENTIALITE                   
Ce courriel, ainsi que tout renseignement ci-inclus, destiné uniquement 
aux destinataires susmentionnés,  est confidentiel.  Si vous 
n’êtes pas le destinataire prévu ou un agent responsable de la 
livraison de ce courriel, tout examen, divulgation, copie, impression, 
reproduction, distribution, ou autre utilisation d’une partie de ce 
courriel est strictement interdit de même que toute intervention ou 
abstraction à cet égard.  Si vous avez reçu ce message par erreur ou 
sans autorisation, veuillez en aviser immédiatement l’expéditeur par 
retour de courriel ou par un autre moyen et supprimer immédiatement 
cette communication entière de tout système électronique.

Si l'avis de non-responsabilité ci-dessus n'est pas lisible, vous 
pouvez le consulter à www.td.com/francais/legale

Reply via email to