2007-09-17
jsf实现翻页
关键字: jsf
用jsf实现了翻页功能,主要原理是扩展datamodel和datatabletag
1 扩展datatabletag,增加了几个属性,用于后台执行查询语句
2 dragon.tld
1 扩展datatabletag,增加了几个属性,用于后台执行查询语句
java 代码
- package com.longtop.core.web.jsf.tag;
- import javax.faces.application.Application;
- import javax.faces.component.UIComponent;
- import javax.faces.context.FacesContext;
- import javax.faces.el.ValueBinding;
- import com.sun.faces.taglib.html_basic.DataTableTag;
- public class DataTableWithScrollTag extends DataTableTag {
- private boolean scroll = true;
- private int pageSize = 10;
- private String scrollPageCss = "";
- private String moduleId;
- private String statementId;
- private String beanName;
- private String implType;
- private String searchCondition;
- /**
- * @return the pageSize
- */
- public int getPageSize() {
- return pageSize;
- }
- /**
- * @param pageSize
- * the pageSize to set
- */
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
- /**
- * @return the scroll
- */
- public boolean isScroll() {
- return scroll;
- }
- /**
- * @param scroll
- * the scroll to set
- */
- public void setScroll(boolean scroll) {
- this.scroll = scroll;
- }
- public String getComponentType() {
- return "com.longtop.core.web.jsf.render.DataTableWithScrollType";
- }
- public void setProperties(UIComponent component) {
- super.setProperties(component);
- setStringProperty(component, "pageSize", String.valueOf(pageSize));
- setStringProperty(component, "scroll", String.valueOf(scroll));
- setStringProperty(component, "scrollPageCss", scrollPageCss);
- setStringProperty(component, "moduleId", moduleId);
- setStringProperty(component, "statementId", statementId);
- setStringProperty(component, "beanName", beanName);
- setStringProperty(component, "implType", implType);
- setStringProperty(component, "searchCondition", searchCondition);
- }
- private void setStringProperty(UIComponent component, String attrName,
- String attrValue) {
- if (attrValue == null)
- return;
- if (isValueReference(attrValue)) {
- FacesContext context = FacesContext.getCurrentInstance();
- Application application = context.getApplication();
- ValueBinding binding = application.createValueBinding(attrValue);
- component.setValueBinding(attrName, binding);
- } else {
- component.getAttributes().put(attrName, attrValue);
- }
- }
- /**
- * @return the scrollPageCss
- */
- public String getScrollPageCss() {
- return scrollPageCss;
- }
- /**
- * @param scrollPageCss the scrollPageCss to set
- */
- public void setScrollPageCss(String scrollPageCss) {
- this.scrollPageCss = scrollPageCss;
- }
- /**
- * @return the moduleId
- */
- public String getModuleId() {
- return moduleId;
- }
- /**
- * @param moduleId the moduleId to set
- */
- public void setModuleId(String moduleId) {
- this.moduleId = moduleId;
- }
- /**
- * @return the statementId
- */
- public String getStatementId() {
- return statementId;
- }
- /**
- * @param statementId the statementId to set
- */
- public void setStatementId(String statementId) {
- this.statementId = statementId;
- }
- /**
- * @return the beanName
- */
- public String getBeanName() {
- return beanName;
- }
- /**
- * @param beanName the beanName to set
- */
- public void setBeanName(String beanName) {
- this.beanName = beanName;
- }
- /**
- * @return the implType
- */
- public String getImplType() {
- return implType;
- }
- /**
- * @param implType the implType to set
- */
- public void setImplType(String implType) {
- this.implType = implType;
- }
- /**
- * @return the searchCondition
- */
- public String getSearchCondition() {
- return searchCondition;
- }
- /**
- * @param searchCondition the searchCondition to set
- */
- public void setSearchCondition(String searchCondition) {
- this.searchCondition = searchCondition;
- }
- }
2 dragon.tld
xml 代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE taglib
- PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
- "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
- <taglib>
- <tlib-version>1.0</tlib-version>
- <jsp-version>2.0</jsp-version>
- <short-name>d</short-name>
- <uri>http://com.longtop.net/dataTableWithScroll</uri>
- <tag>
- <name>scrollDataTable</name>
- <tag-class>com.longtop.core.web.jsf.tag.DataTableWithScrollTag</tag-class>
- <tei-class>com.sun.faces.taglib.FacesTagExtraInfo</tei-class>
- <body-content>JSP</body-content>
- <description>
- </description>
- <attribute>
- <name>first</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Zero-relative row number of the first row to be displayed. If this
- property is set to zero, rendering will begin with the first row of
- the underlying data.
- </description>
- </attribute>
- <attribute>
- <name>id</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- The component identifier for this component. This value must be
- unique within the closest parent component that is a naming
- container.
- </description>
- </attribute>
- <attribute>
- <name>rendered</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Flag indicating whether or not this component should be rendered
- (during Render Response Phase), or processed on any subsequent
- form submit.
- </description>
- </attribute>
- <attribute>
- <name>rows</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- The number of rows to display, starting with the one identified by the
- "first" property. If this value is set to zero, all available rows in
- the underlying data model will be displayed.
- </description>
- </attribute>
- <attribute>
- <name>value</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- The current value of this component.
- </description>
- </attribute>
- <attribute>
- <name>var</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Name of a request-scope attribute under which the model data for the
- row selected by the current value of the "rowIndex" property (i.e.
- also the current value of the "rowData" property) will be exposed.
- </description>
- </attribute>
- <attribute>
- <name>bgcolor</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Name or code of the background color for this table.
- </description>
- </attribute>
- <attribute>
- <name>border</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Width (in pixels) of the border to be drawn
- around this table.
- </description>
- </attribute>
- <attribute>
- <name>cellpadding</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Definition of how much space the user agent should
- leave between the border of each cell and its contents.
- </description>
- </attribute>
- <attribute>
- <name>cellspacing</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Definition of how much space the user agent should
- leave between the left side of the table and the
- leftmost column, the top of the table and the top of
- the top side of the topmost row, and so on for the
- right and bottom of the table. It also specifies
- the amount of space to leave between cells.
- </description>
- </attribute>
- <attribute>
- <name>columnClasses</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Comma-delimited list of CSS style classes that will be applied
- to the columns of this table. A space separated list of
- classes may also be specified for any individual column. If
- the number of elements in this list is less than the number of
- columns specified in the "columns" attribute, no "class"
- attribute is output for each column greater than the number of
- elements in the list. If the number of elements in the list
- is greater than the number of columns specified in the
- "columns" attribute, the elements at the posisiton in the list
- after the value of the "columns" attribute are ignored.
- </description>
- </attribute>
- <attribute>
- <name>dir</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Direction indication for text that does not inherit directionality.
- Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).
- </description>
- </attribute>
- <attribute>
- <name>footerClass</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Space-separated list of CSS style class(es) that will be
- applied to any footer generated for this table.
- </description>
- </attribute>
- <attribute>
- <name>frame</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Code specifying which sides of the frame surrounding
- this table will be visible. Valid values are:
- none (no sides, default value); above (top side only);
- below (bottom side only); hsides (top and bottom sides
- only); vsides (right and left sides only); lhs (left
- hand side only); rhs (right hand side only); box
- (all four sides); and border (all four sides).
- </description>
- </attribute>
- <attribute>
- <name>headerClass</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <description>
- Space-separated list of CSS style class(es) that will be
- applied to any header generated for this table.
- </description>
- </attribute>
- <attribute>
- <name>lang</name>
- <required>false</required>
- <rtexprvalue>false</
评论
fishhappy365
2008-01-15
大哥:能给我你这个工程的源代码码?如果可以的话,发到我邮箱中,我的邮箱地址是:
fishhappy365@163.com
fishhappy365@163.com
fishhappy365
2008-01-14
大哥:DataTableTag 是final类型的,这个你也能继承?
-妞-
2007-11-22
dragon.tld 文件没帖完整,能否帖完整啊?
我也正在用jsf 做分页,可否把你的完整代码发给我啊?
我也正在用jsf 做分页,可否把你的完整代码发给我啊?
gapele
2007-09-30
fourfire
2007-09-21
谢谢你的回复,我有以下考虑
1 我需要提供多种扩充的查询条件的方式,这是一种,这样的话就可以共用后台一个主查询语句了
也可以实现IScrollDataLoad在后台进行条件添加
2 页面上还有用js添加运行期条件的方法
如books2_condition_txt
这样有些模块就不用为了一个条件的变化而写很多的dao方法了,查询业务,简单一些为好
1 我需要提供多种扩充的查询条件的方式,这是一种,这样的话就可以共用后台一个主查询语句了
也可以实现IScrollDataLoad在后台进行条件添加
2 页面上还有用js添加运行期条件的方法
如books2_condition_txt
这样有些模块就不用为了一个条件的变化而写很多的dao方法了,查询业务,简单一些为好
john.yi
2007-09-19
引用
<d:scrollDataTable id="books2"
# value="#{TestBean.otherDataModel}" pageSize="10" var="store2" scroll="true" moduleId="tools" statementId="ChineseLetter" beanName="queryHibernate" searchCondition="obj.id like '%A%'" implType="hibernate">
# value="#{TestBean.otherDataModel}" pageSize="10" var="store2" scroll="true" moduleId="tools" statementId="ChineseLetter" beanName="queryHibernate" searchCondition="obj.id like '%A%'" implType="hibernate">
个人不太喜欢这种方式
条件都在页面里了
直接加个总页数,绑定到DataModel(只有一页数据)是否好用些呢
fourfire
2007-09-17
测试页面(hibernate实现)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="/WEB-INF/tld/dragon.tld" prefix="d" %>
<style type="text/css">
body { font: 11px Lucida Grande, Verdana, Arial, Helvetica, sans serif; }
#progressBar { padding-top: 5px; }
#progressBarBox { width: 350px; height: 20px; border: 1px inset; background: #eee;}
#progressBarBoxContent { width: 0; height: 20px; border-right: 1px solid #444; background: #9ACB34; }
td{border: 1px solid #333;text-align:center;}
tr{border: 1px solid #333;text-align:center;}
</style>
<f:view>
<h:form>
<d:scrollDataTable id="books2"
value="#{TestBean.otherDataModel}" pageSize="10" var="store2" scroll="true" moduleId="tools" statementId="ChineseLetter" beanName="queryHibernate" searchCondition="obj.id like '%A%'" implType="hibernate">
<h:column>
<f:facet name="header">
<h:outputText value="A"/>
</f:facet>
<h:outputText value="#{store2.id}"/>
</h:column>
<h:column>
<h:outputText value="#{store2.letter}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="B"/>
</f:facet>
<h:outputText value="#{store2.chinese}"/>
</h:column>
</d:scrollDataTable>
<input type="button" onclick="document.getElementById('_id0:books2_condition_txt').value='obj.letter like \'%1%\'';alert('');" value="setValue">
</h:form>
</f:view>
</body>
</html>
fourfire
2007-09-17
解码器
package com.longtop.core.web.jsf.render;
import java.io.IOException;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import com.longtop.core.web.jsf.model.ScrollDataModel;
public class DataTableWithScroll extends
javax.faces.component.html.HtmlDataTable {
/*
* (non-Javadoc)
*
* @see javax.faces.component.UIData#encodeBegin(javax.faces.context.FacesContext)
*/
@Override
public void encodeBegin(FacesContext context) throws IOException {
String clientId = getClientId(context);
String currentPage = (String) context.getExternalContext()
.getRequestParameterMap().get(clientId + "_txt");
String searchCondition_dynamic = (String) context.getExternalContext()
.getRequestParameterMap().get(clientId + "_condition_txt");
ScrollDataModel dataModel = (ScrollDataModel) this.getValue();
dataModel.setImplType((String) this.getAttributes().get("implType"));
dataModel.setBeanName((String) this.getAttributes().get("beanName"));
dataModel.setStatementId((String) this.getAttributes().get(
"statementId"));
dataModel.setModuleId((String) this.getAttributes().get("moduleId"));
if (currentPage == null || currentPage.trim().length() == 0) {
dataModel.setCurrentPage(0);
} else {
dataModel.setCurrentPage(Integer.parseInt(currentPage));
}
String searchCondition_static=(String) this.getAttributes().get("searchCondition");
dataModel.setQueryParam(((searchCondition_static==null||searchCondition_static.trim().length()==0)?"":searchCondition_static)+((searchCondition_dynamic==null||searchCondition_dynamic.trim().length()==0)?" ":" and "+searchCondition_dynamic));
dataModel.loadData();
super.encodeBegin(context);
}
/*
* (non-Javadoc)
*
* @see javax.faces.component.UIComponentBase#decode(javax.faces.context.FacesContext)
*/
@Override
public void decode(FacesContext context) {
super.decode(context);
}
/*
* (non-Javadoc)
*
* @see javax.faces.component.UIComponentBase#encodeEnd(javax.faces.context.FacesContext)
*/
@Override
public void encodeEnd(FacesContext context) throws IOException {
super.encodeEnd(context);
ResponseWriter writer = context.getResponseWriter();
try {
ScrollDataModel dataModel = (ScrollDataModel) this.getValue();
String clientId = getClientId(context);
writer.startElement("div", this);
writer.writeAttribute("class", this.getAttributes().get(
"scrollPageCss"), null);
writer.writeAttribute("name", clientId + "_div", null);
writer.writeAttribute("id", clientId + "_div", null);
// 当前页
String currentPage = (String) context.getExternalContext()
.getRequestParameterMap().get(clientId + "_txt");
writer.startElement("input", this);
writer.writeAttribute("name", clientId + "_txt", null);
writer.writeAttribute("id", clientId + "_txt", null);
writer.writeAttribute("type", "hidden", null);
writer.writeAttribute("value", "" + currentPage, null);
writer.endElement("input");
// 查询条件
String searchCondition_dynamic = (String) context.getExternalContext()
.getRequestParameterMap().get(clientId + "_condition_txt");
writer.startElement("input", this);
writer.writeAttribute("name", clientId + "_condition_txt", null);
writer.writeAttribute("id", clientId + "_condition_txt", null);
writer.writeAttribute("type", "hidden", null);
writer.writeAttribute("value", "" + ((searchCondition_dynamic==null||searchCondition_dynamic.trim().length()==0)?"":searchCondition_dynamic), null);
writer.endElement("input");
writer.startElement("a", this);
writer.writeAttribute("href", "javascript:scrollPage(0)", null);
writer.writeText("首页", null);
writer.endElement("a");
writer.writeText(" ", null);
if (dataModel.getCurrentPage() == 0) {
writer.writeText("上一页", null);
} else {
writer.startElement("a", this);
writer.writeAttribute("href", "javascript:scrollPage("
+ (dataModel.getCurrentPage() - 1) + ")", null);
writer.writeText("上一页", null);
writer.endElement("a");
}
writer.writeText(" ", null);
if (dataModel.getCurrentPage() == ((dataModel.getRowTotalCount() / dataModel
.getRowsInPage()))) {
writer.writeText("下一页", null);
} else {
writer.startElement("a", this);
writer.writeAttribute("href", "javascript:scrollPage("
+ (dataModel.getCurrentPage() + 1) + ")", null);
writer.writeText("下一页", null);
writer.endElement("a");
}
writer.writeText(" ", null);
writer.startElement("a", this);
writer.writeAttribute("href", "javascript:scrollPage("
+ ((dataModel.getRowTotalCount() / dataModel
.getRowsInPage())) + ")", null);
writer.writeText("末页", null);
writer.endElement("a");
writer.writeText(" ", null);
writer.startElement("a", this);
writer.writeText("共" + dataModel.getRowTotalCount() + "条记录", null);
writer.endElement("a");
writer.endElement("div");
writer.startElement("script", this);
writer.writeAttribute("language", "javascript", null);
writer.writeText("function scrollPage(p){document.getElementById('"
+ clientId + "_txt').value=p;"
+ "document.getElementById('" + clientId
+ "_txt').form.submit();}", null);
writer.endElement("script");
} catch (IOException e) {
e.printStackTrace();
}
}
}
fourfire
2007-09-17
model层
package com.longtop.core.web.jsf.model;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.DataModel;
public class ScrollDataModel extends DataModel {
/**
* 总行数
*/
private long rowTotalCount;
/**
* 当前页
*/
private int currentPage=0;
/**
* 每页行数
*/
private int rowsInPage=10;
private int rowIndex;
private List data=new ArrayList();
private String moduleId;
private String beanName;
private String statementId;
private Object queryParam;
/**
* 接口实现方式
*/
private String implType;
/**
* IBATIS
*/
public static final String IMPLTYPE_IBATIS="ibatis";
/**
* HIBERNATE
*/
public static final String IMPLTYPE_HIBERNATE="hibernate";
public ScrollDataModel()
{
super();
}
public void loadData()
{
IScrollDataLoad loader=null;
data.clear();
if(this.getImplType().toLowerCase().equals(IMPLTYPE_IBATIS))
{
loader=new DefaultScrollDataLoaderIBatisImpl();
}else if(this.getImplType().toLowerCase().equals(IMPLTYPE_HIBERNATE))
{
loader=new DefaultScrollDataLoaderHibernateImpl();
}
else{
try {
loader=(IScrollDataLoad) Class.forName(moduleId).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
data.addAll(loader.loadData(moduleId,beanName,statementId, queryParam, currentPage*rowsInPage, rowsInPage));
rowTotalCount=loader.loadDataTotalCount(moduleId,beanName,statementId, queryParam);
}
/**
* @return the currentPage
*/
public int getCurrentPage() {
return currentPage;
}
/**
* @param currentPage
* the currentPage to set
*/
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
/**
* @return the pageCount
*/
public long getRowTotalCount() {
return rowTotalCount;
}
/**
* @param pageCount
* the pageCount to set
*/
public void setRowTotalCount(long rowTotalCount) {
this.rowTotalCount = rowTotalCount;
}
/**
* @return the rowsInPage
*/
public int getRowsInPage() {
return rowsInPage;
}
/**
* @param rowsInPage
* the rowsInPage to set
*/
public void setRowsInPage(int rowsInPage) {
this.rowsInPage = rowsInPage;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getRowData() {
return data.get(this.getRowIndex());
}
@Override
public int getRowIndex() {
return rowIndex;
}
@Override
public Object getWrappedData() {
return data.get(this.getRowIndex());
}
@Override
public boolean isRowAvailable() {
if(this.getRowIndex()<data.size()&&this.getRowIndex()>-1) return true;
return false;
}
@Override
public void setRowIndex(int arg0) {
rowIndex=arg0;
}
@Override
public void setWrappedData(Object arg0) {
data.set(this.getRowIndex(),arg0);
}
/**
* @return the beanName
*/
public String getBeanName() {
return beanName;
}
/**
* @param beanName the beanName to set
*/
public void setBeanName(String beanName) {
this.beanName = beanName;
}
/**
* @return the data
*/
public List getData() {
return data;
}
/**
* @param data the data to set
*/
public void setData(List data) {
this.data = data;
}
/**
* @return the moduleId
*/
public String getModuleId() {
return moduleId;
}
/**
* @param moduleId the moduleId to set
*/
public void setModuleId(String moduleId) {
this.moduleId = moduleId;
}
/**
* @return the queryParam
*/
public Object getQueryParam() {
return queryParam;
}
/**
* @param queryParam the queryParam to set
*/
public void setQueryParam(Object queryParam) {
this.queryParam = queryParam;
}
/**
* @return the statementId
*/
public String getStatementId() {
return statementId;
}
/**
* @param statementId the statementId to set
*/
public void setStatementId(String statementId) {
this.statementId = statementId;
}
/**
* @return the implType
*/
public String getImplType() {
return implType;
}
/**
* @param implType the implType to set
*/
public void setImplType(String implType) {
this.implType = implType;
}
}
fourfire
2007-09-17
数据载入接口
/**
* <p>Description:ltCore</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: LongTop</p>
* @author blaze
* @version 1.0
*/
package com.longtop.core.web.jsf.model;
/**
* 翻页的数据检索接口,包括获得当前页数据,和获得数据总数两个方法
*/
public interface IScrollDataLoad {
/**
* 获得当前页数据
*
* @param moduleId 模块id
* @param beanName bean名称
* @param statementId 语句id
* @param queryParam
* 查询条件
* @param startIndex
* 开始行
* @param rowsInPage
* 每页行数
* @return
*/
public java.util.Collection loadData(String moduleId, String beanName,
String statementId, Object queryParam, int startIndex,
int rowsInPage);
/**
* 获得数据总行数
* @param moduleId 模块id
* @param beanName bean名称
* @param statementId 语句id
* @param queryParam查询条件
* @return
*/
public long loadDataTotalCount(String moduleId, String beanName,
String statementId, Object queryParam);
}
发表评论
- 浏览: 82081 次

- 详细资料
搜索本博客
我的相册
Image(029)
共 15 张
共 15 张
最新评论
-
hibernate annotation提供 ...
看了,没说怎么搞啊
-- by fourfire -
hibernate annotation提供 ...
晕..原来是这样.. 你去看看 http://docs.jboss.org/ej ...
-- by rain16881 -
hibernate annotation提供 ...
我也有这个问题
-- by rain16881 -
hibernate annotation提供 ...
自己搞定一个,为表增加comment的方法@Entity@Table(name= ...
-- by fourfire -
flex以remoteobject方式调 ...
配置方法类似,调用方法相同
-- by fourfire






评论排行榜