??xml version="1.0" encoding="utf-8" standalone="yes"?>岛国一区二区三区高清视频,国产精品99免视看9,夜色资源站国产www在线视频 http://www.aygfsteel.com/lq410/category/3537.htmlzh-cnFri, 02 Mar 2007 06:51:31 GMTFri, 02 Mar 2007 06:51:31 GMT60不用q代法而快速实现的jsp树结?/title><link>http://www.aygfsteel.com/lq410/archive/2005/10/14/15493.html</link><dc:creator>扑扑</dc:creator><author>扑扑</author><pubDate>Fri, 14 Oct 2005 02:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/lq410/archive/2005/10/14/15493.html</guid><wfw:comment>http://www.aygfsteel.com/lq410/comments/15493.html</wfw:comment><comments>http://www.aygfsteel.com/lq410/archive/2005/10/14/15493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lq410/comments/commentRss/15493.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lq410/services/trackbacks/15493.html</trackback:ping><description><![CDATA[<TABLE class=partsmb cellSpacing=0 border=0> <TBODY> <TR> <TD></TD> <TD><SPAN id=_ctl2_lblPermalink> <TABLE class="fixedTable blogpost" cellSpacing=0 width="100%" border=0> <TBODY> <TR> <TD class=bvh8></TD></TR> <TR> <TD vAlign=top><span id="wmqeeuq" class=bold id=LastMDatecns!1peK6gp160nydSWlLmNuMm7g!190><STRONG>7?1?/STRONG></SPAN></TD></TR> <TR> <TD height=4><STRONG></STRONG></TD></TR> <TR> <TD class=blackline><STRONG></STRONG></TD></TR> <TR> <TD height=4><STRONG></STRONG></TD></TR> <TR> <TD class=ellipse><span id="wmqeeuq" class=bvTitle id=subjcns!1peK6gp160nydSWlLmNuMm7g!190><STRONG>不用q代法而快速实现的jsp树结?/STRONG></SPAN></TD></TR> <TR> <TD class=bvh8><STRONG></STRONG></TD></TR> <TR> <TD id=msgcns!1peK6gp160nydSWlLmNuMm7g!190> <P> <BR>在web面上实现树状结?有点ȝ.<BR>在最q的一个MISpȝ的开发中,我们目l大量用C树结?比如人员的选择,单位的选择{待.<BR>q个MISpȝ所用的数据库是oracle 9i.  oracle 9i 的sql支持q代查询.我们的树是由牛h彭越写的,不过<BR>也参照了|络上比较著名的xtree(可以到此下蝲:http://webfx.eae.net/),他的树算法支持无限的树l构,不过性能好像<BR>很慢.我持保留态度.<BR>他用到的关键技术就是这句话:<BR>String sql = "select dwxh,dwbh,dwmc,dwfxh,level cc from xt_dw connect by  prior dwxh = dwfxh start with dwfxh = 0";<BR>可是许多数据库不支持q代查询,q且q代查询速度真是不能忍受.有什么更好的办法?下面说说我的解决Ҏ.</P> <P>一:需求的提出<BR>1:客户需要一个关于部门h员的树结?数据库ؓmysql4.1<BR>2:java实现<BR>?:<BR>1:<BR>用户信息?<BR>各字Dؓ:用户序号,用户~号,用户名称,单位序号,密码,用户登陆?BR>create table XT_YH<BR>(<BR>  YHXH  INT(9) NOT NULL auto_increment PRIMARY KEY,<BR>  YHBH  VARCHAR(30),<BR>  YHMC  VARCHAR(30),<BR>  DWXH  INT(9),<BR>  PWD   VARCHAR(20),<BR>  YHDLH VARCHAR(30)<BR>)<BR>--插入三条试数据:<BR>--insert into xt_yh(yhbh,yhmc,dwxh,pwd,yhdlh) values('licl','',2,'password','licl')<BR>--insert into xt_yh(yhbh,yhmc,dwxh,pwd,yhdlh) values('fengx','冯欣',2,'password','fengx')<BR>--insert into xt_yh(yhbh,yhmc,dwxh,pwd,yhdlh) values('wangqx','王庆?,6,'password','wangqx')<BR>2:<BR>单位部门?BR>各字Dؓ:单位序号,单位~号,单位名称,单位父序?BR>create table XT_DW<BR>(<BR>  DWXH  int(9) NOT NULL auto_increment PRIMARY KEY,<BR>  DWBH  VARCHAR(10),<BR>  DWMC  VARCHAR(30),<BR>  DWFXH int(9)<BR>)<BR>--插入5条测试数?BR>--insert into xt_dw(dwbh,dwmc,dwfxh) values('0100000000','武汉U技局',0);<BR>--insert into xt_dw(dwbh,dwmc,dwfxh) values('0101000000','Z?,1);<BR>--insert into xt_dw(dwbh,dwmc,dwfxh) values('0102000000','后勤?,1);<BR>--insert into xt_dw(dwbh,dwmc,dwfxh) values('0101010000','Z处son1',2);<BR>--insert into xt_dw(dwbh,dwmc,dwfxh) values('0101020000','Z处son2',2);<BR>--insert into xt_dw(dwbh,dwmc,dwfxh) values('0102010000','后勤处son1',3);</P> <P>注意:<BR>Z实现快速的树结构实?我需要充分利用单位编号DWBH,DWBH才有10位编?其中,W一W二位表CZU单?W三W四位表CZU单?<BR>W五六位表示三单位...那么10位编码就可以实现五单位的树l构.<BR>比如:试数据的树l构如下:<BR>  1  武汉U技局:<BR> 2  Z?BR>  3  Z处son1<BR>  3  Z处son2<BR> 2  后勤?BR>  3后勤处son1</P> <P>其实XT_DW表中的父序号是多余的.不过如果你要用P代算法来实现,是必须?BR>才有10位编?我只需要一句简单快速的sql语句可以实现树l构:<BR>String sql = "select dwxh,dwbh,dwmc,dwfxh from xt_dw order by dwbh"<BR>q句sql在几乎所有的数据库^台都能执?速度也快.<BR>下面贴出采用xtree,?0位编码而不是P代算法实现的?</P> <P>/*******Constants.java**********/</P> <P>package com.lcl.common;</P> <P>public class Constants {<BR> <BR> public static final String DBDRIVER = "com.mysql.jdbc.Driver";    //MYSQL驱动<BR> <BR> public static final String DBUrl="jdbc:mysql://localhost/beauoa"; //数据库url<BR> <BR> public static final String USERNAME="root";                       //数据库用户名<BR> <BR> public static final String PASSWORD="root";     //数据库密?BR> <BR> <BR>}</P> <P><BR>/**********DbAccess.java****************/</P> <P>package com.lcl.common;</P> <P>import java.sql.*;<BR>import java.lang.*;</P> <P>/**<BR> * @author <BR> *<BR> * TODO 要更Ҏ生成的类型注释的模板Q请转至<BR> * 数据库访问类<BR> */<BR>public class DbAccess<BR>{  <BR> String strDBDriver = Constants.DBDRIVER;<BR> String strDBUrl = Constants.DBUrl;<BR> String username = Constants.USERNAME;<BR> String password = Constants.PASSWORD;<BR> private Connection conn = null;<BR> private Statement stmt = null;<BR> ResultSet rs=null;<BR> //注册数据库驱动程?BR> public DbAccess()<BR> {  <BR>  try <BR>  {  <BR>   Class.forName(strDBDriver);<BR>  }<BR>  //异常处理<BR>  catch( java.lang.ClassNotFoundException e)<BR>  {<BR>   System.err.println("DbAccess():"+e.getMessage());<BR>  }<BR> }<BR> //建立数据库连接及定义数据查询<BR> public ResultSet executeQuery(String sql)<BR> {<BR>  rs=null;<BR>  try<BR>  {<BR>   conn=DriverManager.getConnection(strDBUrl,username,password);<BR>   stmt=conn.createStatement();<BR>   rs=stmt.executeQuery(sql);<BR>  }<BR>  catch(SQLException ex)<BR>  {<BR>   System.err.println("ap.executeQuery:"+ex.getMessage());<BR>  }<BR> <BR>  return rs;<BR> }<BR> //定义数据操库?BR> public void executeUpdate(String sql)<BR> {<BR>  stmt=null;<BR>  rs=null;<BR>  try<BR>  {<BR>   conn=DriverManager.getConnection(strDBUrl,username,password);<BR>   stmt=conn.createStatement();<BR>   stmt.executeQuery(sql);<BR>   stmt.close();<BR>   conn.close();<BR>  }<BR>  catch(SQLException ex)<BR>  {<BR>   System.err.println("ap.executeQuery:"+ex.getMessage());<BR>  }<BR> }<BR> //关闭数据?BR> public void closeStmt()<BR> {<BR>  try<BR>  {<BR>   stmt.close();<BR>  }<BR>  catch(SQLException e)<BR>  {<BR>   e.printStackTrace();<BR>  }<BR> }<BR> public void closeConn()<BR> {<BR>  try<BR>  {<BR>   conn.close();<BR>  }<BR>  catch(SQLException e)<BR>  {<BR>   e.printStackTrace();<BR>  }<BR> }<BR> public static void main(String[] args){<BR>  System.out.println("hello,it's test");<BR>  DbAccess dbaccess = new DbAccess();<BR>  String sql = "select * from xt_yh";<BR>  ResultSet rs = dbaccess.executeQuery(sql);<BR>  try<BR>  {<BR>   while(rs.next()){<BR>    System.out.print(rs.getString(1)+rs.getString(2)+rs.getString(3)+rs.getString(4)+rs.getString(5)+rs.getString(6));<BR>    System.out.println();<BR>   }<BR>  dbaccess.closeStmt();<BR>  dbaccess.closeConn();<BR>  } <BR>  catch (SQLException e) <BR>  {<BR>   // TODO 自动生成 catch ?BR>   e.printStackTrace();<BR>  }<BR> }<BR> }</P> <P> /*********DepEmplConfig.jsp************/</P> <P> <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,com.lcl.common.*" errorPage="" %><BR><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<A ><BR><html><BR><head><BR><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><BR><title>无标题文?lt;/title><BR><HEAD><BR><script type="text/javascript" src="../resources/xDataTree.js"></script><BR><link type="text/css" rel="stylesheet" href="../resources/xtree.css" /><BR><style type="text/css"></P> <P>body {<BR> background: white;<BR> color:  black;<BR>}<BR></style><BR><TITLE> New Document </TITLE><BR><META NAME="Generator" CONTENT="EditPlus"><BR><META NAME="Author" CONTENT=""><BR><META NAME="Keywords" CONTENT=""><BR><META NAME="Description" CONTENT=""><BR></HEAD><BR><script type="text/javascript">  <BR>webFXTreeConfig.rootIcon  = "../resources/images/xp/folder.png";<BR>webFXTreeConfig.openRootIcon = "../resources/images/xp/openfolder.png";<BR>webFXTreeConfig.folderIcon  = "../resources/images/xp/folder.png";<BR>webFXTreeConfig.openFolderIcon = "../resources/images/xp/openfolder.png";<BR>webFXTreeConfig.fileIcon  = "../resources/images/xp/file.png";<BR>webFXTreeConfig.lMinusIcon  = "../resources/images/xp/Lminus.png";<BR>webFXTreeConfig.lPlusIcon  = "../resources/images/xp/Lplus.png";<BR>webFXTreeConfig.tMinusIcon  = "../resources/images/xp/Tminus.png";<BR>webFXTreeConfig.tPlusIcon  = "../resources/images/xp/Tplus.png";<BR>webFXTreeConfig.iIcon   = "../resources/images/xp/I.png";<BR>webFXTreeConfig.lIcon   = "../resources/images/xp/L.png";<BR>webFXTreeConfig.tIcon   = "../resources/images/xp/T.png";<BR>webFXTreeConfig.blankIcon       = "../resources/images/blank.png";</P> <P>var tree = new WebFXTree("单位人员基本情况","R0");<BR>var child;<BR>var nodeToAddPerson;</P> <P>function addDeptTreeNode(preNodeLevel,curNodeLevel,dispLabel,sKey,sTag) {<BR>  if(curNodeLevel==1) {<BR>     child = tree.add(new WebFXTreeItem(dispLabel,sKey,sTag));<BR>  }<BR>  else {<BR>    if(curNodeLevel==preNodeLevel) {<BR>       if(child.parentNode)<BR>        child = child.parentNode.add(new WebFXTreeItem(dispLabel,sKey,sTag));<BR>    }<BR>    if(curNodeLevel>preNodeLevel) {<BR>       child = child.add(new WebFXTreeItem(dispLabel,sKey,sTag));<BR>    }<BR>    if(curNodeLevel<preNodeLevel) {<BR>        for(i=0;i<preNodeLevel-curNodeLevel+1;i++) <BR>           child = child.parentNode;<BR>        child = child.add(new WebFXTreeItem(dispLabel,sKey,sTag));<BR>    }<BR>  }<BR>  return child;<BR>}</P> <P>function treeClick() {<BR> if(tree.getSelected()) {<BR>     if(tree.getSelected().childNodes.length==0&&tree.getSelected().key!="R0") <BR>       cmdDelete.disabled = false;<BR>     else <BR>       cmdDelete.disabled = true; <BR>     if(tree.getSelected().key.substr(0,2)=="RZ") {<BR>       cmdAddDept.disabled = true;<BR>       cmdAddPeople.disabled = true;<BR>       var strYhxh;<BR>       strYhxh = tree.getSelected().key.substr(2);<BR>       //window.open("../userAdm/editYh.do?yhxh="+strYhxh,"main");<BR>     }<BR>     else if(tree.getSelected().key.substr(0,2)=="RB") {<BR>       cmdAddDept.disabled = false;<BR>       cmdAddPeople.disabled = false;<BR>       var strDwxh;<BR>       strDwxh = tree.getSelected().key.substr(2);<BR>       //window.open("../userAdm/editBm.do?dwxh="+strDwxh,"main");<BR>     }<BR>     else {<BR>       cmdAddDept.disabled = false;<BR>       cmdAddPeople.disabled = true;<BR>       //window.open("yhroot.jsp","main");<BR>     }<BR> }<BR>}</P> <P>function addPeople() {<BR>    var strDwxh;<BR>    if(tree.getSelected()) {<BR>   if (tree.getSelected().key.substr(0,2)=="RB") {<BR>        strDwxh = tree.getSelected().key.substr(2);<BR>  //window.open("../userAdm/addYh.do?dwxh="+strDwxh,"main");<BR>  alert("addPeople");<BR>   }<BR>    }<BR>}</P> <P>function addDept() {<BR>    var strDwxh;<BR>    if(tree.getSelected()) {<BR>   if (tree.getSelected().key.substr(0,2)=="RB") {<BR>        strDwfxh = tree.getSelected().key.substr(2);<BR>  //window.open("../userAdm/addBm.do?dwfxh="+strDwfxh,"main");<BR>    alert("addDept");<BR>   }<BR>      else if(tree.getSelected().key=="R0") {<BR>        //window.open("../userAdm/addBm.do?dwfxh=0","main");<BR>        alert("addDept");<BR>      }<BR>    }<BR>}</P> <P>function deleSelected() {<BR>  if(!confirm("认删除该节点吗Q?))<BR>      return;<BR>  if(tree.getSelected()) {<BR>    if(tree.getSelected().key.substr(0,2)=="RB") {<BR>       var strDwxh;<BR>       strDwxh = tree.getSelected().key.substr(2);<BR>       //window.open("../userAdm/delBm.do?dwxh="+strDwxh,"main");<BR>       alert("deleSelected");<BR>    }<BR>    else if(tree.getSelected().key.substr(0,2)=='RZ') {<BR>       var strYhxh,strYhbh;<BR>       strYhxh = tree.getSelected().key.substr(2);<BR>       strYhbh = tree.getSelected().tag;<BR>       //window.open("../userAdm/delYh.do?yhxh="+strYhxh+"&yhbh="+strYhbh,"main");<BR>       alert("deleSelected");<BR>    }<BR>  }<BR>}</P> <P>function removeNode() {<BR>  if(tree.getSelected()) {<BR>    var node = tree.getSelected();<BR>    node.remove();<BR>  }<BR>}</P> <P>function addPeopleNode(strParentKey,strKey,strText,strTag) {<BR>  if(tree.getSelected()) {<BR>    var node = tree.getSelected();<BR>    var childNode;<BR>    //node.expand();<BR>    childNode = node.add(new WebFXTreeItem(strText,strKey,strTag,"","","../resources/images/people1.png"));<BR>    node.expand(); //why I do so? I dont want to tell you,hah!<BR>    childNode.focus();<BR>    treeClick();<BR>  }<BR>}</P> <P>function addDeptNode(strParentKey,strKey,strText,strTag) {<BR>  if(tree.getSelected()) {<BR>    var node = tree.getSelected();<BR>    var childNode;<BR>    childNode = node.add(new WebFXTreeItem(strText,strKey,strTag));<BR>    node.expand();<BR>    childNode.focus();<BR>    treeClick();<BR>  }<BR>}</P> <P>function updateDeptNode(strTag,strText) {<BR>  if(tree.getSelected()) {<BR>    var node = tree.getSelected();<BR>    node.text = strText;<BR>    node.tag  = strTag;<BR>    node.focus();<BR>  }<BR>}</P> <P>function updatePeopleNode(strTag,strText) {<BR>  if(tree.getSelected()) {<BR>    var node = tree.getSelected();<BR>    node.text = strText;<BR>    node.tag  = strTag;<BR>    node.focus();<BR>  }<BR>}<BR></script><BR><%<BR>int dwxh;<BR>int dwfxh;<BR>int yhxh;<BR>String dwbh = null;<BR>String dwmc = null;<BR>String yhmc = null;<BR>String yhbh = null;<BR>int preLevel =1;<BR>int level = 1;<BR>DbAccess dbaccess = new DbAccess();<BR>String sql = "select dwxh,dwbh,dwmc,dwfxh from xt_dw order by dwbh";<BR>ResultSet rs = dbaccess.executeQuery(sql);<BR>try<BR>{<BR> while(rs.next())<BR> {<BR>        dwxh = rs.getInt(1);<BR>        dwbh = rs.getString(2);<BR>        dwmc = rs.getString(3);<BR>        dwfxh = rs.getInt(4);<BR>//通过单位~号计算level<BR>  String last = dwbh.substring(9,10);<BR>  int i = 9;<BR>  while(last.equals("0") && i>0){<BR>   i--;<BR>   last = dwbh.substring(i,i+1);<BR>  <BR>  }<BR>  <BR>  if(i==0 || i==1) level =1;<BR>  if(i==2 || i==3) level =2;<BR>  if(i==4 || i==5) level =3;<BR>  if(i==6 || i==7) level =4;<BR>  if(i==8 || i==9) level =5;<BR>//<BR>  %><BR>           <script type="text/javascript">  <BR>     nodeToAddPerson = addDeptTreeNode(<%=preLevel%>,<%=level%>,"<%=dwmc%>","RB<%=dwxh%>","<%=dwbh%>");<BR>        </script>  <BR>  <BR>  <%<BR>  preLevel = level;<BR>  String subsql = "select yhxh,yhmc,yhbh from xt_yh where dwxh = "+Integer.toString(dwxh);<BR>  ResultSet subRs = dbaccess.executeQuery(subsql);<BR>       while(subRs.next()) {<BR>              yhxh = subRs.getInt(1);<BR>              yhmc = subRs.getString(2);<BR>              yhbh = subRs.getString(3); <BR>  %><BR>             <script type="text/javascript">  <BR>     nodeToAddPerson.add(new WebFXTreeItem("<%=yhmc%>","RZ<%=yhxh%>","<%=yhbh%>","","","../resources/images/people1.png"));<BR>        </script><BR>     <%<BR>  }<BR>  <BR> }<BR> dbaccess.closeStmt();<BR> dbaccess.closeConn();<BR>}<BR>catch(Exception e)<BR>{</P> <P>}<BR>%></P> <P><BR><base target="_self"><BR><META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"><BR></head><BR><body><BR><table border="0" width="100%" cellspacing="0" cellpadding="0"><BR>  <tr><BR>    <td width="273" colspan="2"><BR>       <font face="宋体" size="3">     <BR>       </font><BR>    </td><BR>  </tr><BR>  <tr><BR>    <th width="33%" align="center" nowrap><BR>      <p align="center"><BR>      <INPUT id=cmdAddDept name="AddDept" type=button value="增加部门" onclick="addDept()" style="FONT-FAMILY: 楷体_GB2312; FONT-SIZE: 12pt; FONT-WEIGHT: bold; HEIGHT: 24px; WIDTH: 80px" ><BR>      </p><BR>    </th><BR>    <th width="33%" align="center" nowrap><BR>      <p align="center"><BR>      <INPUT id=cmdAddPeople name="AddPeople" type=button value="增加用户" onclick="addPeople()" style="FONT-FAMILY: 楷体_GB2312; FONT-SIZE: 12pt; FONT-WEIGHT: bold; HEIGHT: 24px; WIDTH: 80px" ><BR>      </p><BR>    </th><BR>    <th width="33%" align="center" nowrap><BR>      <p align="center"><BR>      <INPUT id=cmdDelete name="Delete" type=button value=" 删除 " onclick="deleSelected()" style="FONT-FAMILY: 楷体_GB2312; FONT-SIZE: 12pt; FONT-WEIGHT: bold; HEIGHT: 24px; WIDTH: 80px" disabled><BR>      </p><BR>    </th><BR>  </tr><BR>  <tr><BR>    <td width="273" height="8"  colspan="2">&nbsp;<BR>      <BR>    </td><BR>  </tr><BR></table><BR></body><BR><div onclick="treeClick()"><BR><script type="text/javascript">  <BR> document.write(tree);<BR></script><BR></div><BR></HTML></P></TD></TR></TBODY></TABLE></SPAN></TD></TR></TBODY></TABLE><img src ="http://www.aygfsteel.com/lq410/aggbug/15493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lq410/" target="_blank">扑扑</a> 2005-10-14 10:26 <a href="http://www.aygfsteel.com/lq410/archive/2005/10/14/15493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts-menu+ibatis+量的代?通用的自定义菜单和动态加载的?/title><link>http://www.aygfsteel.com/lq410/archive/2005/10/14/15490.html</link><dc:creator>扑扑</dc:creator><author>扑扑</author><pubDate>Fri, 14 Oct 2005 02:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/lq410/archive/2005/10/14/15490.html</guid><wfw:comment>http://www.aygfsteel.com/lq410/comments/15490.html</wfw:comment><comments>http://www.aygfsteel.com/lq410/archive/2005/10/14/15490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lq410/comments/commentRss/15490.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lq410/services/trackbacks/15490.html</trackback:ping><description><![CDATA[<P>前言Q?BR>    知识准备Q首先你需要懂一些struts的基本知识,会用struts-menuQƈ理解站长对struts-menu的分析那文章,q要知道ibatis的基本知识,如果不懂Q请去google或者站长的论坛里找相关的文章?/P> <P>树Şl构在实际开发中很常用,但是树Şl构的开发往往也是NQ尤其是在显C一条上Q很隑ց到通用。通常有两U典型的树型l构。一U是论坛的帖子,其结构往往通过父子IDLq?数据在一张表里。一U是U别Q比如论坛中的Category->Forum->Threadq种l构Q数据放在不同的表里。因坛恰好包含了q两U结构。因此。我们就能Jive的表l构来做q个例子。首先我们通过RsMetaDataTest来扫描数据库Q得到需要的XML配置文g。拿一个xmlZQ解释一?/P> <TABLE width="100%" border=1> <TBODY> <TR> <TD bgColor=#cccccc><PRE class="smallFont style2"><?xml version="1.0" encoding="UTF-8"?><BR><!DOCTYPE sql-map<BR>PUBLIC "-//iBATIS.com//DTD SQL Map 1.0//EN"<BR>"http://www.ibatis.com/dtd/sql-map.dtd"><BR><sql-map name="jivecategory"><BR><!-- =============================================<BR> mapped-statement find <BR>============================================= --><BR><dynamic-mapped-statement name="findjivecategoryDao" result-class="java.util.HashMap"><BR> select $listfield$ from JIVECATEGORY<BR> <dynamic prepend="where"><BR> <isPropertyAvailable prepend="and" property="CATEGORYID" ><BR> <isNotNull prepend="" property="CATEGORYID" ><BR> CATEGORYID=#CATEGORYID#<BR> </isNotNull><BR> </isPropertyAvailable><BR> <isPropertyAvailable prepend="and" property="NAME" ><BR> <isNotNull prepend="" property="NAME" ><BR> NAME=#NAME#<BR> </isNotNull><BR> </isPropertyAvailable><BR> <isPropertyAvailable prepend="and" property="DESCRIPTION" ><BR> <isNotNull prepend="" property="DESCRIPTION" ><BR> DESCRIPTION=#DESCRIPTION#<BR> </isNotNull><BR> </isPropertyAvailable><BR> <isPropertyAvailable prepend="and" property="CREATIONDATE" ><BR> <isNotNull prepend="" property="CREATIONDATE" ><BR> CREATIONDATE=#CREATIONDATE#<BR> </isNotNull><BR> </isPropertyAvailable><BR> <isPropertyAvailable prepend="and" property="MODIFIEDDATE" ><BR> <isNotNull prepend="" property="MODIFIEDDATE" ><BR> MODIFIEDDATE=#MODIFIEDDATE#<BR> </isNotNull><BR> </isPropertyAvailable><BR> <isPropertyAvailable prepend="and" property="LFT" ><BR> <isNotNull prepend="" property="LFT" ><BR> LFT=#LFT#<BR> </isNotNull><BR> </isPropertyAvailable><BR> <isPropertyAvailable prepend="and" property="RGT" ><BR> <isNotNull prepend="" property="RGT" ><BR> RGT=#RGT#<BR> </isNotNull><BR> </isPropertyAvailable><BR> </dynamic> <BR></dynamic-mapped-statement></PRE> <P class="smallFont style2"></sql-map></P></TD></TR></TBODY></TABLE> <P>可见有一个名叫f<span id="wmqeeuq" class="smallFont style2"><FONT size=2>indjivecategoryDao</FONT></SPAN>Q这是一个典型的动态查询。返回对象是HashMap。其?listfield$表示动态读取的字段。可以这么说Q通过q个查询。有兌栯的Q何方式的查询都已l解决了。由于这个演C只用到四张表,因些我们在sql-map-config-storedb.xml也只加蝲了四张表的定义?/P> <TABLE width="100%" bgColor=#cccccc border=1> <TBODY> <TR> <TD><sql-map resource="sqlmap/jivecategory.xml" /><BR><sql-map resource="sqlmap/jiveforum.xml" /> <BR><sql-map resource="sqlmap/jivethread.xml" /> <BR><sql-map resource="sqlmap/jivemessage.xml" /> </TD></TR></TBODY></TABLE> <P>然后定义MenuDefinec,q个cL一个通用的定义,其主要属性如下。可以通过它徏立一个四张表的树形关pR?/P> <TABLE width="100%" bgColor=#cccccc border=1> <TBODY> <TR> <TD><span id="wmqeeuq" class=smallFont>//sql Map的名U?<BR>private String sqlMapName;<BR>//调用的查询名U?BR>private String SqlName;<BR>//子菜单的名称<BR>private String submenuName; </SPAN> <P><span id="wmqeeuq" class=smallFont>//对应字段Q其中keyZ表的字段Qvalue是从表的字段?BR>private HashMap keymap;<BR>//菜单的名U?BR>private String MenuName;<BR>//标题<BR>private String Title;<BR>//标题字段<BR>private String TitleField;<BR>//需要读取的字段<BR>private String listField;<BR>//是否需要显C?BR>private boolean needShow=true;</SPAN><BR></P></TD></TR></TBODY></TABLE> <P>然后建立一个XML的文?此处化了它的功能Q就是把上面q个cd列化了一?。把它放在classes目录下?/P> <TABLE width="100%" bgColor=#cccccc border=1><PRE> </PRE> <TBODY> <TR> <TD><PRE><FONT face=Arial><span id="wmqeeuq" class=style3><?xml version="1.0" encoding="UTF-8"?> <BR><java version="1.4.2_03" class="java.beans.XMLDecoder"> <BR> <object class="java.util.HashMap"> <BR> <void method="put"> <BR> <string>message</string> <BR> <object class="com.ewuxi.champion.MenuDefine"> <BR> <void property="keymap"> <BR> <object class="java.util.HashMap"> <BR> <void method="put"> <BR> <string>MESSAGEID</string> <BR> <string>PARENTMESSAGEID</string> <BR> </void> <BR> </object> <BR> </void> <BR> <void property="listField"> <BR> <string>MESSAGEID,SUBJECT</string> <BR> </void> <BR> <void property="menuName"> <BR> <string>message</string> <BR> </void> <BR> <void property="sqlMapName"> <BR> <string>jivemessage</string> <BR> </void> <BR> <void property="sqlName"> <BR> <string>findjivemessageDao</string> <BR> </void> <BR> <void property="submenuName"> <BR> <string>message</string> <BR> </void> <BR> <void property="title"> <BR> <string>文章</string> <BR> </void> <BR> <void property="titleField"> <BR> <string>SUBJECT</string> <BR> </void> <BR> </object> <BR> </void> <BR> <void method="put"> <BR> <string>category</string> <BR> <object class="com.ewuxi.champion.MenuDefine"> <BR> <void property="keymap"> <BR> <object class="java.util.HashMap"> <BR> <void method="put"> <BR> <string>CATEGORYID</string> <BR> <string>CATEGORYID</string> <BR> </void> <BR> </object> <BR> </void> <BR> <void property="listField"> <BR> <string>CATEGORYID,NAME</string> <BR> </void> <BR> <void property="menuName"> <BR> <string>category</string> <BR> </void> <BR> <void property="sqlMapName"> <BR> <string>jivecategory</string> <BR> </void> <BR> <void property="sqlName"> <BR> <string>findjivecategoryDao</string> <BR> </void> <BR> <void property="submenuName"> <BR> <string>forum</string> <BR> </void> <BR> <void property="title"> <BR> <string>大分c?lt;/string> <BR> </void> <BR> <void property="titleField"> <BR> <string>NAME</string> <BR> </void> <BR> </object> <BR> </void> <BR> <void method="put"> <BR> <string>forum</string> <BR> <object class="com.ewuxi.champion.MenuDefine"> <BR> <void property="keymap"> <BR> <object class="java.util.HashMap"> <BR> <void method="put"> <BR> <string>FORUMID</string> <BR> <string>FORUMID</string> <BR> </void> <BR> </object> <BR> </void> <BR> <void property="listField"> <BR> <string>FORUMID,NAME</string> <BR> </void> <BR> <void property="menuName"> <BR> <string>forum</string> <BR> </void> <BR> <void property="sqlMapName"> <BR> <string>jiveforum</string> <BR> </void> <BR> <void property="sqlName"> <BR> <string>findjiveforumDao</string> <BR> </void> <BR> <void property="submenuName"> <BR> <string>thread</string> <BR> </void> <BR> <void property="title"> <BR> <string>子分c?lt;/string> <BR> </void> <BR> <void property="titleField"> <BR> <string>NAME</string> <BR> </void> <BR> </object> <BR> </void> <BR> <void method="put"> <BR> <string>thread</string> <BR> <object class="com.ewuxi.champion.MenuDefine"> <BR> <void property="keymap"> <BR> <object class="java.util.HashMap"> <BR> <void method="put"> <BR> <string>THREADID</string> <BR> <string>THREADID</string> <BR> </void> <BR> <void method="put"> <BR> <string>FORUMID</string> <BR> <string>FORUMID</string> <BR> </void> <BR> <void method="put"> <BR> <string>ROOTMESSAGEID</string> <BR> <string>MESSAGEID</string> <BR> </void> <BR> </object> <BR> </void> <BR> <void property="listField"> <BR> <string>THREADID,ROOTMESSAGEID</string> <BR> </void> <BR> <void property="menuName"> <BR> <string>thread</string> <BR> </void> <BR> <void property="needShow"> <BR> <boolean>false</boolean> <BR> </void> <BR> <void property="sqlMapName"> <BR> <string>jivethread</string> <BR> </void> <BR> <void property="sqlName"> <BR> <string>findjivethreadDao</string> <BR> </void> <BR> <void property="submenuName"> <BR> <string>message</string> <BR> </void> <BR> <void property="title"> <BR> <string>栏目</string> <BR> </void> <BR> <void property="titleField"> <BR> <string>ROOTMESSAGEID</string> <BR> </void> <BR> </object> <BR> </void> <BR> </object> <BR></java> </SPAN><BR></FONT> </PRE></TD></TR></TBODY></TABLE> <P>兌关系?SPAN class=style3><FONT face=Arial>category</FONT></SPAN>表通过<span id="wmqeeuq" class=style3><FONT face=Arial>CATEGORYID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>forum</FONT></SPAN>兌Q?SPAN class=style3><FONT face=Arial>forum</FONT></SPAN>通过<span id="wmqeeuq" class=style3><FONT face=Arial>FORUMID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>thread</FONT></SPAN>兌Q?SPAN class=style3><FONT face=Arial>thread</FONT></SPAN>是一张特D的表。它不昄在树中,只是一个过渡关联,用于d新徏的文章?/P> <P><span id="wmqeeuq" class=style3><FONT face=Arial>thread</FONT></SPAN>通过<span id="wmqeeuq" class=style3><FONT face=Arial>FORUMID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>FORUMID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>ROOTMESSAGEID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>message</FONT></SPAN>表关?<span id="wmqeeuq" class=style3><FONT face=Arial>FORUMID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>FORUMID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>MESSAGEID</FONT></SPAN>)。而message表是一个自兌的表?SPAN class=style3><FONT face=Arial>MESSAGEID</FONT></SPAN>?SPAN class=style3><FONT face=Arial>PARENTMESSAGEID</FONT></SPAN>兌建立父子关系?/P> <P>然后我们建立一个sessioncMZ要类</P> <TABLE width="100%" border=1> <TBODY> <TR> <TD bgColor=#cccccc><PRE>public class TreeDemoSession { //通过名称和参数来得到? public MenuComponent getMenu(String name, Map keys) throws Exception { Map menuMap = (Map) (new XmlUtils().read(Service.getPath() + "/menu.xml")); MenuComponent menu = new MenuComponent(); if (menuMap.get(name) != null) { MenuDefine rootMenudefine = (MenuDefine) menuMap.get(name); menu.setTitle(rootMenudefine.getTitle()); menu.setName(rootMenudefine.getMenuName()); menu = submenuAdd(menu, keys, menuMap, name); } return menu; } /**一个典型的递归函数。用以组l树? * @param menu * @param map * @param menuMap * @param menuName * @return * @throws DaoException * @throws Exception */ private MenuComponent submenuAdd( MenuComponent menu, Map map, final Map menuMap, String menuName) throws DaoException, Exception { try { //得到菜单定义 MenuDefine menudefine = (MenuDefine) menuMap.get(menuName); //listfield,表示需要读取哪几个字段 map.put("listfield", menudefine.getListField()); //查询Q返回列表? List list = DaoCommon.findbyName(map, menudefine.getSqlName()); int namei = 0; for (Iterator iter = list.iterator(); iter.hasNext();) { Map element = (Map) iter.next(); //建立当前节点 MenuComponent submenu = new MenuComponent(); submenu.setName(menu.getName() + String.valueOf(namei++)); submenu.setTitle( String.valueOf(element.get(menudefine.getTitleField()))); //如果不需要显C,则用父节点作ؓ当前节点 if (!menudefine.isNeedShow()) submenu = menu; //如果有子菜单Q则递归调用? if (menudefine.getSubmenuName() != null) { submenu = submenuAdd( submenu, getSubMenuInfo(menudefine, element), menuMap, menudefine.getSubmenuName()); } //当前节Ҏ到树中?如果不需要显C就不用? if (menudefine.isNeedShow()) menu.addMenuComponent(submenu); } return menu; } catch (DaoException e) { throw e; } catch (Exception e) { throw e; } } /**父菜单的关键字D늚g为参数给子菜? * @param menudefine * @param element * @return */ private HashMap getSubMenuInfo(MenuDefine menudefine, Map element) { HashMap map = new HashMap(); for (Iterator iter = menudefine.getKeymap().keySet().iterator(); iter.hasNext(); ) { String key = (String) iter.next(); map.put(menudefine.getKeymap().get(key), element.get(key)); } return map; } } </PRE></TD></TR></TBODY></TABLE> <P>三个函数Q非常简单,d数读取配|文件的内容。一个递归函数用来建立树Şl构。这|只有两个属性被讄。一个是名字和标题。其中标题采用从数据库里d的字Dc名字则采用水受读取数据库只有一?其中map是参数的一个列表。后面是sql的名字?/P> <TABLE width="100%" border=1> <TBODY> <TR> <TD>List list = DaoCommon.findbyName(map, menudefine.getSqlName());</TD></TR></TBODY></TABLE> <P>而真正的实现代码也非常简?/P> <TABLE width="100%" border=1> <TBODY> <TR> <TD>public static List findbyName(Object vo,String name) throws DaoException {<BR>try {<BR>SqlMap sqlMap = DaoCommon.getSqlMap(DaoCommon.getDefautDao());<BR>return (List) sqlMap.executeQueryForList(name, vo);<BR>} catch (Exception e) {<BR>throw new DaoException(e);<BR>}<BR>}</TD></TR></TBODY></TABLE> <P>下面我们来做Action的工?/P> <TABLE class=smallFont width="100%" bgColor=#cccccc border=1> <TBODY> <TR> <TD>public ActionForward execute(<BR>ActionMapping mapping,<BR>ActionForm form,<BR>HttpServletRequest request,<BR>HttpServletResponse response)<BR>throws Exception { <P>Service.initSet();<BR>DaoCommon.startTransaction();</P> <P>HashMap parMap = new HashMap();<BR>Enumeration enumeration = request.getParameterNames();<BR>while (enumeration.hasMoreElements()) {<BR>String element = (String) enumeration.nextElement();<BR>parMap.put(element, request.getParameter(element));<BR>}<BR>TreeDemoSession session=new TreeDemoSession();<BR>request.setAttribute("com.ewuxi.champion.menu",session.getMenu(request.getParameter("menuName"),parMap));</P> <P>DaoCommon.rollBack();</P> <P>return mapping.findForward(request.getParameter("type"));<BR>}<BR></P></TD></TR></TBODY></TABLE> <P>q个函数也非常简单,是把从request传来的内容生成一个Map对象。然后调用session,返回结果以com.ewuxi.champion.menu为名字保存到request中去?/P> <P>最后我们需要生成一个自定义的taglib。实际上很简单。只是因为struts-menu自n的taglib是写MQ我们不能利用,不过只要改一个地方就可以?copy UseMenuDisplayerTag到我们的目录下?/P> <TABLE width="100%" bgColor=#cccccc border=1> <TBODY> <TR> <TD class=smallInput><span id="wmqeeuq" class=smallFont>MenuRepository repository =<BR>(MenuRepository) pageContext.getServletContext().getAttribute(MenuRepository.MENU_REPOSITORY_KEY); </SPAN> <P class=smallFont>if (repository == null) {<BR>throw new JspException("Could not obtain the menu repository");<BR>}</P> <P class=smallFont>MenuComponent menu = repository.getMenu(this.name);</P></TD></TR></TBODY></TABLE> <P>扑ֈ上面q一D,Ҏ</P> <TABLE width="100%" border=1> <TBODY> <TR> <TD class=smallFont bgColor=#cccccc><BR>MenuComponent menu =<BR>(MenuComponent) pageContext.findAttribute(this.name);<BR></TD></TR></TBODY></TABLE> <P>OK了。然后需要徏立一个JSP文g。我们把xtree.jsp借用q来。唯一需要改的就?lt;cp:displayMenu name="com.ewuxi.champion.menu"/>Q当然还有几个link的\径。因为此处用treeDemo来所以就是href="/treeDemo/styles/xtree.css"</P> <TABLE class=smallFont width="100%" border=1> <TBODY> <TR> <TD bgColor=#cccccc><head><BR><title>XTree (with Velocity) Example</title> <P><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></P> <P><link rel="stylesheet" type="text/css" media="screen"<BR>href="/treeDemo/styles/global.css" /><BR><link rel="stylesheet" type="text/css" media="screen"<BR>href="/treeDemo/styles/xtree.css" /><BR><BR><script type="text/javascript" src="/treeDemo/scripts/xtree.js"></script></P> <P></head><BR><body></P> <P><div class="container"><BR>Simple menu with Velocity:<br /><BR><script type="text/javascript"><BR><menu:useMenuDisplayer name="Velocity" config="/templates/xtree.html"<BR>bundle="org.apache.struts.action.MESSAGE"><BR>if (document.getElementById) {<BR><cp:displayMenu name="com.ewuxi.champion.menu"/><BR>} else {<BR>var msg = "Your browser does not support document.getElementById().\n";<BR>msg += "You must use a modern browser for this menu.";<BR>alert(msg);<BR>}<BR></P> <P></menu:useMenuDisplayer><BR></script><BR></div></P> <P></P></TD></TR></TBODY></TABLE> <P>下面可以自q看效果了?/P> <TABLE width="100%" border=1> <TBODY> <TR> <TD><p><a href="demo.do?type=demo&menuName=category" target="_blank">大分cd?lt;/a><BR></p><BR><p><a href="demo.do?type=demo&menuName=forum" target="_blank">子分cd?lt;/a> </p><BR><p><a href="demo.do?type=demo&menuName=forum&FORUMID=1" target="_blank">只看java分类</a> </p><BR><p><a href="demo.do?type=demo&menuName=thread" target="_blank">所有文?lt;/a> </p></TD></TR></TBODY></TABLE> <P>上面是几U不同的参数。主要的差别是menuName不同。然后也可以加数据库需要的参数Q比如java分类的forumId=1。就在参C加FORUMID=1,注意大小写要跟XML中的动态参数相同,此处全是大写?/P> <P>在线演示看这?A >http://demo.ewuxi.com:8000/treejivedemo/,<BR>源码下蝲 <BR>http://champion.ewuxi.com/old/opensource/struts-new/treeDemo.rar</A><A ></A></P><!-- InstanceEndEditable --><img src ="http://www.aygfsteel.com/lq410/aggbug/15490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lq410/" target="_blank">扑扑</a> 2005-10-14 10:16 <a href="http://www.aygfsteel.com/lq410/archive/2005/10/14/15490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多对多关?/title><link>http://www.aygfsteel.com/lq410/archive/2005/09/23/13831.html</link><dc:creator>扑扑</dc:creator><author>扑扑</author><pubDate>Fri, 23 Sep 2005 05:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/lq410/archive/2005/09/23/13831.html</guid><wfw:comment>http://www.aygfsteel.com/lq410/comments/13831.html</wfw:comment><comments>http://www.aygfsteel.com/lq410/archive/2005/09/23/13831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lq410/comments/commentRss/13831.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lq410/services/trackbacks/13831.html</trackback:ping><description><![CDATA[郁闷了好久的Hibernate的many-to-many双向兌搞定?BR> <P>在做hbiernate的many-to-many的双向关联时Q一方要讄inverse="true"Q另一方要讄inverse="false"。inverse="false"的一方保存时Q维护多对多之间的关p,且只要将怺的关pd诉这一方即可?/P> <P>如果inverse都设|ؓtrueQ双方的关系都不到l护?/P> <P>如果都设|ؓfalseQ双方将共同l护之间的关p,q时Q要双方的包含关系都要讄清楚Q否则将会导致关pȝ护؜乱?/P> <P>如果讄了casade="save-update"Q只能设|一方,如果双方都设|的话,当更C方的时候,同时会更新另一方,另一方的更新又会D一方的更新?BR><BR>lazy loading指的是当实际要用到某个数据字段时候,才将其从数据库中dQ避免内存的费?BR><BR>inverse . inverse默认是false .当你指定inverse="true" cascade="none"  Ӟq个实体对这个属性是没有持久更新的权利的Q它把这个属性的理权利完全交给了关联的另一方了?/P><img src ="http://www.aygfsteel.com/lq410/aggbug/13831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lq410/" target="_blank">扑扑</a> 2005-09-23 13:59 <a href="http://www.aygfsteel.com/lq410/archive/2005/09/23/13831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">˱</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽʡ</a>| <a href="http://" target="_blank">ׯ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ұ</a>| <a href="http://" target="_blank">֣</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">̶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">п</a>| <a href="http://" target="_blank">ƽ½</a>| <a href="http://" target="_blank">ī</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͻȪ</a>| <a href="http://" target="_blank">ĺ</a>| <a href="http://" target="_blank">½</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٹ</a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">׿</a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>