宁静以思远

Java使人内心宁静

BlogJava 首页 新随笔 联系 聚合 管理
  8 Posts :: 0 Stories :: 17 Comments :: 0 Trackbacks

2009年12月10日 #

以前在公司,平台组已经把组件都给我们开发好了,对于界面没有花太多的时间研究。近日想自己做个小系统,还是用比较擅长的JSF+Hibernate+Spring。考虑Facelet的模板功能,这次想尝试一下。结果,一个Tree2就把我纳闷了好一会。
从网上找了篇文章,试着依样画葫芦,做了模板页,分top,left,content三块布局,left自然就是tree2菜单了。
首先看一下模板页:
template.xthml
1 <div id="left">
2          <ui:insert name="left">
3                     <ui:include src="leftmenu.xhtml"></ui:include>
4          </ui:insert>
5 </div>
6 <div id="content" class="left_content">
7          <ui:insert name="content">Content</ui:insert>
8 </div>
其中左边菜单:
leftmenu.xhtml
 1 <t:tree2 id="serverTree" value="#{calendarBean.treeData}" var="node" varNodeToggler="t" clientSideToggle="false" showRootNode="true">
 2                            
 3                             <f:facet name="document">
 4                                 <h:panelGroup>
 5                                     <h:commandLink immediate="true" styleClass="#{t.nodeSelected ? 'documentSelected':'document'}" action="link_page" actionListener="#{t.setNodeSelected}">
 6                                         <t:graphicImage value="/images/document.png" border="0"/>
 7                                         <h:outputText value="#{node.description}"/>
 8                                         <f:param name="docNum" value="#{node.identifier}"/>
 9                                     </h:commandLink>
10                                 </h:panelGroup>
11                             </f:facet>
12  </t:tree2>
其中backingBean代码如下,配置有效范围为session
public class calendarBean {

    
private TreeData treeData;

    
private Date secondDate;

    
public Date getSecondDate() {
        
return secondDate;
    }

    
public void setSecondDate(Date secondDate) {
        
this.secondDate = secondDate;
    }

    
public TreeData getTreeDate() {
       
if (null == treeData) {
            TreeNode treeData 
= new TreeNodeBase("foo-folder""Inbox"false);
            ......
       }
       
return treeData;
}
......
}

这里为了方便测试,故意把commandLink的action指向link_page导航,link_page配置为:
1 <navigation-rule>
2     <from-view-id>/treeSample2.xhtml</from-view-id>
3     <navigation-case>
4         <from-outcome>link_page</from-outcome>
5       <to-view-id>/treeSample2link.xhtml</to-view-id>
6     </navigation-case>
7   </navigation-rule>
treeSample2.xhtml和treeSample2link.xhtml分别为两个使用了template.xhtml模板的页面,显然它们都用到了菜单。

 运行后,首先打开treeSample.xhtml,非常成功,菜单出来了,而且由于使用了Server端树,每次打开子节点,都会提交到服务器,页面刷新后,除了正在操作的节点,其他节点也都保持原来的状态。

但是,当我点击节点,跳转到treeSample2link.xhtml时,问题出来,所有节点都折叠起来,而并没有保持我原来页面的状态。这说明从一个页面跳转到另一个页面时,节点状态并没有被传递过去。
有些想不明白,既然backingbean是session的,为什么没有记录节点的状态呢?网上搜了些资料,很少有提到关于状态的。myface的wiki中似乎也找不到类似的问题。无奈之下,只能直接看tree2的代码,终于发现了问题所在。原来我有个TreeState接口存储节点状态的,而它又是被set到treeModel的,而我的代码中只使用了treeData,没有给它包装成treeModel。Tree2中提供了treeModel的一个实现treeModelBase,直接使用就可以了。于是乎,改一下代码:
 1 public class calendarBean {
 2   
 3       private TreeModel personTreeModel;
 4   
 5       public TreeModel getPersonTreeModel() {
 6           if (null == personTreeModel) {
 7               TreeNode treeData = new TreeNodeBase("foo-folder""Inbox"false);
 8                  
 9               personTreeModel = new TreeModelBase(treeData);
10           }
11         return personTreeModel;
12     }
13  
14 }
改一下绑定:
1  <t:tree2 id="serverTree" value="#{calendarBean.persontreeModel}" 
测试一下,果然,无论怎么链接,依然保持良好的状态,呵呵。
posted @ 2009-12-10 00:02 Aaronbamoo 阅读(1286) | 评论 (4)编辑 收藏

2009年12月9日 #

上次发博还是07年9月的事,那时我还在运营商,这时自己私下再学Java,偶尔上来写点心得。没想过了几个星期,我转身离开运营商,来到了设备商做研发,终于如愿能做些自己喜欢做的工作了,但是忙碌的工作之余,却忘记了再来写点什么。而两年不到的时间,我又再次回到了另一个运营商,发现还是放不下在研发的日子,又开始想做点什么。于是乎,又开始想写点什么。这好比一个轮回,其中的得失,只有自己明白。
posted @ 2009-12-09 23:16 Aaronbamoo 阅读(138) | 评论 (0)编辑 收藏

2007年9月5日 #

/home/aaron/Desktop/Screenshot.png
posted @ 2007-09-05 22:16 Aaronbamoo 阅读(375) | 评论 (0)编辑 收藏

2007年7月16日 #

1,ArrayList的Generics
public class ArrayListGenericDemo 
  
public static void main(String[] args) 
    ArrayList
<String> data = new ArrayList<String>(); 
    data.add(
"hello"); 
    data.add(
"goodbye"); 
    
// data.add(new Date()); This won't compile! 
    Iterator<String> it = data.iterator(); 
    
while (it.hasNext()) 
      String s 
= it.next(); 
      System.out.println(s); 
    }
 
  }
 
}
 
2,HashMap的Generics
public class ArrayListGenericDemo 
  
public static void main(String[] args) 
    ArrayList
<String> data = new ArrayList<String>(); 
    data.add(
"hello"); 
    data.add(
"goodbye"); 
    
// data.add(new Date()); This won't compile! 
    Iterator<String> it = data.iterator(); 
    
while (it.hasNext()) 
      String s 
= it.next(); 
      System.out.println(s); 
    }
 
  }
 
}
 
posted @ 2007-07-16 11:07 Aaronbamoo 阅读(170) | 评论 (0)编辑 收藏

2007年5月23日 #

       尽管EJB2.0自出生就带来了很多非议,但是<head first EJB>仍然值得拜读,原本一直被外界的评论所影响,不敢碰关于EJB的东西,刚刚在CSDN上学习了前几章,发现原来EJB虽然有些复杂,但是也不是高不可攀。今天正好把第三章看完,明天就有朋友帮我把书带来了,继续奋斗!
       尽管过多的不相关工作延缓了Java的学习进程,但是只要坚持信仰,不断努力,一定会看到希望!
posted @ 2007-05-23 18:08 Aaronbamoo 阅读(378) | 评论 (4)编辑 收藏

2007年3月25日 #

    最近在写Hibernate+struts的程序,发现为了完成一个查询功能,废的劲还真不少,总感觉很不爽。真不知道它好在哪里,继续学习<深入浅出Hibernate>。

posted @ 2007-03-25 22:40 Aaronbamoo 阅读(223) | 评论 (0)编辑 收藏

2007年3月21日 #

     摘要: [IBM developerWorks 中国  ] 本文讲述了如何利用Java的反射的机制来简化Structs应用程序的开发。 Struts中引入ActionForm类的意义与缺陷: 在Struts应用程序中,ActionForm是一个很重要的概念,它的主要功能就是为Action的操作提供与客户表单...  阅读全文
posted @ 2007-03-21 10:05 Aaronbamoo 阅读(199) | 评论 (1)编辑 收藏

2007年3月20日 #

    快速学习了一遍《head first servlet/jsp》,发现再次去回顾struts的核心技术,变得那么容易理解。昨天再一次调试开发struts实例,写完后一次性运行成功,哈哈,尽管很简单的程序,还是很爽!
    今天把validation框架又加入到struts,再次运行成功,不过化了不少时间调试,一个很低级的错误,action的配置中忘了加属性validate="true",怪不得总是没有验证就直接转发。希望朋友们别犯同样的错误,呵呵!
    在西安已经呆了快半个月了,有点喜欢上这个城市,相比南方城市的柔美,这里多了几分人文的大气。很喜欢和这里的人们交谈,带着陕西口音的普通话总是很耐听;很喜欢这里的饮食,不需要化太多的钱,就能吃上地道的西安小吃;很喜欢这里的街道,直来直往,永远都不会迷路。不断挖掘西安的文明,将是上课之余一件令人兴奋的事。
posted @ 2007-03-20 16:47 Aaronbamoo 阅读(1182) | 评论 (8)编辑 收藏

仅列出标题