`
左博涯
  • 浏览: 60578 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

修改struts2-showcase动态树,改由从数据表中读取,并且用递归方式生成

阅读更多

系统采用Struts2+Spring+Hibernate架构,classpath分层结构如下图:

 

表结构如下图:

 

表映射为pojo为类Tree.java代码如下:

private Integer id;
	private String name;
	private String children;	
	private Tree parent;

	public Tree() {
		
	}
	
	

	public Tree(Integer id, String name, String children) {
		
		this.id = id;
		this.name = name;
	    this.children=children;
	}



	public Tree(Integer id, String name, String children, Tree parent) {
		this.id = id;
		this.name = name;
		this.children = children;
		this.parent = parent;
	}

//省略get,set }

 

 Hibernate映射文件tree.hbm.xml

<hibernate-mapping>
    <class name="zoboya.Tree" table="tree" >
       <id name="id" type="java.lang.Integer">
             <generator class="native" />
        </id>
        <property name="name" type="string">
            <column name="name" length="255" />
        </property>
         <property name="children" type="string">
            <column name="children" length="255" />
        </property>
        
         <many-to-one name="parent" class="zoboya.Tree" fetch="select">
            <column name="parentid" not-null="true" />
        </many-to-one>
  </class>
</hibernate-mapping>

 

TreeDao.java代码如下:

public class TreeDAO extends HibernateDaoSupport implements ITreeDAO  {
 private static final Log log = LogFactory.getLog(TreeDAO.class);

public Tree findById(java.lang.Integer id) {
		log.debug("getting Tree instance with id: " + id);
		try {
			Tree instance = (Tree) getSession().get("zoboya.Tree", id);
			return instance;
		} catch (RuntimeException re) {
			log.error("get failed", re);
			throw re;
		}
	}

//其它方法省略
}

 

 

节点类,Category

public class Category
{
  //保存了所有节点数据的Map
  private static Map<Long, Category> catMap = new HashMap<Long, Category>();
  //用作节点的id
  private long id;
  //用作节点的标题
  private String name;
  //包含子节点对象的列表
  private List<Category> children;

  
  public static Category getById(long id)
  {
    return catMap.get(id);
  }

  public Category(long id, String name,List<Category> children){
	  this.id=id;
	  this.name=name;
	  this.children=children;
	  catMap.put(id, this);
  }  
  
  public Category(long id, String name, Category... children)
  {
    this.id = id;
    this.name = name;
    //初始化Category对象的children属性,并放入子对象
    this.children = new ArrayList<Category>();
    for (Category child : children)
    {
      this.children.add(child);
    }

    catMap.put(id, this);
  }

  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 List<Category> getChildren()
  {
    return children;
  }

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

 

Service层的类TreeService

public class TreeService implements ITreeService {
	private ITreeDAO treeDao;

	public ITreeDAO getTreeDao() {
		return treeDao;
	}

	public void setTreeDao(ITreeDAO treeDao) {
		this.treeDao = treeDao;
	}

	
	
	 //递归方法
	 public Category createTree(Tree tree){		 
		 System.out.println("Name= "+tree.getName());
		//如果有儿子就循环调用自己去找,把找到的所有儿子生成一个list作为children加入到父中
		  List<Category> children=new ArrayList<Category>();
			if (tree.getChildren()!=null) {								
				String[] childrenId=tree.getChildren().split(",");
				for (int i = 0; i < childrenId.length; i++) {					
					//递归
					Tree branch=treeDao.findById(Integer.parseInt(childrenId[i]));
					Category child = createTree(branch);
					children.add(child);
				}
			}
			
		Category me=new Category(tree.getId(),tree.getName(), children);  
		  
		return me;
	  }

}

 

Action

public class ShowDynamicTreeAction extends ActionSupport
{
	private static final long serialVersionUID = 7437613038859411044L;
	private ITreeService treeService;
	private Category category;
	
	
	
               public Category getCategory() {
		return category;
	}



	public void setCategory(Category category) {
		this.category = category;
	}



@Override
	public String execute() throws Exception {
	    this.category =this.getTreeRootNode();
		return SUCCESS;
	}



public void setTreeService(ITreeService treeService) {
		this.treeService = treeService;
	}



public Category getTreeRootNode() 
  {	   Tree tree=new Tree(0,"ZH根目录","1,5");  //选择构造一个根目录,其子目录用逗号隔开!
	   System.out.println("开始递归!");
                return treeService.createTree(tree);
  }
    
}

 

在applicationContext.xml文件中加入

<!-- DAO -->
<bean id="treeDao" class="zoboya.struts2.dao.TreeDAO">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>

<!-- Services -->
<bean id="treeService" class="zoboya.struts2.service.TreeService">
		<property name="treeDao">
			<ref bean="treeDao"/>
		</property>
	</bean>
	
<!-- Action -->
<bean id="treeAction" class="zoboya.struts2.action.ShowDynamicTreeAction" singleton="false">
	  <property name="treeService">
			<ref bean="treeService"/>
		</property>
	</bean>
	

 

在struts.xml中加入

<action name="showDynamicTreeAction"
      class="treeAction">
        <result>/ajaxTags/treeTag/treeExampleDynamic.jsp</result>
     </action>

 

部署后访问以下地址就可以看到动态树了

http://localhost:8080/项目名/ajaxTags/treeTag/showDynamicTreeAction.action

 

 

 

 

分享到:
评论
1 楼 clwbeyond 2009-12-25  
你好,我将你的代码重新配置了一下,但是能跑起来了,主要有一个很奇怪的问题:
public Category getTreeRootNode() {
System.out.println("开始递归!");
Tree tree = treeDao.findById(0);
return treeService.createTree(tree);
}

这样子的话,提交一次:http://localhost:8080/InfoSystem/tree/showDynamicTreeAction.action
而上面的这代码执行两次,而树却没有显示出来。
如果用这代码:
public Category getTreeRootNode() {
System.out.println("开始递归!");
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
treeService = (TreeService)factory.getBean("treeService");
treeDao = (TreeDAO)factory.getBean("treeDao");
Tree tree = treeDao.findById(0);
return treeService.createTree(tree);
}
提交一次:http://localhost:8080/InfoSystem/tree/showDynamicTreeAction.action
而上面的上面的代码只执行一次,效果也如博主所说的一样。

请问博主,这是为什么呢?能不能将你的代码给我发一下clwbeyond@163.com,谢谢了。

相关推荐

    struts2-showcase.rar

    Struts2-showcase是一个用于演示和学习Apache Struts2框架功能的开源项目。这个压缩包“struts2-showcase.rar”包含了完整的源代码,旨在帮助开发者深入理解Struts2框架的工作原理及其各种特性。以下是对Struts2和...

    struts2-showcase-2.1.8.1.war

    struts2-showcase-2.1.8.1.warstruts2-showcase-2.1.8.1.warstruts2-showcase-2.1.8.1.warstruts2-showcase-2.1.8.1.warstruts2-showcase-2.1.8.1.war

    struts2-jquery-plug ShowCase

    在Struts2应用中使用jQuery Grid,可以轻松地处理服务器端的数据,实现动态加载和异步更新,提高数据展示的效率和用户体验。 `struts2-jquery-showcase-3.3.0.zip`可能包含了更多的jQuery插件示例,比如对话框、...

    strusts2包struts2-rest-showcase-2.1.8.war实现ModelDriven接口项目心得

    在本文中,我们将深入探讨如何使用Struts2的`ModelDriven`接口以及如何控制URL,以实现`struts2-rest-showcase-2.1.8.war`项目中的功能。 首先,`ModelDriven`接口是Struts2提供的一种设计模式,用于将Action类与...

    struts2-showcase.war

    struts2-showcase.war

    struts2-bootstrap-showcase-1.5.2.zip_Struts2标签库_bootstrap_bootst

    "struts2-bootstrap-showcase-1.5.2.zip"是一个整合了Struts2和Bootstrap的示例项目,它展示了如何在Struts2框架中使用Bootstrap库来创建具有现代界面的应用。 首先,Struts2标签库是Struts2框架的核心特性之一,它...

    struts2 的showcase,可直接导入到myeclise

    这个"struts2 的showcase"项目是Struts2官方提供的一个示例应用,它展示了Struts2框架的各种功能和特性,非常适合初学者学习和开发者参考。 首先,让我们深入了解Struts2的核心概念和主要特点: 1. **Action与...

    struts2 最新版 不用去官网上下载了

    Struts2是一个非常知名的Java Web开发框架,由Apache软件基金会维护。它基于MVC(Model-View-Controller)设计模式,极大地简化了Java Web应用程序的开发过程,提供了强大的功能和可扩展性。在标题和描述中提到的...

    Struts2VulsTools-Struts2系列漏洞检查工具

    要求配置条件比较苛刻,同时,一些特定版本没有看到有沙盒绕过,所以,目前exp只是基于S2-045改写的,所以exp并不是所有版本都能用,正常情况下Struts 2.3.5-2.3.31,Struts 2.5-2.5.10版本可以使用此exp。...

    Struts Showcase

    struts2.0自带,不错的例子哦.

    struts-2.5.16-源码+示例(S2-057漏洞演示环境)

    在Struts 2中,OGNL被用来解析和执行用户的输入,以动态生成视图或者执行业务逻辑。然而,如果没有正确地限制用户输入,攻击者可以通过OGNL表达式注入恶意代码,进而执行任意系统命令。 为了理解这个问题,我们首先...

    struts2漏洞利用检测工具新添加了struts-048

    增加S2-048 Struts 2.3.X 支持检查官方示例struts2-showcase应用的代码执行漏洞,参考地址:http://127.0.0.1:8080/struts2-showcase/integration/saveGangster.action

    Struts2漏洞检查工具2018版.exe

    要求配置条件比较苛刻,同时,一些特定版本没有看到有沙盒绕过,说以,目前exp只是基于S2-045改写的,所以exp并不是所有版本都能用,正常情况下Struts 2.3.5-2.3.31,Struts 2.5-2.5.10版本可以使用此exp。...

    struts2+rest简单实例

    Struts2和REST是两种广泛应用于Web开发的技术。Struts2是一个基于MVC(Model-View-Controller)架构模式的Java框架,它极大地简化了Java Servlet的开发,提供了丰富的功能来构建可维护、可扩展的Web应用程序。REST...

    struts2.0官方项目之四(showcase)

    struts2.0官方项目之四(showcase) &lt;br&gt;=================================================== Struts2.0官方项目共4个,名字如下: &lt;br&gt;blank mailreader portlet showcase &lt;br&gt;这4个官方...

    struts2-jquery-grid-showcase-3.5.0-source

    juery集成到struts2。这是其中的一个例子的源代码,好处在于你不仅看到了程序演示的效果,还可以在页面上看到实现相关功能的代码。

    Struts2漏洞检查工具2019版 V2.3.exe

    Struts2漏洞检查工具2019版 警告: 本工具为漏洞自查工具,请勿非法攻击他人网站! ==漏洞编号==============影响版本=========================官方公告==========================================影响范围====...

    Struts2漏洞检查工具2017版

    增加S2-048 Struts 2.3.X 支持检查官方示例struts2-showcase应用的代码执行漏洞,参考地址:http://127.0.0.1:8080/struts2-showcase/integration/saveGangster.action 2017-03-21: 增加S2-046,官方发布S2-046和S2...

    struts2-struts入门

    在提供的版本struts-2.3.15.3中,有两个示例应用:struts2-blank.war是最简单的环境,而struts2-showcase.war则包含了许多常见案例,这两个war文件可以直接放入Tomcat的webapps目录下,系统会自动解压并可访问。...

    leanback-showcase,展示了android电视leanback库附带的不同组件.zip

    《Android电视Leanback库组件展示:深入理解leanback-showcase开源项目》 在Android开发领域,尤其是针对电视应用开发,Android Leanback库扮演了至关重要的角色。它为开发者提供了优化的用户界面组件,使得在大...

Global site tag (gtag.js) - Google Analytics