现在的位置: 首页 > 综合 > 正文

JAVA项目开发笔记(4)JSF和Facelets部分:使用技巧

2013年03月30日 ⁄ 综合 ⁄ 共 4499字 ⁄ 字号 评论关闭

 jsf和Facelets我在以前的文章中已经介绍过了这里就不多说了,只接来干的,介绍项目中遇到的问题的解决方法和使用技巧,不定时更新。

 

转载请注明出处(Cooper的专栏    http://blog.csdn.net/cooper_lyt

  1. 使用h:dataTable中每行的链接进行页面跳转和跳转页间的参数传递

 由于jsf的dataTable的数据行是根据BackBean提供的集合属性进行生成的,所以要在生成的每行加入链接可以用如下方法(对jsf的dataTable不了解的请先到网上查找相关文章):

  1.                             <h:column>
  2.                                 <f:facet name="header">
  3.                                     <h:outputText value="oper" />
  4.                                 </f:facet>
  5.                                 <a4j:commandLink action="#{backBean.oper}"
  6.                                     value="View" reRender="wordTable" />
  7.                             </h:column>

注:我使用的ajax4jsf如果不使用的话改成jsf的标签就行了如:

  1.                             <h:commandLink action="#{mainBean.varibaleActive}"
  2.                                 value="varibaleActive"></h:commandLink>

但是如何传递参数呢?有两种方法,第一种用param(不推荐使用),用法如下

  1.                                 <h:commandLink action="#{bizStartBean.beginProcessActive}"
  2.                                     value="Start">
  3.                                     <f:param id="processInfoId" name="processInfoId"
  4.                                         value="#{process.id}" />
  5.                                     <f:param id="packageId" name="packageId" value="#{package.id}" />
  6.                                 </h:commandLink>

这样在backBean中就可以通过Request对类取得传递的数据了,如:

  1. FacesContext facesContext = FacesContext.getCurrentInstance();
  2.         Map<String, String> map = facesContext.getExternalContext()
  3.                 .getRequestParameterMap();
  4.             for (ProcessInfo temp : packageMgr.getPackageInfo(
  5.                     map.get("packageId")).getProcesses()) {
  6.                 if (map.get("processInfoId").equals(temp.getId())) {
  7.                     processMgr.setWfProcessMgr(temp.getWfProcessMgr());
  8.                     processMgr.beginProcess();
  9.                     break;
  10.                 }
  11.             }

但这种方法不是很好,好像不太符合jsf的风格,像是将没使用JSF的程序反译成JSF的感觉,那么就有第二种方法,使用jsf的datamodel来对生成表格的集合数据进行封装,首先需要对不同的集合选择不同的datamodel子类,列表如下

 

ListDataModel, ArrayDataModel, ResultDataModel, ResultSetDataModel, ScalarDataModel

  1. ListDataModel可以方便的包装java.util.List对象。ListDataModel(java.util.List list)
  2. ArrayDataModel可以方便的包装Object[] 数组。ArrayDataModel(java.lang.Object[] array)
  3. ResultDataModel可以方便地包装JSTL的结果对象(JSTL Result Object),通常代表通过JSTL标签执行SQL语句产生的结果。ResultDataModel(javax.servlet.jsp.jstl.sql.Result result)
  4. ResultSetDataModel可以方便的包装Java对象的结果集(ResultSet of Java objects). ResultSetDataModel(java.sql.ResultSet resultSet)注意:这个结果集必须是可以滚动的(Scrollable),另外如果输入组件(可能更新模型值)通过使用值绑定来引用这个对象,这个结果集必须是可更新(Updatable)的
  5. ScalarDataModel可以方便的包装单个Java对象。ScalarDataModel(java.lang.Object scalar)

以上引自 http://alartin.javaeye.com/blog/40180 大家可以去看原文

 

下面以list为例说明一下。

先是backBean:

  1. //创建datamodel
  2. private DataModel wordTypes = new ListDataModel();
  3. //添充datamodel并返回
  4.     public DataModel getWordTypes(){
  5.         List mWordTypes = wordBookMgr.getAllWordBookType();
  6.         wordTypes.setWrappedData(wordBookMgr.getAllWordBookType());
  7.         if((selectWordType == null) && (mWordTypes.size()>0)){
  8.             selectWordType = (WordBookType)mWordTypes.get(0);
  9.         }
  10.         return wordTypes;
  11.     }
  12. //取得所选的列
  13.     public void viewWordAction(){
  14.         selectWordType = (WordBookType)wordTypes.getRowData();
  15.     }

 

页面代码:

  1.                         <h:dataTable value="#{wordBookMgrBean.wordTypes}" var="wordType"
  2.                             id="typesTable">
  3.                             <h:column>
  4.                                 <f:facet name="header">
  5.                                     <h:outputText value="isSystem" />
  6.                                 </f:facet>
  7.                                 <h:selectBooleanCheckbox value="#{wordType.isSystem}"></h:selectBooleanCheckbox>
  8.                             </h:column>
  9.                             <h:column>
  10.                                 <f:facet name="header">
  11.                                     <h:outputText value="Name" />
  12.                                 </f:facet>
  13.                                 <h:outputText value="#{wordType.typeName}"></h:outputText>
  14.                             </h:column>
  15.                             <h:column>
  16.                                 <f:facet name="header">
  17.                                     <h:outputText value="oper" />
  18.                                 </f:facet>
  19.                                 <a4j:commandLink action="#{wordBookMgrBean.viewWordAction}"
  20.                                     value="View" reRender="wordTable" />
  21.                             </h:column>
  22.                         </h:dataTable>

ok 完成

 

转载请注明出处(Cooper的专栏    http://blog.csdn.net/cooper_lyt

 

抱歉!评论已关闭.