step1:
写页面:
buyerList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/pages/share/taglib.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户列表</title>
<link rel="stylesheet" style="text/css"
href="<c:url value='/css/buyerlist.css'/>" />
<link rel="stylesheet" style="text/css"
href="<c:url value='/css/jquery.treeview.css'/>" />
<link rel="stylesheet" style="text/css"
href="<c:url value='/css/screen.css'/>" />
</head>
<body>
<div id="header"><%@ include
file="/WEB-INF/pages/share/header.jsp"%></div>
<div id="contain">
<div id="menu">
<%@ include file="/WEB-INF/pages/share/menu.jsp"%>
</div>
<div id="right"></div>
<div id="content">
<table>
<tr>
<td>用户名</td>
<td>电子邮箱</td>
<td>性别</td>
<td>可用</td>
</tr>
<c:forEach var="entity" items="${entitys}">
<tr>
<td>${entity.username }</td>
<td>${entity.email }</td>
<td>${entity.gender.name }</td>
<td>
<c:if test="${entity.visable }">可用</c:if>
<c:if test="${!entity.visable }">禁用</c:if>
</td>
<tr>
</c:forEach>
</table>
</div>
</div>
<div id="footer"><%@ include
file="/WEB-INF/pages/share/footer.jsp"%></div>
</body>
</html>
header.jsp:
<%@page pageEncoding="UTF-8"%>
<%@include file="/WEB-INF/pages/share/taglib.jsp"%>
<span>
总记录数${pageView.recordCount},每页显示${pageView.pageSize}条记录,第[${pageView.currentPage
}/${pageView.totalPage}]页,
<c:if test="${pageView.havePrev }">
<a href="<html:rewrite action='/control/user/list.do'/>?page=1"><strong>第一页</strong>
</a>
<a
href="<html:rewrite action='/control/user/list.do'/>?page=${pageView.currentPage -1}"><strong>上一页</strong>
</a>
</c:if> <c:if test="${!pageView.havePrev }">
<strong>第一页</strong>
<strong>上一页</strong>
</c:if> <c:forEach var="cp" begin="${ pageView.fistPage}"
end="${pageView.lastPage }">
<c:if test="${pageView.currentPage != cp }">
<a href="<html:rewrite action='/control/user/list.do'/>?page=${cp}"><strong>第${cp}页</strong>
</a>
</c:if>
<c:if test="${pageView.currentPage == cp }">
<strong>第${cp}页</strong>
</c:if>
</c:forEach> <c:if test="${pageView.haveNext }">
<a
href="<html:rewrite action='/control/user/list.do'/>?page=${pageView.currentPage +1}"><strong>下一页</strong>
</a>
<a
href="<html:rewrite action='/control/user/list.do'/>?page=${pageView.totalPage}"><strong>尾页</strong>
</a>
</c:if> <c:if test="${!pageView.haveNext }">
<strong>下一页</strong>
<strong>尾页</strong>
</c:if> </span>
step2:
写页面辅助类:package zzg.shop.web.support;
import java.io.Serializable;
public final class Page implements Serializable {
private static final long serialVersionUID = -589401814262887381L;
private long recordCount;// 记录总数
private int pageSize;// 每页记录数
private long fistPage = 1;// 显示的起始页
private long lastPage = 1;// 显示的最末页
private long maxPage = 10;// 每页显示多少页
private long currentPage = 1;// 当前页号
private long totalPage;// 页面总数
private boolean haveNext;// 是否有下一页
private boolean havePrev;// 是否有上一页
/**
*
* @param recordCount
* 记录总数
* @param pageSize
* 每页记录数
* @param currentPage
* 当前页
* @param maxPage
* 每次最多显示页数
*/
public Page(long recordCount, int pageSize, long currentPage, long maxPage) {
calculatePage(recordCount, pageSize, currentPage, maxPage);
}
/**
* 默认构造函数,总记录数1,每页记录数1,当前页1,每次显示页数1
*/
public Page() {
calculatePage(1, 1, 1, 1);
}
public long getRecordCount() {
return recordCount;
}
/**
* 设置总记录数
*
* @param recordCount
*/
public void setRecordCount(long recordCount) {
calculatePage(recordCount, pageSize, currentPage, maxPage);
}
public int getPageSize() {
return pageSize;
}
/**
* 每页显示记录数
*
* @param pageSize
*/
public void setPageSize(int pageSize) {
calculatePage(recordCount, pageSize, currentPage, maxPage);
}
public long getFistPage() {
return fistPage;
}
/**
* 设置起始页
*
* @param fistPage
*/
public void setFistPage(long fistPage) {
this.fistPage = fistPage;
if (fistPage < 1)
this.fistPage = 1;
if (fistPage > this.totalPage)
this.fistPage = this.totalPage;
long t = this.fistPage + maxPage - 1;
lastPage = t > this.totalPage ? this.totalPage : t;
}
public long getLastPage() {
return lastPage;
}
public long getCurrentPage() {
return currentPage;
}
/**
* 设置当前页
*
* @param currentPage
*/
public void setCurrentPage(long currentPage) {
this.currentPage = currentPage;
if (currentPage < 1)
this.currentPage = 1;
if (currentPage > this.totalPage)
this.currentPage = this.totalPage;
if (currentPage < this.fistPage)
this.fistPage = this.currentPage - this.maxPage + 1;
if (currentPage > this.lastPage)
this.fistPage = this.currentPage;
setFistPage(fistPage);
if (this.currentPage > 1)
this.havePrev = true;
else
this.havePrev = false;
if (this.currentPage < this.totalPage)
this.haveNext = true;
else
this.haveNext = false;
}
public long getTotalPage() {
return totalPage;
}
public boolean isHaveNext() {
return haveNext;
}
public boolean isHavePrev() {
return havePrev;
}
// 当前页起始记录
public long getFistRecord() {
return this.pageSize * (this.currentPage - 1);
}
// 当前页结束记录
public long getLastRecord() {
long t = getFistRecord() + this.pageSize - 1;
return t < this.recordCount ? t : this.recordCount - 1;
}
/**
* 计算页面参数值
*
* @param recordCount
* @param pageSize
* @param currentPage
* @param maxPage
*/
private void calculatePage(long recordCount, int pageSize,
long currentPage, long maxPage) {
/* 参数非法,抛出异常 */
if (recordCount <= 0 || pageSize <= 0 || currentPage <= 0)
throw new RuntimeException("不合法页面构建参数!");
this.recordCount = recordCount;
this.pageSize = pageSize;
this.totalPage = recordCount % pageSize == 0 ? recordCount / pageSize
: recordCount / pageSize + 1;
setMaxPage(maxPage);
setFistPage(fistPage);
setCurrentPage(currentPage);
}
public long getMaxPage() {
return maxPage;
}
/**
* 设置每次显示页数
*
* @param maxPage
*/
public void setMaxPage(long maxPage) {
if (maxPage < 1)
return;
setFistPage(fistPage);
this.maxPage = maxPage;
}
}
step3:
配置strut-config.xml:
<form-beans>
<form-bean name="buyerForm"
type="zzg.shop.web.formbean.user.BuyerFormBean">
</form-bean>
<action-mappings>
<action path="/control/user/list" name="buyerForm" scope="request">
<forward name="buyerListUI" path="/WEB-INF/pages/user/buyerlist.jsp"></forward>
</action>
</action-mappings>
step4:
写formBean及Actionpackage zzg.shop.web.formbean.user;
BuyerFormBean.java
import org.apache.struts.action.ActionForm;
public class BuyerFormBean extends ActionForm{
/**
*
*/
private static final long serialVersionUID = 1L;
private String username;
private String password;
private String password2;
private String email;
private long page=1;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public String getPassword2() {
return password2;
}
public long getPage() {
return page;
}
public void setPage(long page) {
this.page = page;
}
}
BuyerListAction.java
package zzg.shop.web.action.user;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.stereotype.Controller;
import zzg.shop.bean.user.Buyer;
import zzg.shop.service.base.QueryResult;
import zzg.shop.service.user.BuyerService;
import zzg.shop.web.formbean.user.BuyerFormBean;
import zzg.shop.web.support.Page;
@Controller("/control/user/list")
public class BuyerListAction extends Action {
@Resource BuyerService buyerService;
private Page page = new Page();
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
page.setRecordCount(buyerService.getCount());
page.setMaxPage(3);
page.setPageSize(3);
BuyerFormBean buyerBean = (BuyerFormBean)form;
page.setCurrentPage(buyerBean.getPage());
request.setAttribute("pageView", page);
QueryResult<Buyer> entitys=buyerService.getScrollResult((int)page.getFistRecord(), (int)page.getPageSize());
request.setAttribute("entitys", entitys.getResultList());
return mapping.findForward("buyerListUI");
}
}
附上dao及先关类:
dao.java
package zzg.shop.service.base;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
public interface Dao<T> {
/**
* 保存实体
*
* @param entity
* 要保存的实体
*/
public void save(T entity);
/**
* 更新实体
*
* @param entity
* 要更新的实体
*/
public void update(T entity);
/**
* 删除实体
*
* @param entity
* 要删除的实体id
*/
public void delete(Serializable entityid);
/**
* 得到实体
*
* @param entityid 实体的id
* @return 实体
*/
public T find(Serializable entityid);
/**
*
* @return 所有实体
*/
public List<T> findAll();
/**
*
* @return 得到实体数量
*/
public long getCount();
/**
* 分页查询
* @param fistResult
* @param maxResult
* @return
*/
public QueryResult<T> getScrollResult(int fistResult, int maxResult);
/**
* 带排序的分页查询
* @param fistResult
* @param maxResult
* @param orders
* @return
*/
public QueryResult<T> getScrollResult(int fistResult, int maxResult,Map<String,Boolean> orders);
/**
* 带条件和排序的分页查询
* @param fistResult
* @param maxResult
* @param orders
* @param wheres
* @param params
* @return
*/
public QueryResult<T> getScrollResult(int fistResult, int maxResult,Map<String,Boolean> orders,String[] wheres,Object[] params);
}
genericServiceBean.java
package zzg.shop.service.base;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public abstract class genericServiceBean<T> implements Dao<T> {
@PersistenceContext
protected EntityManager em;
private Class<T> entityClass = getEntityClass();
@SuppressWarnings({ "unchecked" })
private Class<T> getEntityClass() {
Type type = this.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
return (Class<T>) parameterizedType.getActualTypeArguments()[0];
}
return null;
}
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public QueryResult<T> getScrollResult(int fistResult, int maxResult) {
return getScrollResult(fistResult, maxResult, null, null, null);
}
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public QueryResult<T> getScrollResult(int fistResult, int maxResult,
Map<String, Boolean> orders) {
return getScrollResult(fistResult, maxResult, orders, null, null);
}
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@SuppressWarnings("unchecked")
public QueryResult<T> getScrollResult(int fistResult, int maxResult,
Map<String, Boolean> orders, String[] wheres, Object[] params) {
String entityName = entityClass.getSimpleName();
QueryCreater qc = new QueryCreater(entityName, "o");
qc.addOrderBy(orders);
qc.addWhere(wheres);
//System.out.println(qc.CreateQueryString());
Query query =qc.CreateQuery(em, params);
query.setFirstResult(fistResult).setMaxResults(maxResult);
QueryResult<T> qr = new QueryResult<T>();
qr.setResultList(query.getResultList());
qc=new QueryCreater(entityName, "o",new String[]{"count()"});
qc.addWhere(wheres);
query = qc.CreateQuery(em, params);
qr.setTotalResult((Long) query.getSingleResult());
return qr;
}
@Override
public void save(T entity) {
em.persist(entity);
}
@Override
public void update(T entity) {
em.merge(entity);
}
@Override
public void delete(Serializable entityid) {
em.remove(em.getReference(entityClass, entityid));
}
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public T find(Serializable entityid) {
return em.find(entityClass, entityid);
}
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public List<T> findAll() {
String query = "select o from " + entityClass.getName() + " o";
return em.createQuery(query).getResultList();
}
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public long getCount() {
String query = "select count(o) from " + entityClass.getName() + " o";
return (Long) em.createQuery(query).getSingleResult();
}
}
QueryCreater.java
package zzg.shop.service.base;
import java.util.Map;
import java.util.Map.Entry;
import javax.persistence.EntityManager;
import javax.persistence.Query;
public class QueryCreater {
private String alias;
private int index = 0;
private StringBuilder body = new StringBuilder();
private StringBuilder order = new StringBuilder();
private StringBuilder where = new StringBuilder();
public QueryCreater(String className, String alias, String[] columns) {
this.alias = alias;
body.append("select ");
if (columns != null)
for (String column : columns) {
if ("count()".equals(column.trim()))
body.append("count(").append(alias).append("),");
else
body.append(alias).append(".").append(column).append(",");
}
body.deleteCharAt(body.length()-1);
body.append(" from ").append(className).append(" ").append(alias);
}
public QueryCreater(String className, String alias) {
this.alias = alias;
body.append("select ").append(alias).append(" from ").append(className)
.append(" ").append(alias);
}
public QueryCreater() {
}
public void init(String className, String alias) {
this.alias = alias;
body.append("select ").append(alias).append(" from ").append(className)
.append(" ").append(alias);
}
public QueryCreater addOrderBy(String field, boolean asc) {
if (order.length() != 0)
order.append(",");
order.append(alias).append(".").append(field).append(" ")
.append(asc ? "asc" : "desc");
return this;
}
public QueryCreater addOrderBy(Map<String, Boolean> orders) {
if (orders != null)
for (Entry<String, Boolean> entry : orders.entrySet()) {
if (order.length() != 0)
order.append(",");
order.append(alias).append(".").append(entry.getKey())
.append(" ").append(entry.getValue() ? "asc" : "desc");
}
return this;
}
public QueryCreater addWhere(String condition) {
if (where.length() != 0)
where.append(" and ");
where.append(alias).append(".").append(condition).append("?")
.append(index++);
return this;
}
public QueryCreater addWhere(String[] wheres) {
if (wheres != null)
for (String condition : wheres) {
if (where.length() != 0)
where.append(" and ");
where.append(alias).append(".").append(condition).append("?")
.append(index++);
}
return this;
}
public String CreateQueryString() {
StringBuilder sb = new StringBuilder();
sb.append(body);
if (where.length() != 0) {
sb.append(" where ").append(where);
}
if (order.length() != 0) {
sb.append(" order by ").append(order);
}
return sb.toString();
}
public Query CreateQuery(EntityManager em, Object[] params) {
Query query = null;
if (em != null) {
query = em.createQuery(CreateQueryString());
if (params != null)
for (int i = 0; i < params.length; i++)
query.setParameter(i, params[i]);
}
return query;
}
}
QueryResult
package zzg.shop.service.base;
import java.util.List;
public class QueryResult<T> {
/**
* 结果集
*/
private List<T> resultList;
/**
* 结果总数
*/
private long totalResult;
public List<T> getResultList() {
return resultList;
}
public void setResultList(List<T> resultList) {
this.resultList = resultList;
}
public long getTotalResult() {
return totalResult;
}
public void setTotalResult(long totalResult) {
this.totalResult = totalResult;
}
}
BuyerService.java
package zzg.shop.service.user;
import zzg.shop.bean.user.Buyer;
import zzg.shop.service.base.Dao;
public interface BuyerService extends Dao<Buyer> {
/**
* 判断用户名是否存在
* @param username
* @return
*/
public boolean exsit(String username);
/**
* 判断用户名是否存在及密码是否正确
* @param username
* @param password
* @return
*/
public boolean validate(String username,String password);
}
BuyerServiceBean.java
package zzg.shop.service.user.impl;
import javax.persistence.Query;
import org.springframework.stereotype.Service;
import zzg.shop.bean.user.Buyer;
import zzg.shop.service.base.genericServiceBean;
import zzg.shop.service.user.BuyerService;
import zzg.shop.utils.MD5;
@Service
public class BuyerServiceBean extends genericServiceBean<Buyer> implements
BuyerService {
/**
* 以MD5保存用户密码
*/
@Override
public void save(Buyer entity) {
entity.setPassword(MD5.MD5Encode(entity.getPassword()));
super.save(entity);
}
public boolean exsit(String username) {
Query query = em
.createQuery("select count(o) from Buyer o where o.username=?1");
query.setParameter(1, username);
return (Long) query.getSingleResult() > 0;
}
@Override
public boolean validate(String username, String password) {
Long result = (Long) em
.createQuery(
"select count(o) from Buyer o where o.username=?1 and password=?2")
.setParameter(1, username)
.setParameter(2, MD5.MD5Encode(password)).getSingleResult();
return result > 0;
}
}
先写到这里,有空再梳理下