|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
认真的记,感觉很紧张根本就没有时间和能力,来对技术知识点进行思考。这样课下就只能对知识进行简单的理解,其实简单的理解就是记忆课堂上讲的知识点,js Tree2组件利用HTML表格将你的数据出现为一个树。这个树是静态的:当用户点击它们时它们能够睁开大概折叠。该组件同时撑持客户端和服务真个交互体例,在客户端交互时利用了JavaScript。在随后的例子中,每次用户的点击将发生一个Request/Response周期,并在新的视图形态(ViewState)中从头出现新的树布局。
注:在前面的例子中只要可见的(已睁开的节点)数据被传送到客户端。而在第一个例子(客户端Tree),在每一个HTMLResponse中,全部树都被发送到客户端扫瞄器。树的每一个节点都包括了很多的HTML代码(假定每一个节点200个字符,这个巨细将取决于你但愿在节点上显现的信息的量),这些信息将被传送到扫瞄器,个中包含了那些不成见的节点(没有睁开的节点),由于它们的一个祖系节点被睁开。假如你有一个深度有四层的树,均匀每一个结点具有四个子结点,这时候候你就必要传输10+102+103+104=11110个节点,每一个节点有200个字符,这个树统共就有2222000个字符,也就是2M的数据。这个例子将向用户申明,固然纯客户端Tree会给客户端带来更好的用户体验,但随之而来的带宽成绩敏捷的增加。纯客户真个树合用于小型的树,大概在Intranet及宽带毗连中利用的中型巨细的树。关于年夜型的树,大概你必要照应到一些低带宽的用户的必要时,你就必要利用服务端树。你能够经由过程的clientSideToggle这个属性来选择你利用的是客户真个树大概服务真个树,<t:tree2>的clientSideToggle这个属性来选择你利用的是客户真个树大概服务真个树,<t:tree2clientSideToggle="false"...>将会利用服务真个树,属性值设为true将会利用客户真个树,默许值为true。
BackingBean:
Tree2组件对BackingBean中的一个TreeModel举行操纵。一般情形,你只需把这个TreeModel绑定到这个组件上就能够了,就像如许:
<t:tree2value="#{myHandler.treeModel}"
上面必要创建一个类MyHandler,在faces-config.xml中的managedbean设置成myHandler,在例子中这个类供应了一个办法getTreeModel()用于前往一个TreeModel用于暗示你的数据。
publicclassMyHandler{
publicTreeModelgetTreeModel(){
......
}
}
TreeModel实践上是对TreeNode实例举行了一些复杂的包装。
TreeNode是一个接口,个中和tree2相干有四个办法:
StringgetType()
booleanisLeaf()
ListgetChildren()
intgetChildCount()
别的办法都没有甚么用途了,大概会在从此的版本中作废。它们请求开辟者在开辟backingbean中做一些其实不需要的操纵。
intgetChildCount()办法前往这个节点的子结点数目,这个办法了很简单的接纳以下的体例完成:
publicfinalintgetChildCount(){
returngetChildren().size();
}
该办法的呈现使得关于子结点的提早加载变的可行。该办法的完成只必要前往该节点的子结点数目,而不必要前往每一个子结点的实例。
booleanisLeaf()办法在该节点没有子节点的时分前往true。如许,一个很刀切斧砍的完成能够如许:
publicfinalbooleanisLeaf(){
returngetChildren().isEmpty();
}
不论你供应了甚么样的完成,在任什么时候间任何情形下你都得坚持getChildren().isEmpty()==>isLeaf()。isLeaf()办法实践上把持了节点被如何出现:是不是被当作树叶节点(不克不及被持续睁开)。
StringgetType()办法决意了用如何的体例来出现这个节点。在JSF页面中,能够在<t:tree2>的Tag中嵌套facet,JSF将会选出与getType()办法前往值同名的facet用于出现。假如该节点没有找到符合的facet,将会招致一个毛病,而且这个办法不会前往null。
ListgetChildren()办法前往一个List,个中包括了该节点下一切的TreeNode,这就暗示这些节点将被出现为该节点下的子结点。该List不克不及包括null,假如该List的巨细和getChildCount()不符,将会报错。子结点将依照它们在List中的按次出现出来。
改动Tree中的内容
(当睁开树的节点时,在背景提早加载)
在邮件列表中有良多关于这项义务的成绩和会商,我(Marcel,一个JSF的初学者)在这里总结一下。假如你有更好的办理计划,请更新这些笔墨。
在这里存在的一个成绩就是我要如许把“+”图标往失落:
・<t:tree2...showNav="false"...>
然后再让文件夹图标(代表包括子节点的节点)变的可点击:
・<h:commandLinkaction="#{t.toggleExpanded}"actionListener="#{navigationBacker.processAction}">
然后在Java代码中承受鼠标点击的事务。在NavigationBacker.java文件中的processAction(ActionEvente)办法里,我从EJB3-persistency中加载子结点的数据。
欠好的是“+”图标变的不成见,可是我如今没有举措猎取点击“+”图标的事务。
看起来在org.apache.myfaces.custom.tree2.HtmlTree.java这个文件里是经由过程注册了_expandControl=newHtmlCommandLink();从外部猎取“+”的点击事务,可是我如今没有举措从我的代码中承受到这一事务。
为了导航,我利用了含有entries的TreeNode.getIdentifier()(拜见:#{node.identifier}),看起来就是这个模样:
・db_id="car_id=7,person_id=2"
这代表了背景数据库表的主键(我还没有找到一个更好的办理计划用于导航)
程序代码以下:
navigation.jsp
<t:tree2id="serverTree"value="#{navigationBacker.treeData}"
var="node"varNodeToggler="t"clientSideToggle="false"showNav="false"
showRootNode="false">
<f:facetname="project-folder">
<h:panelGroup>
<h:commandLinkaction="#{t.toggleExpanded}"actionListener="#{navigationBacker.processAction}">
<t:graphicImagevalue="/images/yellow-folder-open.png"
rendered="#{t.nodeExpanded}"border="0"/>
<t:graphicImagevalue="/images/yellow-folder-closed.png"
rendered="#{!t.nodeExpanded}"border="0"/>
</h:commandLink>
<h:commandLinkaction="#{navigationBacker.toViewId}"
styleClass="#{t.nodeSelected?documentSelected:document}"
actionListener="#{navigationBacker.nodeClicked}"
value="#{node.description}"immediate="true">
<f:paramname="db_id"value="#{node.identifier}"/>
</h:commandLink>
<h:outputTextvalue="(#{node.childCount})"styleClass="childCount"
rendered="#{!emptynode.children}"/>
</h:panelGroup>
</f:facet>
<f:facetname="person-folder">
<h:panelGroup>
NavigationBacker.java
/***//**
*拦阻节点被睁开的事务,并加载分外的数据
*@paramevent
*@throwsAbortProcessingException
*/
publicvoidprocessAction(ActionEventevent)throwsAbortProcessingException{
System.out.println("EnteringprocessAction()");
UIComponentcomponent=(UIComponent)event.getSource();
while(!(component!=null&&componentinstanceofHtmlTree)){
component=component.getParent();
}
if(component!=null){
HtmlTreetree=(HtmlTree)component;
TreeNodeBasenode=(TreeNodeBase)tree.getNode();
if(!tree.isNodeExpanded()&&node.getChildren().size()==0){
Map<String,String>map=splitKeyValues(node.getIdentifier());//一些帮助代码,用于将"car_id=7"或"car_id=7&person_id=12"拆分隔
this.car_id=map.get("car_id");
if(this.car_id!=null){
appendPersonsNodes(node);//拜见上面的例子
}
this.person_id=map.get("person_id");
if(this.person_id!=null){
appendLicensesNodes(node);//没有显现
}
}
}
}
/***//**把以后car_id下的Person子结点到场导航中*/
privatevoidappendPersonsNodes(TreeNodeBasecarDetailNode){
VariableResolverresolver=FacesContext.getCurrentInstance().getApplication().getVariableResolver();
PersonsTablepersonsTable=(PersonsTable)resolver.resolveVariable(FacesContext.getCurrentInstance(),
"personsTable");
List<Person>personsList=personsTable.getCarPersons();
for(Persono:personsList){
List<TreeNodeBase>list=carDetailNode.getChildren();
list.add(newTreeNodeBase("person-folder",o.getDescription(),"person_id="+o.getPersonId(),true));
}
System.out.println("NavigationBackerfetched"+personsList.size()+"PersonsforcarId="+this.car_id);
}
这里有一段帮助代码用于从h:commandLink中猎取f:param用于多种用处。
/***//**
*当JSF组件h:commandLink包括有f:param成员,这些name-value对被放到
*request参数表中供前面的actionhandler利用。不幸的是,如许的用法不克不及用在
*h:commandButton上。我们没有举措把经由过程button来传送这些参数。
*
*由于ActionListeners能够包管在Action办法前被实行到,以是ActionListeners
*能够挪用该办法更新Action办法所必要的任何高低文。
*
*Fromhttp://cvs.sakaiproject.org/release/2.0.0/
*sakai2/gradebook/tool/src/java/org/sakaiproject/tool/gradebook/jsf/FacesUtil.java
*EducationalCommunityLicenseVersion1.0
*/
publicstaticfinalMapgetEventParameterMap(FacesEventevent){
Map<String,String>parameterMap=newHashMap<String,String>();
Listchildren=event.getComponent().getChildren();
for(Iteratoriter=children.iterator();iter.hasNext();){
Objectnext=iter.next();
if(nextinstanceofUIParameter){
UIParameterparam=(UIParameter)next;
parameterMap.put(param.getName(),""+param.getValue());
}
}
//System.out.println("parameterMap="+parameterMap);
returnparameterMap;
}
注:在下面的例子里,backingbean都寄存于session感化域里,能够在WEB-INF/examples-config.xml中举行设置。
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包...... |
|