作者: kent鹏

转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html

该项目在SSH三大框架整合基础上进行开发:http://www.cnblogs.com/xieyupeng/p/7108141.html

一、客户列表

  1.分析

  2.书写步骤

  (1)封装PageBean

  1. public class PageBean {
  2. //当前页数
  3. private Integer currentPage;
  4. //总记录数
  5. private Integer totalCount;
  6. //每页显示条数
  7. private Integer pageSize;
  8. //总页数
  9. private Integer totalPage;
  10. //分页列表数据
  11. private List list;
  12. public PageBean(Integer currentPage, Integer totalCount, Integer pageSize) {
  13. this.totalCount = totalCount;
  14.  
  15. this.pageSize = pageSize;
  16.  
  17. this.currentPage = currentPage;
  18.  
  19. if(this.currentPage == null){
  20. //如页面没有指定显示那一页.显示第一页.
  21. this.currentPage = 1;
  22. }
  23.  
  24. if(this.pageSize == null){
  25. //如果每页显示条数没有指定,默认每页显示3条
  26. this.pageSize = 3;
  27. }
  28.  
  29. //计算总页数
  30. this.totalPage = (this.totalCount+this.pageSize-1)/this.pageSize;
  31.  
  32. //判断当前页数是否超出范围
  33. //不能小于1
  34. if(this.currentPage < 1){
  35. this.currentPage = 1;
  36. }
  37. //不能大于总页数
  38. if(this.currentPage > this.totalPage){
  39. this.currentPage = this.totalPage;
  40. }
  41.  
  42. }
  43. //计算起始索引
  44. public int getStart(){
  45. return (this.currentPage-1)*this.pageSize;
  46. }
  47.  
  48. public Integer getCurrentPage() {
  49. return currentPage;
  50. }
  51. public void setCurrentPage(Integer currentPage) {
  52. this.currentPage = currentPage;
  53. }
  54. public Integer getTotalCount() {
  55. return totalCount;
  56. }
  57. public void setTotalCount(Integer totalCount) {
  58. this.totalCount = totalCount;
  59. }
  60. public Integer getPageSize() {
  61. return pageSize;
  62. }
  63. public void setPageSize(Integer pageSize) {
  64. this.pageSize = pageSize;
  65. }
  66. public Integer getTotalPage() {
  67. return totalPage;
  68. }
  69. public void setTotalPage(Integer totalPage) {
  70. this.totalPage = totalPage;
  71. }
  72. public List getList() {
  73. return list;
  74. }
  75. public void setList(List list) {
  76. this.list = list;
  77. }
  78.  
  79. }

  (2)书写Action

  1. public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
  2. private Customer customer = new Customer();
  3.  
  4. private CustomerService cs;
  5.  
  6. private Integer currentPage;
  7. private Integer pageSize;
  8. public String list() throws Exception {
  9. //封装离线查询对象
  10. DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
  11. //判断并封装参数
  12. if(StringUtils.isNotBlank(customer.getCust_name())){
  13. dc.add(Restrictions.like("cust_name", "%"+customer.getCust_name()+"%"));
  14. }
  15.  
  16. //1 调用Service查询分页数据(PageBean)
  17. PageBean pb = cs.getPageBean(dc,currentPage,pageSize);
  18. //2 将PageBean放入request域,转发到列表页面显示
  19. ActionContext.getContext().put("pageBean", pb);
  20. return "list";
  21. }
  22.  
  23. @Override
  24. public Customer getModel() {
  25. return customer;
  26. }
  27.  
  28. public void setCs(CustomerService cs) {
  29. this.cs = cs;
  30. }
  31.  
  32. public Integer getCurrentPage() {
  33. return currentPage;
  34. }
  35.  
  36. public void setCurrentPage(Integer currentPage) {
  37. this.currentPage = currentPage;
  38. }
  39.  
  40. public Integer getPageSize() {
  41. return pageSize;
  42. }
  43.  
  44. public void setPageSize(Integer pageSize) {
  45. this.pageSize = pageSize;
  46. }
  47.  
  48. }

  (3)书写Service

  1. public class CustomerServiceImpl implements CustomerService {
  2. private CustomerDao cd;
  3. @Override
  4. public PageBean getPageBean(DetachedCriteria dc, Integer currentPage, Integer pageSize) {
  5. //1 调用Dao查询总记录数
  6. Integer totalCount = cd.getTotalCount(dc);
  7. //2 创建PageBean对象
  8. PageBean pb = new PageBean(currentPage, totalCount, pageSize);
  9. //3 调用Dao查询分页列表数据
  10.  
  11. List<Customer> list = cd.getPageList(dc,pb.getStart(),pb.getPageSize());
  12. //4 列表数据放入pageBean中.并返回
  13. pb.setList(list);
  14. return pb;
  15. }
  16. public void setCd(CustomerDao cd) {
  17. this.cd = cd;
  18. }
  19.  
  20. }

  (4)书写Dao

  1. public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
  2.  
  3. public Integer getTotalCount(DetachedCriteria dc) {
  4. //设置查询的聚合函数,总记录数
  5. dc.setProjection(Projections.rowCount());
  6.  
  7. List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
  8.  
  9. //清空之前设置的聚合函数
  10. dc.setProjection(null);
  11.  
  12. if(list!=null && list.size()>0){
  13. Long count = list.get(0);
  14. return count.intValue();
  15. }else{
  16. return null;
  17. }
  18. }
  19.  
  20. public List<Customer> getPageList(DetachedCriteria dc, int start, Integer pageSize) {
  21.  
  22. return (List<Customer>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
  23.  
  24. }
  25.  
  26. }

  (5)完成struts以及spring的配置

   strus.xml添加代码:

  1. <action name="CustomerAction_*" class="customerAction" method="{1}" >
  2. <result name="list" >/jsp/customer/list.jsp</result>
  3. </action>

   applicationContext.xml添加代码:

  1. <bean name="customerAction" class="cn.xyp.web.action.CustomerAction" scope="prototype" >
  2. <property name="cs" ref="customerService" ></property>
  3. </bean>
  4.  
  5. <bean name="customerService" class="cn.xyp.service.impl.CustomerServiceImpl" >
  6. <property name="cd" ref="customerDao" ></property>
  7. </bean>
  8.  
  9. <bean name="customerDao" class="cn.xyp.dao.impl.CustomerDaoImpl" >
  10. <!-- 注入sessionFactory -->
  11. <property name="sessionFactory" ref="sessionFactory" ></property>
  12. </bean>

  (6)书写前台list.jsp页面

   主要通过表单提交隐藏域的数据、jq和ognl表达式来实现。

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  4. <%@ taglib prefix="s" uri="/struts-tags" %>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <TITLE>客户列表</TITLE>
  9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  10. <LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
  11. <LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
  12. rel=stylesheet>
  13. <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
  14. <SCRIPT language=javascript>
  15. function changePage(pageNum){
  16. //1 将页码的值放入对应表单隐藏域中
  17. $("#currentPageInput").val(pageNum);
  18. //2 提交表单
  19. $("#pageForm").submit();
  20. };
  21.  
  22. function changePageSize(pageSize){
  23. //1 将页码的值放入对应表单隐藏域中
  24. $("#pageSizeInput").val(pageSize);
  25. //2 提交表单
  26. $("#pageForm").submit();
  27. };
  28. </SCRIPT>
  29.  
  30. <META content="MSHTML 6.00.2900.3492" name=GENERATOR>
  31. </HEAD>
  32. <BODY>
  33.  
  34. <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
  35. <TBODY>
  36. <TR>
  37. <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
  38. border=0></TD>
  39. <TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
  40. height=20></TD>
  41. <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
  42. border=0></TD>
  43. </TR>
  44. </TBODY>
  45. </TABLE>
  46. <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
  47. <TBODY>
  48. <TR>
  49. <TD width=15 background=${pageContext.request.contextPath }/images/new_022.jpg><IMG
  50. src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
  51. <TD vAlign=top width="100%" bgColor=#ffffff>
  52. <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
  53. <TR>
  54. <TD class=manageHead>当前位置:客户管理 &gt; 客户列表</TD>
  55. </TR>
  56. <TR>
  57. <TD height=2></TD>
  58. </TR>
  59. </TABLE>
  60. <TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0
  61. width="100%" align=center border=0>
  62. <TBODY>
  63. <TR>
  64. <TD height=25>
  65. <FORM id="pageForm" name="customerForm"
  66. action="${pageContext.request.contextPath }/CustomerAction_list"
  67. method=post>
  68. <!-- 隐藏域.当前页码 -->
  69. <input type="hidden" name="currentPage" id="currentPageInput" value="<s:property value="#pageBean.currentPage" />" />
  70. <!-- 隐藏域.每页显示条数 -->
  71. <input type="hidden" name="pageSize" id="pageSizeInput" value="<s:property value="#pageBean.pageSize" />" />
  72. <TABLE cellSpacing=0 cellPadding=2 border=0>
  73. <TBODY>
  74. <TR>
  75. <TD>客户名称:</TD>
  76. <TD><INPUT class=textbox id=sChannel2
  77. style="WIDTH: 80px" maxLength=50 name="cust_name" value="${param.cust_name}"></TD>
  78.  
  79. <TD><INPUT class=button id=sButton2 type=submit
  80. value=" 筛选 " name=sButton2></TD>
  81. </TR>
  82. </TBODY>
  83. </TABLE>
  84. </FORM>
  85. </TD>
  86. </TR>
  87.  
  88. <TR>
  89. <TD>
  90. <TABLE id=grid
  91. style="BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc"
  92. cellSpacing=1 cellPadding=2 rules=all border=0>
  93. <TBODY>
  94. <TR
  95. style="FONT-WEIGHT: bold; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none">
  96. <TD>客户名称</TD>
  97. <TD>客户级别</TD>
  98. <TD>客户来源</TD>
  99. <TD>联系人</TD>
  100. <TD>电话</TD>
  101. <TD>手机</TD>
  102. <TD>操作</TD>
  103. </TR>
  104. <s:iterator value="#pageBean.list" var="cust" >
  105. <TR
  106. style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
  107. <TD>
  108. <s:property value="#cust.cust_name" />
  109. </TD>
  110. <TD>
  111. <s:property value="#cust.cust_level" />
  112. </TD>
  113. <TD>
  114. <s:property value="#cust.cust_source" />
  115. </TD>
  116. <TD>
  117. <s:property value="#cust.cust_linkman" />
  118. </TD>
  119. <TD>
  120. <s:property value="#cust.cust_phone" />
  121. </TD>
  122. <TD>
  123. <s:property value="#cust.cust_mobile" />
  124. </TD>
  125. <TD>
  126. <a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
  127. &nbsp;&nbsp;
  128. <a href="${pageContext.request.contextPath }/customerServlet?method=delete&custId=${customer.cust_id}">删除</a>
  129. </TD>
  130. </TR>
  131. </s:iterator>
  132.  
  133. </TBODY>
  134. </TABLE>
  135. </TD>
  136. </TR>
  137.  
  138. <TR>
  139. <TD><SPAN id=pagelink>
  140. <DIV
  141. style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right">
  142. 共[<B><s:property value="#pageBean.totalCount" /> </B>]条记录,[<B><s:property value="#pageBean.totalPage" /></B>]页
  143. ,每页显示 <%-- changePageSize($('#pageSizeSelect option').filter(':selected').val()) --%>
  144. <select name="pageSize" onchange="changePageSize($('#pageSizeSelect option:selected').val())" id="pageSizeSelect" >
  145. <option value="3" <s:property value="#pageBean.pageSize==3?'selected':''" /> >3</option>
  146. <option value="5" <s:property value="#pageBean.pageSize==5?'selected':''" /> >5</option>
  147. </select>

  148. [<A href="javaScript:void(0)" onclick="changePage(<s:property value='#pageBean.currentPage-1' />)" >前一页</A>]
  149. <B><s:property value="#pageBean.currentPage" /></B>
  150. [<A href="javaScript:void(0)" onclick="changePage(<s:property value='#pageBean.currentPage+1' />)" >后一页</A>]

  151. <input type="text" size="3" id="page" name="page" value="<s:property value="#pageBean.currentPage" />" />
  152.  
  153. <input type="button" value="Go" onclick="changePage($('#page').val())"/>
  154. </DIV>
  155. </SPAN></TD>
  156. </TR>
  157. </TBODY>
  158. </TABLE>
  159. </TD>
  160. <TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"><IMG
  161. src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
  162. </TR>
  163. </TBODY>
  164. </TABLE>
  165. <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
  166. <TBODY>
  167. <TR>
  168. <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
  169. border=0></TD>
  170. <TD align=middle width="100%"
  171. background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
  172. <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
  173. border=0></TD>
  174. </TR>
  175. </TBODY>
  176. </TABLE>
  177.  
  178. </BODY>
  179. </HTML>

二、BaseDao封装

  1.抽取BaseDao

  2.BaseDao设计思路

  3.BaseDao接口书写

  1. public interface BaseDao<T> {
  2. //增
  3. void save(T t);
  4. //删
  5. void delete(T t);
  6. //删
  7. void delete(Serializable id);
  8. //改
  9. void update(T t);
  10. //查 根据id查询
  11. T getById(Serializable id);
  12. //查 符合条件的总记录数
  13. Integer getTotalCount(DetachedCriteria dc);
  14. //查 查询分页列表数据
  15. List<T> getPageList(DetachedCriteria dc,Integer start,Integer pageSize);
  16.  
  17. }

  4.BaseDao的实现类

  1. public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
  2.  
  3. private Class clazz;//用于接收运行期泛型类型
  4.  
  5. public BaseDaoImpl() {
  6. //获得当前类型的带有泛型类型的父类
  7. ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass();
  8. //获得运行期的泛型类型
  9. clazz = (Class) ptClass.getActualTypeArguments()[0];
  10. }
  11.  
  12. @Override
  13. public void save(T t) {
  14. getHibernateTemplate().save(t);
  15. }
  16.  
  17. @Override
  18. public void delete(T t) {
  19.  
  20. getHibernateTemplate().delete(t);
  21.  
  22. }
  23.  
  24. @Override
  25. public void delete(Serializable id) {
  26. T t = this.getById(id);//先取,再删
  27. getHibernateTemplate().delete(t);
  28. }
  29.  
  30. @Override
  31. public void update(T t) {
  32. getHibernateTemplate().update(t);
  33. }
  34.  
  35. @Override
  36. public T getById(Serializable id) {
  37.  
  38. return (T) getHibernateTemplate().get(clazz, id);
  39. }
  40.  
  41. @Override
  42. public Integer getTotalCount(DetachedCriteria dc) {
  43. //设置查询的聚合函数,总记录数
  44. dc.setProjection(Projections.rowCount());
  45.  
  46. List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
  47.  
  48. //清空之前设置的聚合函数
  49. dc.setProjection(null);
  50.  
  51. if(list!=null && list.size()>0){
  52. Long count = list.get(0);
  53. return count.intValue();
  54. }else{
  55. return null;
  56. }
  57.  
  58. }
  59.  
  60. @Override
  61. public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
  62.  
  63. List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
  64.  
  65. return list;
  66. }
  67. }

  5.业务Dao中的应用

  1. public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
  2.  
  3. }

JAVAEE——SSH项目实战02:客户列表和BaseDao封装的更多相关文章

  1. JAVAEE——SSH项目实战04:联系人添加、列表显示和修改

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7159337.html 一.联系人添加 1.添加页面设计    linkman/list. ...

  2. JAVAEE——SSH项目实战05:用户注册、登陆校验拦截器、员工拜访客户功能和MD5加密

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7170519.html 一.用户注册   显示错误信息到页面上的另一种方法: public ...

  3. JAVAEE——SSH项目实战03:新增客户、数据字典、文件上传和修改客户

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7145599.html 一.新增客户 1.数据字典  用于枚举项目中有限个数的字典项 (1 ...

  4. JAVAEE——SSH项目实战01:SVN介绍、安装和使用方法

    1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...

  5. JAVAEE——SSH项目实战01:SVN介绍、eclipse插件安装和使用方法

    1 学习目标 1.掌握svn服务端.svn客户端.svn eclipse插件安装方法 2.掌握svn的基本使用方法 2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对 ...

  6. JAVAEE——SSH项目实战06:统计信息管理、Spring注解开发和EasyUI

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7190925.html 一.统计信息管理   二.Spring注解开发 1.service ...

  7. 【SSH项目实战三】脚本密钥的批量分发与执行

    [SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...

  8. 【SSH项目实战】脚本密钥的批量分发与执行【转】

    [TOC] 前言 <项目实战>系列为<linux实战教学笔记>第二阶段内容的同步教学配套实战练习,每个项目循序衔接最终将组成<Linux实战教学笔记>第二阶段核心教 ...

  9. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

随机推荐

  1. 在CentOS上使用Jexus托管运行 ZKEACMS

    ZKEACMS Core 是基于 .net core 开发的,可以在 windows, linux, mac 上跨平台运行,接下来我们来看看如何在 CentOS 上使用Jexus托管运行 ZKEACM ...

  2. swift学习 - collectionView

    swift CollectionView学习 效果图: 源码: ContModel.swift import UIKit class ContModel: NSObject { var title:S ...

  3. OpenCV探索之路(十六):图像矫正技术深入探讨

    刚进入实验室导师就交给我一个任务,就是让我设计算法给图像进行矫正.哎呀,我不太会图像这块啊,不过还是接下来了,硬着头皮开干吧! 那什么是图像的矫正呢?举个例子就好明白了. 我的好朋友小明给我拍了这几张 ...

  4. windows下Python 3.x图形图像处理库PIL的安装

    图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴.PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前 ...

  5. Spring学习笔记——01 控制反转

    想一下之前学的Java,如果某个类需要引用某个对象,则需要手动new一个出来.这样带来的一个问题就是,若被引用的类发生改动或被删除,则引用它的所有类都会报错.因为两个类耦合在一起了.解决的办法就是不由 ...

  6. WPF 简易的跑马灯效果

    最近项目上要用到跑马灯的效果,和网上不太相同的是,网上大部分都是连续的,而我们要求的是不连续的. 也就是是,界面上就展示4项(展示项数可变),如果有7项要展示的话,则不断的在4个空格里左跳,当然,衔接 ...

  7. OpenGL教程(1)——准备

    在正式开始学习OpenGL之前,我们需要先配置好OpenGL环境. IDE 首先我们需要选择一个IDE.支持OpenGL的IDE有很多,这里我们选择Visual Studio 2015(Windows ...

  8. Hadoop化繁为简(二)—层层递进轻松入门hdfs

    层层递进-解开hdfs的面纱 1.hdfs是什么?它与普通服务器的文件系统有什么区别?它的特性有什么? 2.hdfs的工作原理是怎样的? 3.每台机器都单独启动有什么弊端?假设有1000台机器需要启动 ...

  9. Html5模拟通讯录人员排序(sen.js)

    // JavaScript Document var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_2 = & ...

  10. 移动端页面开发适配 rem布局原理

    主题 HTML移动端页面开发适配 rem布局原理 什么是适配,为什么要适配 我们拿到的设计图一般是以640,750,1080分辨率为基准设计的,而现在的手机终端各式各样,分辨率不同,逻辑像素不同 ,适 ...