`
stonejava
  • 浏览: 77832 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2中关于s:tree

阅读更多
Struts2中可以通过s:tree标签轻松的实现一个树状结构。
下面是一个s:tree的具体实现的例子。数的结构用mysql数据库类维护。
1.创建数据库表
DROP TABLE IF EXISTS CATEGORY_MASTER ; CREATE TABLE CATEGORY_MASTER( CATEGORY_ID int auto_increment NOT NULL, CATEGORY_NAME varchar(50) NOT NULL, PARENT_CATEGORY_ID int DEFAULT -1 NOT NULL, PRIMARY KEY (CATEGORY_ID) )
 
2.创建数据库连接类
3.创建Category.java,用来保存DB数据和页面提交的数据

package s2.ex.data; public class Category { private int id; private String name; private Category[] children; private int parentNodeId; public Category[] getChildren() { return children; } public void setChildren(Category[] children) { this.children = children; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getParentNodeId() { return parentNodeId; } public void setParentNodeId(int parentNodeId) { this.parentNodeId = parentNodeId; } }

 4.创建对数据库表category_master操作的类

package s2.ex.svc;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList;import s2.ex.data.Category; import s2.ex.db.DBConn;public class CategoryService { private static CategoryService instance; private CategoryService() { } public static CategoryService getInstance() { if (instance == null){ instance = new CategoryService(); } return instance; } public Category[] getCategoryList() { Connection conn = DBConn.getConnection(); final String SQL = "SELECT * FROM category_master"; ResultSet rs = null; try { rs = conn.createStatement().executeQuery(SQL); ArrayList<Category> aryResult = new ArrayList<Category>(); while (rs.next()) { Category category = new Category(); category.setId(rs.getInt("CATEGORY_ID")); category.setName(rs.getString("CATEGORY_NAME")); aryResult.add(category); } Category[] result = new Category[aryResult.size()]; result = aryResult.toArray(result); return result; } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null){ rs.close(); } if (conn != null) { if (!conn.isClosed()) { conn.close(); } } } catch (SQLException e) { e.printStackTrace(); } } return null; } public boolean addNewTreeNode(Category category) { Connection conn = DBConn.getConnection(); final String SQL = "INSERT INTO category_master(CATEGORY_NAME,PARENT_CATEGORY_ID) VALUES(?,?)"; PreparedStatement pre = null; try { pre = conn.prepareStatement(SQL); pre.setString(1, category.getName()); pre.setInt(2, category.getParentNodeId()); int result = pre.executeUpdate(); if (result >= 0) { return true; } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pre != null){ pre.close(); } if (conn != null) { if (!conn.isClosed()) { conn.close(); } } } catch (SQLException e) { e.printStackTrace(); } } return false; } public Category[] getAllCategory() { Connection conn = DBConn.getConnection(); final String SQL = "SELECT * FROM category_master where PARENT_CATEGORY_ID=-1"; ResultSet rs = null; try { rs = conn.createStatement().executeQuery(SQL); ArrayList<Category> aryResult = new ArrayList<Category>(); while (rs.next()) { Category category = new Category(); category.setId(rs.getInt("CATEGORY_ID")); category.setName(rs.getString("CATEGORY_NAME")); category.setChildren(this.getChildren(category.getId())); aryResult.add(category); } Category[] result = new Category[aryResult.size()]; result = aryResult.toArray(result); return result; } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null){ rs.close(); } if (conn != null) { if (!conn.isClosed()) { conn.close(); } } } catch (SQLException e) { e.printStackTrace(); } } return null; } public Category[] getChildren(int categoryId) { Connection conn = DBConn.getConnection(); final String SQL = "SELECT * FROM category_master where PARENT_CATEGORY_ID=?"; PreparedStatement pre = null; ResultSet rs = null; try { pre = conn.prepareStatement(SQL); pre.setInt(1, categoryId); rs = pre.executeQuery(); ArrayList<Category> aryResult = new ArrayList<Category>(); while (rs.next()) { Category category = new Category(); category.setId(rs.getInt("CATEGORY_ID")); category.setName(rs.getString("CATEGORY_NAME")); category.setChildren(this.getChildren(category.getId())); aryResult.add(category); } Category[] result = new Category[aryResult.size()]; result = aryResult.toArray(result); return result; } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null){ rs.close(); } if (pre != null){ pre.close(); } if (conn != null) { if (!conn.isClosed()) { conn.close(); } } } catch (SQLException e) { e.printStackTrace(); } } return null; }

 上面getChildren方法里面用到了递归
<package name="Test" extends="struts-default" namespace="/test"> <action name="DisplayTree" class="s2.ex.action.SimpleTreeAction" method="displayTree"> <result>TreeIndex.jsp</result> </action> <action name="GoTreeEdit" class="s2.ex.action.SimpleTreeAction" method="goTreeEdit"> <result>TreeEdit.jsp</result> </action> <action name="SaveTreeNode" class="s2.ex.action.SimpleTreeAction" method="saveTreeNode"> <result name="input">TreeEdit.jsp</result> <result type="redirect">DisplayTree.action</result> </action> </package>
 
9.通过http://localhost:8080/s2/test/DisplayTree.action来测试,结果如下
Tree_En_1
展开后
Tree_En_2
节点追加
Tree_En_3
Tree_En_4
点击一个节点时
Tree_En_5

5.创建action类

package s2.ex.action;import s2.ex.data.Category; import s2.ex.svc.CategoryService;import com.opensymphony.xwork2.ActionSupport;public class SimpleTreeAction extends ActionSupport {private static final long serialVersionUID = 1L; private Category root; private Category[] parentNodeIds; private Category editCategory; public String displayTree() { root = new Category(); root.setId(-1); root.setName("root"); root.setChildren(CategoryService.getInstance().getAllCategory()); return SUCCESS; } public Category getRoot() { return root; } public void setRoot(Category root) { this.root = root; } public String goTreeEdit(){ this.parentNodeIds = CategoryService.getInstance().getCategoryList(); return SUCCESS; } public Category[] getParentNodeIds() { return parentNodeIds; } public void setParentNodeIds(Category[] parentNodeIds) { this.parentNodeIds = parentNodeIds; } public Category getEditCategory() { return editCategory; } public void setEditCategory(Category editCategory) { this.editCategory = editCategory; } public String saveTreeNode() { if (CategoryService.getInstance().addNewTreeNode(this.editCategory)){ return SUCCESS; }else { return INPUT; } } }

 6.创建TreeIndex.jsp,用来显示树

<%@ page contentType="text/html; charset=UTF-8" %> <%@page pageEncoding="utf-8" %> <%@taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Tree</title> <s:head theme="ajax" debug="true" /> </head><body> <script language="JavaScript"> function treeNodeSelected(arg) { alert("id["+arg.source.widgetId+"], name["+ arg.source.title+ "] selected"); } dojo.addOnLoad(function() { var s = dojo.widget.byId('treeTestId').selector; dojo.event.connect(s, 'select', 'treeNodeSelected'); });</script> <div style="float:left; margin-right: 50px;"> <s:tree id="treeTestId" theme="ajax" rootNode="root" childCollectionProperty="children" nodeIdProperty="id" nodeTitleProperty="name" treeSelectedTopic="treeSelected"> </s:tree> <s:form action="GoTreeEdit"> <s:submit value="Add New"/> </s:form> </div></body> </html>7.创建用来增加节点的TreeEdit.jsp<%@ page contentType="text/html; charset=UTF-8" %> <%@page pageEncoding="utf-8" %> <%@taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Session Test</title> <s:head theme="xhtml"/> </head><body> <s:form action="SaveTreeNode"> <s:textfield label="Name" name="editCategory.name"/> <s:select label="Parent Node" name="editCategory.parentNodeId" headerKey="-1" headerValue="Select Parent Node" list="parentNodeIds" listKey="id" listValue="name" required="false" value="editCategory.parentNodeId"/> <s:submit/> </s:form> </div></body>

 8.配置struts.xml
分享到:
评论
1 楼 lkkhlove 2010-01-13  
楼主啊 为什么我按你这个编译出现了这个错误 treeEdit.jsp
严重: Servlet.service() for servlet jsp threw exception
tag 'select', field 'list', name 'editCategory.parentNodeId': The requested list key 'parentNodeIds' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location
]

编译这个 treeIndex.jsp
freemarker.log.JDK14LoggerFactory$JDK14Logger error
都是错误···

相关推荐

    struts2 标签库 帮助文档

    1. &lt;s:bean name=""&gt;&lt;/s:bean&gt;-----类似于struts1.x中的,JavaBean的值 C: 1. &lt;s:checkbox&gt;&lt;/s:checkbox&gt;-----复选框 2. &lt;s:checkboxlist list=""&gt;&lt;/s:checkboxlist&gt;-----多选框 3. &lt;s:combobox list=""&gt;&lt;/s:...

    Struts2数Tree

    ### Struts2中的Tree标签详解 #### 一、概述 Struts2框架为开发者提供了丰富的标签库,其中Tree标签是用来创建树形结构的一种便捷方式。本文将深入介绍Struts2 Tree标签的两种形式:静态树与动态树,并通过具体...

    struts2标签库例子

    Struts2 标签库详解 Struts2 提供了一个强大的标签库,用于简化 Web 应用程序的开发过程。这些标签可以分为两类:通用标签和 UI 标签。下面,我们将详细介绍 Struts2 标签库的使用。 4.1 通用标签 通用标签用来...

    struts2 tree标签属性

    在Struts2框架中,Tree标签是一个非常有用的UI组件,它能够帮助开发者快速构建出功能完善的树形结构界面。对于那些需要展示层级关系的数据场景来说,使用Struits2中的Tree标签能够极大地提升用户体验和开发效率。...

    struts2标签库

    在使用Struts2标签库前,需要在JSP页面中引入相应的标签库,通常使用`&lt;%@taglib&gt;`指令,如`&lt;%@taglib uri="/struts-tags" prefix="s"%&gt;`。对于Servlet2.3之前的版本,可能还需要在web.xml中配置标签库的定义,但...

    Struts标签集合简介

    此标签类似于Struts1中的JavaBean引用,但在Struts2中并不常用,因为Struts2更倾向于使用Action来处理业务逻辑。 C. `&lt;s:checkbox&gt;`, `&lt;s:checkboxlist&gt;`, `&lt;s:combobox&gt;`, `&lt;s:component&gt;`: 这些标签用于创建复选...

    struts2中核心知识点(职场必备)

    以下是Struts2的一些核心知识点,掌握这些内容能够帮助你在面试中表现出色。 1. **MVC模式的优势**: MVC模式将应用程序分为三个层次:视图(View)、模型(Model)和控制器(Controller)。这种分离有利于项目...

    struts2标签解释

    `s:iterator`用于遍历集合,是Struts2中非常重要的标签,可以遍历数组、列表等集合类型的数据。 H. `&lt;s:head&gt;`,`&lt;s:hidden&gt;`: `&lt;s:head&gt;`标签用于在页面部分插入结束标签`&lt;/head&gt;`,常用于设置页面头部信息。 `&lt;s...

    struts2标签大全

    Struts2框架是Java Web开发中的一个重要组成部分,它极大地简化了Web应用程序的开发过程。在Struts2中,标签库(Tag Library)扮演着非常重要的角色,它们为开发者提供了丰富的功能,帮助快速构建动态网页。下面将...

    3STRUTS2.0系列教程(十四)STRUTS2与AJAXDOJO(第二部分)[收集].pdf

    本文主要探讨的是如何在Struts2中正确配置和使用AJAX,特别是通过Dojo库以及&lt;s:tree/&gt;标签来实现动态树形结构。 在Struts2的showcase中,&lt;s:tree/&gt;标签有两个示例,一个是静态树,另一个是动态树。静态树是在编写...

    struts2标签的使用

    Struts2 标签库是该框架的一个重要组成部分,它极大地简化了 Web 开发过程中页面逻辑的编写工作,并提供了丰富的功能支持。掌握这些标签的使用方法,对于提高开发效率和提升应用程序质量具有重要意义。开发者应根据...

    下面就介绍下Struts2每个标签的用法(有错请指正):

    下面我们将详细介绍 Struts2 中各个标签的具体用法及应用场景。 #### 二、详细标签解析 ##### 1. `&lt;s:a&gt;` 标签 - **用途**:用于创建 HTML 的 `&lt;a&gt;` 链接。 - **示例**: ```xml &lt;s:a href="%{linkUrl}"&gt;点击...

    Struts2标签库详解

    此外,Struts2还提供了像`&lt;s:radio&gt;`(单选按钮)、`&lt;s:checkboxtree&gt;`(树形复选框)等更多复杂的UI标签,以满足不同场景的需求。 总的来说,Struts2标签库极大地提升了开发效率,使得开发者可以专注于业务逻辑,...

    struts 2标签库介绍

    虽然 Struts 2 不再推荐使用 Struts 1.x 的标签,但在某些情况下仍然可能见到 `&lt;s:bean&gt;` 标签。此标签用于访问 JavaBean 的属性值。例如:`&lt;s:bean name="user" property="firstName"/&gt;`,这里的 `name` 指定了 ...

    struts2标签库学习

    在本教程中,我们将深入理解Struts2标签库的各个方面。 首先,Struts2标签库由多种类型的标签组成,包括用户界面(UI)标签、表单标签、非表单标签以及非用户界面(非UI)标签。UI标签主要用于生成HTML元素,表单标签...

    JSP_struts2标签大全.doc

    本文将详细介绍JSP_Struts2标签库中的各个标签及其使用方法,帮助开发者更好地理解和运用这些标签。 #### 二、标签概述 根据给定的部分内容,我们将逐一解析这些标签的功能与应用场景: 1. **a** - 创建一个HTML...

    Struts_2.0从入门到精通

    Struts2.0不仅在基础功能上表现优秀,还提供了丰富的高级主题和自定义选项,如动态树、自定义&lt;s:tree/&gt;的AJAX主题等。通过这些高级功能,开发者可以构建出更加个性化和功能强大的Web应用。 总之,《Struts_2.0从...

Global site tag (gtag.js) - Google Analytics