sss*_*sss -1 jsf spring hibernate primefaces
我必须将我的dataTable转换为惰性dataTable。我该怎么做?这是我的示例代码:
IndexBean.java
@Name("indexBean")
public class IndexBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
UserService userService;
private List<User> userList;
@Inject
MessageService messageService;
private List<Message> messageList;
private Integer dataTableRendered;
public void getAllUser() {
setDataTableRendered(1);
userList = new ArrayList<User>();
userList = userService.getAllUser();
if (userList.size() > 0) {
addMessageSuccess("Success", "Success");
} else {
addMessageError("Failure", "Failure!");
}
}
public void getAllMessages() {
setDataTableRendered(2);
messageList = new ArrayList<Message>();
messageList = messageService.getAllMessages();
if (messageList.size() > 0) {
addMessageSuccess("Success", "Success");
} else {
addMessageError("Failure", "Failure!");
}
}
public void addMessageSuccess(String summary, String detail) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail);
FacesContext.getCurrentInstance().addMessage(null, message);
}
public void addMessageError(String summary, String detail) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail);
FacesContext.getCurrentInstance().addMessage(null, message);
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public List<Message> getMessageList() {
return messageList;
}
public void setMessageList(List<Message> messageList) {
this.messageList = messageList;
}
public Integer getDataTableRendered() {
return dataTableRendered;
}
public void setDataTableRendered(Integer dataTableRendered) {
this.dataTableRendered = dataTableRendered;
}
}
Run Code Online (Sandbox Code Playgroud)
index.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html">
<h:head></h:head>
<p:layout fullPage="true">
<!-- Status Waiting Dialog -->
<p:ajaxStatus onstart="PF('statusDialog').show()"
onsuccess="PF('statusDialog').hide()" />
<p:dialog widgetVar="statusDialog" modal="true" draggable="false"
closable="false" resizable="false" showHeader="true"
header="Please wait...">
<p:graphicImage value="/images/loader.gif"
style=" float: left;position: relative;left: 30%;" />
</p:dialog>
<!-- Left Layout -->
<p:layoutUnit position="west" id="west">
<p:growl autoUpdate="true" id="infoMessage" showDetail="true"
showSummary="true" sticky="false" />
<p:commandButton value="Get Users"
actionListener="#{indexBean.getAllUser}"
update="infoMessage,centerForm,centerForm:userTable" />
<p:commandButton value="Get Messages"
actionListener="#{indexBean.getAllMessages}"
update="infoMessage,centerForm,centerForm:messageRaporTable" />
</p:layoutUnit>
<!-- Center Layout -->
<p:layoutUnit position="center" id="center">
<h:form id="centerForm">
<!-- User dataTable -->
<p:dataTable id="userTable" var="user"
value="#{indexBean.userList }" paginator="true" rows="10"
lazy="true" rendered="#{indexBean.dataTableRendered ==1}"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15,20,25,50,100">
<p:column headerText="userid" sortBy="#{user.userId}"
filterBy="#{user.userId}">
<h:outputText value="#{user.userId}"></h:outputText>
</p:column>
<p:column headerText="username" sortBy="#{user.userName}"
filterBy="#{user.userName}">
<h:outputText value="#{user.userName}"></h:outputText>
</p:column>
<p:column headerText="firstname" sortBy="#{user.userFirstName}"
filterBy="#{user.userFirstName}">
<h:outputText value="#{user.userFirstName}"></h:outputText>
</p:column>
</p:dataTable>
<p:column headerText="Message Id"
filterBy="#{message.messageId}"
sortBy="#{message.messageId}">
<h:outputText value="#{message.messageId}" />
</p:column>
<p:column headerText="Sender"
sortBy="#{message.messageSender}" filterBy="#{message.messageSender}">
<h:outputText value="#{message.messageSender}" />
</p:column>
<p:column headerText="Receiver"
sortBy="#{message.messageReceiver}"
filterBy="#{message.messageReceiver}">
<h:outputText value="#{message.messageReceiver}" />
</p:column>
<p:column headerText="Subject"
sortBy="#{message.messageSubject}"
filterBy="#{message.messageSubject}">
<h:outputText value="#{message.messageSubject}" />
</p:column>
<p:column headerText="Message"
sortBy="#{message.messageText}"
filterBy="#{message.messageText}">
<h:outputText value="#{message.messageText}" />
</p:column>
</p:dataTable>
</h:form>
</p:layoutUnit>
</p:layout>
Run Code Online (Sandbox Code Playgroud)
UserService.java
public interface UserService {
public List<User> getAllUser();
}
Run Code Online (Sandbox Code Playgroud)
UserServiceImpl.java
@Service("userService")
@Component
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public List<User> getAllUser() {
return userDAO.getAllUser();
}
}
Run Code Online (Sandbox Code Playgroud)
UserDAO.java
public interface UserDAO {
public List<User> getAllUser();
}
Run Code Online (Sandbox Code Playgroud)
UserDAOImpl.java- 实际上此sql更复杂。
@Component
@Repository("userDAO")
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
@SuppressWarnings("unchecked")
@Override
public List<User> getAllUser() {
List<User> userList = new ArrayList<User>();
String sql = "select * from SECRETDB.USER";
try {
Query query = getSession().createSQLQuery(sql).addScalar("userOID", StringType.INSTANCE)
.addScalar("userName", StringType.INSTANCE).addScalar("firstName", StringType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(User.class)).setCacheable(false)
.setCacheMode(CacheMode.IGNORE);
userList = query.list();
getSession().clear();
} catch (HibernateException e) {
getSession().clear();
e.printStackTrace();
}
return userList;
}
Run Code Online (Sandbox Code Playgroud)
User.java
public class User {
private String userOID;
private String userName;
private String firstName;
public String getUserOID() {
return userOID;
}
public void setUserOID(String userOID) {
this.userOID = userOID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
Run Code Online (Sandbox Code Playgroud)
HibernateDaoSupport.java
public abstract class HibernateDaoSupport {
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
}
Run Code Online (Sandbox Code Playgroud)
在index.xhtml中的数据表中,我看到了
value="#{indexBean.userList }" paginator="true" rows="10"
lazy="true"
Run Code Online (Sandbox Code Playgroud)
userList指向的位置
private List<User> userList;
Run Code Online (Sandbox Code Playgroud)
错了 它应该是
private LazyUserDataModel<User> userList
Run Code Online (Sandbox Code Playgroud)
请阅读展示和userguide页167-168实施LazyDataModel。这里没有人会教你实现它。下面是使用hibernate和JPA的通用lazydatamodel的示例。
public class GenericLazyDataModel<T> extends LazyDataModel<T> {
@Transient
protected static Logger debugLogger = Logger.getLogger("DebugLogger");
protected EntityManager entityManager;
protected String hqlQuery;
private String countQuery;
protected List<SortFieldInfoDTO> defaultSortFields;
protected List<T> currentObjectList;
protected List<Object> parameterValues;
protected List<String> parameterName;
protected List<Object> filterFieldValues;
protected List<String> filterFieldName;
public GenericLazyDataModel(EntityManager entityManager, String hqlQuery,
String countQuery, List<SortFieldInfoDTO> sortFieldInfos,
List<Object> parameterValues, List<String> parameterName) {
super();
this.entityManager = entityManager;
this.hqlQuery = hqlQuery;
this.countQuery = countQuery;
this.defaultSortFields = sortFieldInfos;
this.parameterValues = parameterValues;
this.parameterName = parameterName;
this.setRowCount(calculateRecordCount());
}
@Override
public List<T> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, Object> filters) {
String sqlQuery = hqlQuery;
int filterCount = 0;
if(sortOrder==null){
sortOrder=SortOrder.ASCENDING;
}
if (filterFieldValues != null && filterFieldName != null) {
filterFieldValues.clear();
filterFieldName.clear();
}
for (Iterator<String> iterator = filters.keySet().iterator(); iterator
.hasNext();) {
String filterField = iterator.next();
if (debugLogger.isInfoEnabled()) {
debugLogger.info("Filter Field Name " + filterField);
}
// Check if the HQL Query already has a where clause
if (sqlQuery.toLowerCase().indexOf("where") != -1) {
sqlQuery = sqlQuery + " and " + filterField
+ " like :filterFieldValue" + filterCount;
} else {
sqlQuery = sqlQuery + " where " + filterField
+ " like :filterFieldValue" + filterCount;
}
if (filterFieldValues == null) {
filterFieldValues = new ArrayList<Object>();
}
if (filterFieldName == null) {
filterFieldName = new ArrayList<String>();
}
filterFieldValues.add(((String)filters.get(filterField)).toUpperCase() + "%");
filterFieldName.add("filterFieldValue" + filterCount);
filterCount++;
}
//************************
boolean isOrderFieldFound=Boolean.FALSE;
if(sortField !=null && !sortField.isEmpty()){
isOrderFieldFound=Boolean.TRUE;
sqlQuery = sqlQuery + " order by " + sortField+(sortOrder==SortOrder.ASCENDING?" ASC ":" DESC ");
}
if(isOrderFieldFound){
if(defaultSortFields !=null && !defaultSortFields.isEmpty()){
for(SortFieldInfoDTO fld:defaultSortFields){
if(!sqlQuery.contains(fld.getAliasedFieldName())) sqlQuery=sqlQuery+" , "+fld.getAliasedFieldName()+(fld.getSortOrder()==SortOrder.ASCENDING?" ASC ":" DESC ");
}
}
}else{
if(defaultSortFields !=null && !defaultSortFields.isEmpty()){
int index=0;
for(SortFieldInfoDTO fld:defaultSortFields){
if(index==0){
if(!sqlQuery.contains(fld.getAliasedFieldName())) sqlQuery = sqlQuery + " order by " + fld.getAliasedFieldName()+(fld.getSortOrder()==SortOrder.ASCENDING?" ASC ":" DESC ");
index++;
}else{
if(!sqlQuery.contains(fld.getAliasedFieldName())) sqlQuery=sqlQuery+" , "+fld.getAliasedFieldName()+(fld.getSortOrder()==SortOrder.ASCENDING?" ASC ":" DESC ");
}
}
}
}
//*********************************
if (debugLogger.isInfoEnabled())debugLogger.info("sqlQuery:"+sqlQuery);
Query query = entityManager.createQuery(sqlQuery);
int parameterCount = 0;
if (parameterValues != null) {
for (Iterator<Object> iterator = parameterValues.iterator(); iterator
.hasNext();) {
Object type = iterator.next();
query.setParameter(parameterName.get(parameterCount), type);
parameterCount++;
}
}
int parameterCount1 = 0;
if (filterFieldValues != null && !filterFieldValues.equals("")) {
for (Iterator<Object> iterator = filterFieldValues.iterator(); iterator
.hasNext();) {
Object type = iterator.next();
query.setParameter(filterFieldName.get(parameterCount1), type);
parameterCount1++;
}
}
if (debugLogger.isInfoEnabled())debugLogger.info("first page value " + first);
if (debugLogger.isInfoEnabled())debugLogger.info("pageSize page value " + pageSize);
query.setFirstResult(first);
query.setMaxResults(pageSize);
currentObjectList = query.getResultList();
return currentObjectList;
}
private int calculateRecordCount() {
Query query = entityManager.createQuery(countQuery);
int parameterCount = 0;
if (parameterValues != null) {
for (Iterator<Object> iterator = parameterValues.iterator(); iterator
.hasNext();) {
Object type = iterator.next();
query.setParameter(parameterName.get(parameterCount), type);
parameterCount++;
}
}
if (filterFieldValues != null) {
for (Iterator<Object> iterator = filterFieldValues.iterator(); iterator
.hasNext();) {
Object type = iterator.next();
query.setParameter(filterFieldName.get(parameterCount), type);
parameterCount++;
}
}
Long rowCount = (Long) query.getSingleResult();
if (debugLogger.isInfoEnabled()) {
debugLogger.info("rowCount Application Data Model" + rowCount);
}
return rowCount.intValue();
}
public List<T> getCurrentObjectList() {
return currentObjectList;
}
Run Code Online (Sandbox Code Playgroud)
}
使用这个并自己学习,祝您好运。
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |