jsf和Facelets我在以前的文章中已经介绍过了这里就不多说了,只接来干的,介绍项目中遇到的问题的解决方法和使用技巧,不定时更新。
转载请注明出处(Cooper的专栏 http://blog.csdn.net/cooper_lyt)
- 使用h:dataTable中每行的链接进行页面跳转和跳转页间的参数传递
由于jsf的dataTable的数据行是根据BackBean提供的集合属性进行生成的,所以要在生成的每行加入链接可以用如下方法(对jsf的dataTable不了解的请先到网上查找相关文章):
- <h:column>
- <f:facet name="header">
- <h:outputText value="oper" />
- </f:facet>
- <a4j:commandLink action="#{backBean.oper}"
- value="View" reRender="wordTable" />
- </h:column>
注:我使用的ajax4jsf如果不使用的话改成jsf的标签就行了如:
- <h:commandLink action="#{mainBean.varibaleActive}"
- value="varibaleActive"></h:commandLink>
但是如何传递参数呢?有两种方法,第一种用param(不推荐使用),用法如下
- <h:commandLink action="#{bizStartBean.beginProcessActive}"
- value="Start">
- <f:param id="processInfoId" name="processInfoId"
- value="#{process.id}" />
- <f:param id="packageId" name="packageId" value="#{package.id}" />
- </h:commandLink>
这样在backBean中就可以通过Request对类取得传递的数据了,如:
- FacesContext facesContext = FacesContext.getCurrentInstance();
- Map<String, String> map = facesContext.getExternalContext()
- .getRequestParameterMap();
- for (ProcessInfo temp : packageMgr.getPackageInfo(
- map.get("packageId")).getProcesses()) {
- if (map.get("processInfoId").equals(temp.getId())) {
- processMgr.setWfProcessMgr(temp.getWfProcessMgr());
- processMgr.beginProcess();
- break;
- }
- }
但这种方法不是很好,好像不太符合jsf的风格,像是将没使用JSF的程序反译成JSF的感觉,那么就有第二种方法,使用jsf的datamodel来对生成表格的集合数据进行封装,首先需要对不同的集合选择不同的datamodel子类,列表如下
ListDataModel, ArrayDataModel, ResultDataModel, ResultSetDataModel, ScalarDataModel
- ListDataModel可以方便的包装java.util.List对象。
ListDataModel(java.util.List list)
- ArrayDataModel可以方便的包装Object[] 数组。
ArrayDataModel(java.lang.Object[] array)
- ResultDataModel可以方便地包装JSTL的结果对象(JSTL Result Object),通常代表通过JSTL标签执行SQL语句产生的结果。
ResultDataModel(javax.servlet.jsp.jstl.sql.Result result)
- ResultSetDataModel可以方便的包装Java对象的结果集(
ResultSet
of Java objects).ResultSetDataModel(java.sql.ResultSet resultSet)
注意:这个结果集必须是可以滚动的(Scrollable),另外如果输入组件(可能更新模型值)通过使用值绑定来引用这个对象,这个结果集必须是可更新(Updatable)的 - ScalarDataModel可以方便的包装单个Java对象。
ScalarDataModel(java.lang.Object scalar)
以上引自 http://alartin.javaeye.com/blog/40180 大家可以去看原文
下面以list为例说明一下。
先是backBean:
- //创建datamodel
- private DataModel wordTypes = new ListDataModel();
- //添充datamodel并返回
- public DataModel getWordTypes(){
- List mWordTypes = wordBookMgr.getAllWordBookType();
- wordTypes.setWrappedData(wordBookMgr.getAllWordBookType());
- if((selectWordType == null) && (mWordTypes.size()>0)){
- selectWordType = (WordBookType)mWordTypes.get(0);
- }
- return wordTypes;
- }
- //取得所选的列
- public void viewWordAction(){
- selectWordType = (WordBookType)wordTypes.getRowData();
- }
页面代码:
- <h:dataTable value="#{wordBookMgrBean.wordTypes}" var="wordType"
- id="typesTable">
- <h:column>
- <f:facet name="header">
- <h:outputText value="isSystem" />
- </f:facet>
- <h:selectBooleanCheckbox value="#{wordType.isSystem}"></h:selectBooleanCheckbox>
- </h:column>
- <h:column>
- <f:facet name="header">
- <h:outputText value="Name" />
- </f:facet>
- <h:outputText value="#{wordType.typeName}"></h:outputText>
- </h:column>
- <h:column>
- <f:facet name="header">
- <h:outputText value="oper" />
- </f:facet>
- <a4j:commandLink action="#{wordBookMgrBean.viewWordAction}"
- value="View" reRender="wordTable" />
- </h:column>
- </h:dataTable>
ok 完成
转载请注明出处(Cooper的专栏 http://blog.csdn.net/cooper_lyt)