简体   繁体   中英

unable to display tree in jsp using recursion in JSTL

I am having a class MemberSale which has List of MemberSales Object. My requirement is. i want to create jsp file based on object.

I am getting SalesMember Object from Database and based on the list i need to view it in jsp. For this i have use custom JSTL lib.

the code that i have tried is, but i am not getting expected output

public class SalesPointTagLibHandler extends TagSupport {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private SalesMember salesMember;

    @Override
    public int doStartTag() throws JspException {
        JspWriter out = pageContext.getOut();
        displaySaleMember(out, salesMember,1);

        return SKIP_BODY;
    }

    public void displaySaleMember(JspWriter out, SalesMember salesMember,int n) {
        try {
            List<SalesMember> children = salesMember.getChildren();
            if (salesMember.getParent() == null) {
                String entryString = "<div id=\"wrapper\"><span class=\"label\">" + salesMember.getName() + "</span>";
                String lvString = "<div class=\"branch lv"+n+"\">";
                System.out.println(entryString);
                System.out.println(lvString);
                out.println(entryString);
                out.println(lvString);
                n=n+1;
            }
            else if((children==null ||children.isEmpty()) && salesMember.getParent().getChildren().size()==1){
                String entryString="<div id=\"entry sole\"><span class=\"label\">" + salesMember.getName() + "</span></div>";
                System.out.println(entryString);
                out.println(entryString);
                n=n-1;
            }
            else{
                String entryString="<div id=\"entry\"><span class=\"label\">" + salesMember.getName() + "</span>";
                String lvString = "<div class=\"branch lv"+n+"\">";
                System.out.println(entryString);
                System.out.println(lvString);
                out.println(entryString);
                out.println(lvString);
                n=n+1;
            }

            if(children!=null && !children.isEmpty()){
            for(int i=0;i<children.size();i++){
                displaySaleMember(out,children.get(i),n);
            }
            }

            System.out.println("</div></div>");
            out.println("</div></div>");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public SalesMember getSalesMember() {
        return salesMember;
    }

    public void setSalesMember(SalesMember salesMember) {
        this.salesMember = salesMember;
    }

}

expected output : jsp file

<div class="sales">
<div id="wrapper"><span class="label">Root</span>//done
  <div class="branch lv1">//done
    <div class="entry"><span class="label">Entry-1</span>//done
      <div class="branch lv2">//done
        <div class="entry"><span class="label">Entry-1-1</span>//done
          <div class="branch lv3">//done
            <div class="entry sole"><span class="label">Entry-1-1-1</span></div>//done
          </div>//done
        </div>//done
        <div class="entry"><span class="label">Entry-1-2</span>
          <div class="branch lv3">
            <div class="entry sole"><span class="label">Entry-1-2-1</span></div>
          </div>
        </div>
        <div class="entry"><span class="label">Entry-1-3</span>
          <div class="branch lv3">
            <div class="entry sole"><span class="label">Entry-1-3-1</span></div>
          </div>
        </div>
      </div>
    </div>
    <div class="entry"><span class="label">Entry-2</span></div>
    <div class="entry"><span class="label">Entry-3</span>
      <div class="branch lv2">
        <div class="entry"><span class="label">Entry-3-1</span></div>
        <div class="entry"><span class="label">Entry-3-2</span></div>
        <div class="entry"><span class="label">Entry-3-3</span>
          <div class="branch lv3">
            <div class="entry"><span class="label">Entry-3-3-1</span></div>
            <div class="entry"><span class="label">Entry-3-3-2</span>
              <div class="branch lv4">
                <div class="entry"><span class="label">Entry-3-3-2-1</span></div>
                <div class="entry"><span class="label">Entry-3-3-2-2</span></div>
              </div>
            </div>
            <div class="entry"><span class="label">Entry-3-3-3</span></div>
          </div>
        </div>
        <div class="entry"><span class="label">Entry-3-4</span></div>
      </div>
    </div>
    <div class="entry"><span class="label">Entry-4</span></div>
    <div class="entry"><span class="label">Entry-5</span></div>
  </div>
</div>
</div>

SalesMember.java

import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "salesmember")
public class SalesMember {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @Column(name = "name")
    private String name;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "parent")
    private SalesMember parent;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "children", joinColumns = @JoinColumn(name = "memberId"), inverseJoinColumns = @JoinColumn(name = "childId"))
    private List<SalesMember> children;

    public SalesMember() {
        // TODO Auto-generated constructor stub
    }



    public SalesMember(String name) {
        super();
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public SalesMember getParent() {
        return parent;
    }

    public void setParent(SalesMember parent) {
        this.parent = parent;
    }

    public List<SalesMember> getChildren() {
        return children;
    }

    public void setChildren(List<SalesMember> children) {
        this.children = children;
    }

}

Could you please add you logic to view it.

also i am posting SaleMember Object for your reference

public ModelAndView getRootElement(){
        SalesMember root = new SalesMember("Root");
        SalesMember entity1 = new SalesMember("Entity-1");
        SalesMember entity2 = new SalesMember("Entity-2");
        SalesMember entity3 = new SalesMember("Entity-3");
        SalesMember entity4 = new SalesMember("Entity-4");
        SalesMember entity5 = new SalesMember("Entity-5");


        SalesMember entity1_1 = new SalesMember("Entity-1-1");
        SalesMember entity1_1_1 = new SalesMember("Entity-1-1-1");
        List<SalesMember> entity1_1_Children=new ArrayList<>();
        entity1_1_Children.add(entity1_1_1);
        entity1_1.setChildren(getChildrenList(entity1_1_Children,entity1_1));



        SalesMember entity1_2 = new SalesMember("Entity-1-2");
        SalesMember entity1_2_1 = new SalesMember("Entity-1-2-1");
        List<SalesMember> entity1_2_Children=new ArrayList<>();
        entity1_2_Children.add(entity1_2_1);
        entity1_2.setChildren(getChildrenList(entity1_2_Children,entity1_2));

        SalesMember entity1_3 = new SalesMember("Entity-1-3");
        SalesMember entity1_3_1 = new SalesMember("Entity-1-3-1");
        List<SalesMember> entity1_3_Children=new ArrayList<>();
        entity1_3_Children.add(entity1_3_1);
        entity1_3.setChildren(getChildrenList(entity1_3_Children,entity1_3));


        List<SalesMember> entity1_Children=new ArrayList<>();
        entity1_Children.add(entity1_1);
        entity1_Children.add(entity1_2);
        entity1_Children.add(entity1_3);

        entity1.setChildren(getChildrenList(entity1_Children,entity1));




        SalesMember entity3_1 = new SalesMember("Entity-3-1");
        SalesMember entity3_2 = new SalesMember("Entity-3-2");
        SalesMember entity3_3 = new SalesMember("Entity-3-3");
        SalesMember entity3_4 = new SalesMember("Entity-3-4");


        SalesMember entity3_3_1 = new SalesMember("Entity-3-3-1");
        SalesMember entity3_3_2 = new SalesMember("Entity-3-3-2");
        SalesMember entity3_3_3 = new SalesMember("Entity-3-3-3");



        SalesMember entity3_3_2_1 = new SalesMember("Entity-3-3-2-1");
        SalesMember entity3_3_2_2 = new SalesMember("Entity-3-3-2-2");
        List<SalesMember> entity3_3_2_Children=new ArrayList<>();
        entity3_3_2_Children.add(entity3_3_2_1);
        entity3_3_2_Children.add(entity3_3_2_2);
        entity3_3_2.setChildren(getChildrenList(entity3_3_2_Children,entity3_3_2));


        List<SalesMember> entity3_3_Children=new ArrayList<>();
        entity3_3_Children.add(entity3_3_1);
        entity3_3_Children.add(entity3_3_2);
        entity3_3_Children.add(entity3_3_3);
        entity3_3.setChildren(getChildrenList(entity3_3_Children,entity3_3));

        List<SalesMember> entity3_Children=new ArrayList<>();
        entity3_Children.add(entity3_1);
        entity3_Children.add(entity3_2);
        entity3_Children.add(entity3_3);
        entity3_Children.add(entity3_4);


        entity3.setChildren(getChildrenList(entity3_Children,entity3));


        List<SalesMember> root_Children=new ArrayList<>();
        root_Children.add(entity1);
        root_Children.add(entity2);
        root_Children.add(entity3);
        root_Children.add(entity4);
        root_Children.add(entity5);
        root.setChildren(getChildrenList(root_Children,root));

        ModelAndView mav=new ModelAndView("salespoint");
        mav.addObject("root", root);

        return mav;
    }


    private List<SalesMember> getChildrenList(List<SalesMember> chilrenList,SalesMember salesMember){
        for(SalesMember s:chilrenList){
            s.setParent(salesMember);
        }

        return chilrenList;
    }

finally solved by own. after debugging i updated below code

from

 if(children!=null && !children.isEmpty()){
    for(int i=0;i<children.size();i++){
      displaySaleMember(out,children.get(i),n);
    }
 }

 System.out.println("</div></div>");
 out.println("</div></div>");

To

for(int i=0;i<children.size();i++){
    displaySaleMember(out,children.get(i),n);
    if(children.get(i).getChildren()!=null){
        System.out.println("</div></div>");
        out.println("</div></div>");
    }
}   

and put this code in else block.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM