JAVA WEB从入门到精通 day20 分页技术&小项目:客户管理系统
2017-04-07 13:48
519 查看
分页
什么是分页?
我们用网站查询信息时,经常会看到第N页/总M页 首页 1 2 3 4 5 6 7 8 9 尾页 下一页
分页就是将数据分页数来显示
为什么要分页?
1.我们查询数据时如果数据量太多,一次全部传输,会影响性能和效率。 2.用户在一页上看到成千上万行数据也会影响用户体验,所以我们一次只查询一页的数据。
进行分页所需要的数据
-当前页码:我们点击页码,数据库就要查询当前页码对应的数据。 -总页数:可以通过全部数据的总数除以每页显示的数据数来得到。 -当前页的数据:当前页的数据。 -全部数据数:数据库里总共有多少数据 -每页显示的数据(自己规定):一页显示的数据数
分页Bean的设计
这些分页数据总要在各层之间来回的传递 例如 : 需要从jsp页面将当前点击的页码传递 servlet需要向service层传递页码和我们规定的每页显示的数据数 service层要调用dao层完成对数据的操作。 所以我们把这些分页数据封装到一个javabean中,以方便传递,它就叫分页Bean,例如:PageBean
分页Bean public class PageBean<T> { private int currentPage; // 当前的页码 private int totalData; //全部数据的总数量 private int pageData; //每页显示的数据数 private List<T> beanList; //当前页的数据 private String url; //用来存放查询的条件 public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getTotalPages() { //获取总页数 int totalpages=totalData/pageData; //总页数可以通过数据数除以每页的数据数得到 return totalData%pageData==0?totalpages:totalpages+1; } public void setTotalData(int totalData){ this.totalData=totalData; } public int getTotalData() { return totalData; } public int getPageData() { return pageData; } public void setPageData(int pageData) { this.pageData = pageData; } public List<T> getBeanList() { return beanList; } public void setBeanList(List<T> beanList) { this.beanList = beanList; } }
各层的分工
jsp页面:显示分页的链接,传递当前的页码 例如:第N页/总M页 首页 1 2 3 4 5 6 7 8 9 尾页 下一页 servlet层:获取当前页码,指定每页显示的数据数,传递给service层,得到pageBean对象,把pageBean对象保存到request域,转发给页面 service层:获取当前页码和每页显示的数据数,调用DAO层方法 DAO层:获取当前页码和每页数据数,查询数据库得到全部数据数和当前页面要显示的数据,封装到pageBean中,返回pageBean对象。
解决jsp页面中页码列表的显示
页码列表 :1 2 3 4 5 6 7 8 9 10 -首先我们定为每页最多显示十个页码。 -当前页码在页码列表的位置。 其实定下来页码列表需要开始位置begin和结束位置end。 例如:1 2 3 4 5 6 7 8 9 10 我们参照百度发现,我们点击1到6时,页码列表不变。 当我们点击7时,begin=7-5,end=7+4 页码列表:2 3 4 5 6 7 8 9 10 11 当我们点击8时,begin=8-5,end=8+4 页码列表:3 4 5 6 7 8 9 10 11 12 通过我们的测试得到开始位置和结束位置的计算方法 -如果总页数<=10,那么begin=1,end=总页数 -大于10时,begin=当前页数-5,end=当前页数+4 -当点击的当前页数<5时,因为begin=当前页数-5,会出错,所以begin<1时,让begin=1 -当当前页数>总页数时会出错,因为end=当前页数+5,所以end>总页数时,就让end=总页数 然后我们循环遍历begin到end,就可以得出页码列表。
解决超链接保存参数问题
当使用多条件查询后,我们第一次查出来的是正确结果,然后当我们点击第2 页时,这个第2页超链接没有条件了,所以会丢失条件,所以我们需要在页面上的所有链接都要保留条件! 我们要把条件以一个字符串的形式保存到PageBean的url中!这个任务交给Servlet!
好了,分页中所有该了解的问题都已经解决,我们现在来做一个练习项目
客户管理系统
功能需求
添加客户 查看所有客户 编辑客户 删除客户 多条件组合查询
第一步,先创建客户数据表
CREATE TABLE customer( cid CHAR(32) PRIMARY KEY, //id cname VARCHAR(40) NOT NULL, //名字 gender VARCHAR(6) NOT NULL, //性别 birthday DATE, //生日 cellphone VARCHAR(15) NOT NULL, //电话 email VARCHAR(40), //email邮箱 description VARCHAR(500) //描述 );
第二步:创建项目,导入jar包
需要导入数据库驱动,c3p0连接池,dbutils等jar包
第三步:创建包
我们使用MVC模式进行编写,所以我们需要分为三层。 domain:Customer :JavaBean,用来将客户数据封装成一个对象 dao:CustomerDao :dao层,对数据的操作 service:CustomerService:service层,业务逻辑的操作 servlet:CustomerServlet:web层
第四步:编写jsp页面
top.jsp: 包含 一个标题 链接1:添加客户,请求add.jsp; 链接2:查看客户,请求list.jsp; 链接3:高级搜索,请求query.jsp; add.jsp:一个添加客户的表单; list.jsp:一个<table>用来显示所有客户; query.jsp:一个高级搜索的表单; edit.jsp:一个修改客户的表单; msg.jsp:用来显示信息(添加客户成功)
top.jsp
一个标题 三个链接:添加用户,查询客户,高级搜索 <body style="text-align: center;"> <h1>客户关系管理系统</h1> <a href="<c:url value='/add.jsp'/>">添加客户</a> | <a href="<c:url value='/CustomerServlet?m=findAll'/>">查询客户</a> | <a href="<c:url value='/query.jsp'/>">高级搜索</a> </body>
add.jsp
包含一个添加用户的表单 <h3 align="center">添加客户</h3> <form action="<c:url value='/CustomerServlet'/>" method="post"> <input type="hidden" name="m" value="add" /> <table border="0" align="center" width="40%" style="margin-left: 100px;"> <tr> <td width="100px">客户名称</td> <td width="40%"> <input type="text" name="cname"/> </td> <td align="left"> <label id="cnameError" class="error"> </label> </td> </tr> <tr> <td>客户性别</td> <td> <input type="radio" name="gender" value="男" id="male"/> <label for="male">男</label> <input type="radio" name="gender" value="女" id="female"/> <label for="female">女</label> </td> <td> <label id="genderError" class="error"> </label> </td> </tr> <tr> <td>客户生日</td> <td> <input type="text" name="birthday" id="birthday" readonly="readonly"/> </td> <td> <label id="birthdayError" class="error"> </label> </td> </tr> <tr> <td>手机</td> <td> <input type="text" name="cellphone"/> </td> <td> <label id="cellphoneError" class="error"> </label> </td> </tr> <tr> <td>邮箱</td> <td> <input type="text" name="email"/> </td> <td> <label id="emailError" class="error"> </label> </td> </tr> <tr> <td>描述</td> <td> <textarea rows="5" cols="30" name="description"></textarea> </td> <td> <label id="descriptionError" class="error"> </label> </td> </tr> <tr> <td> </td> <td> <input type="button" value="添加客户" onclick="add()"/> <input type="reset" value="重置"/> </td> <td> </td> </tr> </table> </form> </body>
list.jsp
用来显示所有的客户。 <body> <h3 align="center">客户列表</h3> <table border="1" width="70%" align="center"> <tr> <th>客户姓名</th> <th>性别</th> <th>生日</th> <th>手机</th> <th>邮箱</th> <th>描述</th> <th>操作</th> </tr> <c:forEach items="${pb.beanList}" var="cstm"> //获取servlet中保存的分页Bean中的当前页数据 <tr> <td>${cstm.cname}</td> //显示名字等信息 <td>${cstm.gender}</td> <td>${cstm.birthday}</td> <td>${cstm.cellphone}</td> <td>${cstm.email}</td> <td>${cstm.description}</td> <td> <a href="<c:url value='/CustomerServlet?m=load&cid=${cstm.cid }'/>">编辑</a> <a href="<c:url value='/CustomerServlet?m=delete&cid=${cstm.cid }'/>">删除</a> </td> </tr> </c:forEach> </table> <!--分页--> <center> <!--显示当前第几页/共几页--> 第${pb.currentPage }页/共${pb.totalPages }页 <!--设置首页连接,获取PageBean中保存的url并传递页码为1--> <a href="${pb.url}¤tpage=1">首页</a> <!--判断当前页是否是第一页,如果是第一页,就没有上一页的链接--> <c:if test="${pb.currentPage>1 }"> <a href="${pb.url}¤tpage=${pb.currentPage-1 }">上一页</a> </c:if> <c:choose> <!--判断总页数是否小于10,如果小于10,begin=1,end=总页数--> <c:when test="${pb.totalPages<=10 }"> <c:set var="begin" value="1"></c:set> <c:set var="end" value="${pb.totalPages }"></c:set> </c:when> <!--如果不小于10,则使用我们总结的分页计算公式来计算begin和end--> <c:otherwise> <c:set var="begin" value="${pb.currentPage-5}"></c:set> <c:set var="end" value="${pb.currentPage+4 }"></c:set> <!--如果begin(当前页数-5)<1,则将begin设置为1,end设置为10,要不然会出错--> <c:if test="${begin<1}"> <c:set var="begin" value="1"></c:set> <c:set var="end" value="10"></c:set> </c:if> <!--如果end(当前页数+4)>总页数,则将end设置为总页数,begin设置为end-9--> <c:if test="${end>pb.totalPages}"> <c:set var="end" value="${pb.totalPages }"></c:set> <c:set var="begin" value="${pb.totalPages-9 }"></c:set> </c:if> </c:otherwise> </c:choose> <!--从begin到end进行遍历即可显示页码列表--> <c:forEach var="v" begin="${begin }" end="${end }"> <a href="${pb.url }¤tpage=${v }">${v}</a> </c:forEach> <c:if test="${pb.currentPage<pb.totalPages }"> <a href="${pb.url }¤tpage=${pb.currentPage+1 }">下一页</a> </c:if> <a href="${pb.url }¤tpage=${pb.totalPages}">尾页</a> </center> </body>
query.jsp
用来进行条件搜索的表单。 <body> <h3 align="center">高级搜索</h3> <form action="<c:url value='/CustomerServlet'/>" method="get"> <input type="hidden" name="m" value="query"> <table border="0" align="center" width="40%" style="margin-left: 100px;"> <tr> <td width="100px">客户名称</td> <td width="40%"> <input type="text" name="cname"/> </td> </tr> <tr> <td>客户性别</td> <td> <select name="gender"> <option value="">==请选择性别==</option> <option value="男">男</option> <option value="女">女</option> </select> </td> </tr> <tr> <td>手机</td> <td> <input type="text" name="cellphone"/> </td> <td> <label id="cellphoneError" class="error"> </label> </td> </tr> <tr> <td>邮箱</td> <td> <input type="text" name="email"/> </td> <td> <label id="emailError" class="error"> </label> </td> </tr> <tr> <td> </td> <td> <input type="submit" value="搜索"/> <input type="reset" value="重置"/> </td> <td> </td> </tr> </table> </form> </body>
edit.jsp
用来修改客户的表单。 修改客户要先获取客户以前的值,然后再修改提交。 <body> <h3 align="center">编辑客户</h3> <form action="<c:url value='/CustomerServlet'/>" method="post"> <input type="hidden" name="m" value="edit"> <input type="hidden" name="cid" value="${cst.cid }"> <table border="0" align="center" width="40%" style="margin-left: 100px;"> <tr> <td width="100px">客户名称</td> <td width="40%"> <input type="text" name="cname" value="${cst.cname }"/> </td> <td align="left"> <label id="cnameError" class="error"> </label> </td> </tr> <tr> <td>客户性别</td> <td> <input type="radio" name="gender" value="男" id="male" <c:if test="${cst.gender eq '男' }">checked="checked"</c:if> /> <label for="male">男</label> <input type="radio" name="gender" value="女" id="female" <c:if test="${cst.gender eq '女' }">checked="checked"</c:if> /> <label for="female">女</label> </td> <td> <label id="genderError" class="error"> </label> </td> </tr> <tr> <td>客户生日</td> <td> <input type="text" name="birthday" id="birthday" readonly="readonly" value="${cst.birthday }"/> </td> <td> <label id="birthdayError" class="error"> </label> </td> </tr> <tr> <td>手机</td> <td> <input type="text" name="cellphone" value="${cst.cellphone }"/> </td> <td> <label id="cellphoneError" class="error"> </label> </td> </tr> <tr> <td>邮箱</td> <td> <input type="text" name="email" value="${cst.email }"/> </td> <td> <label id="emailError" class="error"> </label> </td> </tr> <tr> <td>描述</td> <td> <textarea rows="5" cols="30" name="description">${cst.description }</textarea> </td> <td> <label id="descriptionError" class="error"> </label> </td> </tr> <tr> <td> </td> <td> <input type="button" value="编辑客户" onclick="add()"/> <input type="reset" value="重置"/> </td> <td> </td> </tr> </table> </form> </body>
msg.jsp
用来显示成功信息的页面。 <body> <h1 style="color:green;" align="center">恭喜,${msg }</h1> </body>
第五步:在domain层创建PageBean和 Customer两个javaBean,用来封装数据
Customer.java 封装用户数据 public class Customer { private String cid; //id private String cname; //名字 private String gender; //性别 private String birthday; //生日 private String cellphone; //电话 private String email; //邮箱 private String description; //描述 public String getCellphone() { return cellphone; } public void setCellphone(String cellphone) { this.cellphone = cellphone; } public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return "Customer [cid=" + cid + ", cname=" + cname + ", gender=" + gender + ", birthday=" + birthday + ", cellphone=" + cellphone + ", email=" + email + ", description=" + description + "]"; } }
第六步:编写Servlet
我们的Servlet继承我们曾经写过的工具类,可以通过传递的参数来调用不同的方法。 public class CustomerServlet extends BaseServlet { private CustomerService cs=new CustomerService(); //创建service层对象 //添加用户方法 public String add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //先获取表单提交的数据并将其封装成Customer对象 String name=request.getParameter("cname"); String gender=request.getParameter("gender"); String birthday=request.getParameter("birthday"); String phone=request.getParameter("cellphone"); String email=request.getParameter("email"); String description=request.getParameter("description"); Customer c=new Customer(); c.setCid(UUID.randomUUID().toString().replaceAll("-", "")); c.setCname(name); c.setBirthday(birthday); c.setGender(gender); c.setEmail(email); c.setCellphone(phone); c.setDescription(description); //调用service层处理添加功能的业务逻辑 cs.add(c); //如果添加成功,则将成功信息保存在request域,转发到显示信息的msg页面 request.setAttribute("msg", "恭喜,添加成功"); return "forward:/msg.jsp"; } //查询所有数据的方法 public String findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //先获取传递的当前页码,设置每页最多显示多少数据 int currentpage=getCurrentpage(request); int pagedata=10; //调用service层的findAll方法,返回一个PageBean对象 PageBean<Customer> pb=cs.findAll(currentpage,pagedata); //获取当前页面的URL,并设置,因为查询的条件我们要保存起来 pb.setUrl(getUrl(request)); //将pagebean对象放入request域中,转发到list页面 request.setAttribute("pb", pb); return "forward:/list.jsp"; } //获取页面url的方法 public String getUrl(HttpServletRequest request) { String contextpath=request.getContextPath();//获取项目名 String servletpath=request.getServletPath();//获取servlet路径 String querystring=request.getQueryString();//获取参数 //我们决定当前页码的参数由我们自己设置,所以如果我们点击的链接发送了该参数,我们需要将其去掉 if(querystring.contains("¤tpage=")) { int index=querystring.indexOf("¤tpage="); querystring=querystring.substring(0, index); } return contextpath+servletpath+"?"+querystring; } //获取提交的当前的页码,如果当前页码为null,则默认为第一页 public int getCurrentpage(HttpServletRequest request) { String currentpage=request.getParameter("currentpage"); if(currentpage==null) return 1; return Integer.parseInt(currentpage); } //通过cid查询的方法 public String load(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Customer c=cs.load(request.getParameter("cid")); request.setAttribute("cst", c); return "forward:/edit.jsp"; } //编辑的方法 public String edit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //先获取表单提交的数据,封装在Customer对象中 String cid=request.getParameter("cid"); String name=request.getParameter("cname"); String gender=request.getParameter("gender"); String birthday=request.getParameter("birthday"); String phone=request.getParameter("cellphone"); String email=request.getParameter("email"); String description=request.getParameter("description"); Customer c=new Customer(); c.setCid(cid); c.setCname(name); c.setBirthday(birthday); c.setGender(gender); c.setEmail(email); c.setCellphone(phone); c.setDescription(description); //调用service层的编辑方法 cs.edit(c); //将成功信息保存在request域中,并转发到msg页面 request.setAttribute("msg", "恭喜,修改成功"); return "forward:/msg.jsp"; } //删除功能 public String delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取cid,调用service层删除方法 cs.delete(request.getParameter("cid")); //将成功信息保存在request域,并转发 request.setAttribute("msg", "删除成功"); return "forward:/msg.jsp"; } //条件查询功能 public String query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //先获取表单提交的条件,全部封装在Customer对象中 String name=request.getParameter("cname"); String gender=request.getParameter("gender"); String phone=request.getParameter("cellphone"); String email=request.getParameter("email"); Customer c=new Customer(); c.setCname(name); c.setGender(gender); c.setEmail(email); c.setCellphone(phone); //获取页面的url,也就同时获取了查询条件 String url=getUrl(request); //获取当前页码,设置每页最大显示数 int currentpage=getCurrentpage(request); int pagedata=10; //调用service层的条件查询方法,获取PageBean对象 PageBean<Customer> pb=cs.query(c,currentpage,pagedata); //将url封装在pagebean对象中,并将pagebean对象保存在request域,转发到list页面 pb.setUrl(url); request.setAttribute("pb", pb); return "forward:/list.jsp"; } }
第七步:编写service层方法
public class CustomerService { //创建DAO层对象 private CustomerDao cd=new CustomerDao(); //添加用户方法,需要Customer对象参数,调用dao层完成数据操作 public void add(Customer c) { cd.add(c); } //查询所有方法,需要当前页码,每页最大显示数 public PageBean<Customer> findAll(int currentpage,int pagedata) { return cd.findAll(currentpage,pagedata); } //通过cid进行查询的方法 public Customer load(String cid) { return cd.finByCid(cid); } //编辑方法,需要Customer对象 public void edit(Customer c) { cd.edit(c); } //删除方法,需要cid public void delete(String cid) { cd.delete(cid); } //条件查询方法,需要Customer对象(里面封装了条件),当前页码,页面最大显示数 public PageBean<Customer> query(Customer c,int currentpage,int pagedata) { return cd.query(c,currentpage,pagedata); } }
第八步,编写dao层方法对数据进行处理
public class CustomerDao { //获取QueryRunner对象,是dbutils包提供,用来简化对数据库的操作 private QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource()); //添加用户方法 public void add(Customer c) { try { //设置sql模板和参数 String sql="insert into customer values(?,?,?,?,?,?,?)"; Object[] params= {c.getCid(),c.getCname(),c.getGender(),c.getBirthday(),c.getCellphone(),c.getEmail(),c.getDescription()}; //执行添加操作 qr.update(sql, params); } catch (SQLException e) { throw new RuntimeException(e); } } //查询所有的方法 public PageBean<Customer> findAll(int currentpage,int pagedata) { /* * 1.创建pageBean对象,设置currentpage和pagedata * 2.获取全部数据的数量totalData和当前页的数据 * 3.设置到pagebean对象中,返回 */ try { PageBean<Customer> pb=new PageBean<Customer>(); pb.setCurrentPage(currentpage); pb.setPageData(pagedata); //获取全部数据的数量 String sql="select count(*) from customer"; Number num=(Number) qr.query( sql, new ScalarHandler()); int totaldata=num.intValue(); pb.setTotalData(totaldata); //获取当前页面的数据 sql="select * from customer limit ?,?"; List<Customer> beanlist=qr.query(sql, new BeanListHandler<Customer>(Customer.class), (currentpage-1)*pagedata,pagedata); pb.setBeanList(beanlist); //返回PageBean对象 return pb; } catch (SQLException e) { throw new RuntimeException(e); } } //用cid查找用户的方法 public Customer finByCid(String cid) { try { String sql="select * from customer where cid=?"; return qr.query( sql, new BeanHandler<Customer>(Customer.class),cid); } catch (SQLException e) { throw new RuntimeException(e); } } //编辑用户的方法 public void edit(Customer c) { try { //设置sql模板和参数 String sql="update customer set cname=?,gender=?,birthday=?,cellphone=?,email=?,description=? where cid=?"; Object[] params={c.getCname(),c.getGender(),c.getBirthday(),c.getCellphone(),c.getEmail(),c.getDescription(),c.getCid()}; qr.update( sql, params); } catch (SQLException e) { throw new RuntimeException(e); } } //删除用户的方法 public void delete(String cid) { try { String sql="delete from customer where cid=?"; qr.update( sql,cid); } catch (SQLException e) { throw new RuntimeException(e); } } //条件查询的方法 public PageBean<Customer> query(Customer c,int currentpage,int pagedata) { /* * 1.创建一个pagebean对象 * 2.设置传递过来的属性 * 3.获取全部数据的数量和当前页面的数据、 * 4.返回pagebean对象 */ try { PageBean <Customer> pb=new PageBean<Customer>(); pb.setCurrentPage(currentpage); pb.setPageData(pagedata); //获取全部数据的数量,因为我们呢的条件到后面查询数据时还要用到,所以我们将其分开 StringBuilder sql=new StringBuilder("select count(*) from customer"); StringBuilder wheresql=new StringBuilder(" where 1=1"); List<Object> params=new ArrayList<Object>(); //判断条件是否为null,不为空就将其加入到where的后面 if(c.getCname()!=null&&!c.getCname().trim().isEmpty()) { wheresql.append(" and cname like ?"); params.add("%"+c.getCname()+"%"); } if(c.getGender()!=null&&!c.getGender().trim().isEmpty()) { wheresql.append(" and gender=?"); params.add(c.getGender()); } if(c.getCellphone()!=null&&!c.getCellphone().trim().isEmpty()) { wheresql.append(" and cellphone like ?"); params.add("%"+c.getCellphone()+"%"); } if(c.getEmail()!=null&&!c.getEmail().trim().isEmpty()) { wheresql.append(" and email like ?"); params.add("%"+c.getEmail()+"%"); } Number num= (Number)qr.query( sql.append(wheresql).toString(), new ScalarHandler(),params.toArray()); int totaldata=num.intValue(); pb.setTotalData(totaldata); //获取当前页面数据 StringBuilder selectsql=new StringBuilder("select * from customer"); StringBuilder limitsql=new StringBuilder(" limit ?,?"); //因为我们查询当前页面数据需要当前数据开始的位置,和查询几条数据两个参数,所以我们还需要设置两个参数 //设置当前数据开始的位置,(当前页码-1)*每页显示的数据,例如当前是第2页,就是从10开始 params.add((currentpage-1)*pagedata); params.add(pagedata); //获取当前页的数据 List<Customer> beanlist=qr.query(selectsql.append(wheresql).append(limitsql).toString(), new BeanListHandler<Customer>(Customer.class), params.toArray()); System.out.println(beanlist); //将其数据集合设置到PageBean中,返回 pb.setBeanList(beanlist); return pb; } catch (SQLException e) { throw new RuntimeException(e); } } }
相关文章推荐
- (&lt;虚拟项目&gt;广告管理投放系统-1)技术体系结构
- JAVA_WEB项目(结合Servlet+jsp+ckEditor编辑器+jquery easyui技术)实现新闻发布管理系统第四篇:前台首页,新闻分类(体育新闻,科技新闻等),新闻列表分页的实现
- 客户接触管理系统项目总结
- 航空客户管理系统-项目评审
- 基于ASP.NET WPF技术及MVP模式实战太平人寿客户管理项目开发(Repository模式)课程分享
- SAP-HR技术系列之二:人力资源管理系统项目实施经验谈
- 房地产业务学习(06)-开发项目管理的难点分析&IT系统价值 推荐
- 系统集成项目管理之信息系统集成专业技术知识
- 基于ASP.NET WPF技术及MVP模式实战太平人寿客户管理项目开发(Repository模式)
- 项目视频讲解_基于SpringSecurity3.x, JasperReport5.x等技术实现仿金蝶权限管理的企业信息管理系统
- 系统集成资质-欢迎加入软考.项目管理技术圈
- 系统集成项目管理工程师教程———活动历时估算所采用的主要方法和技术
- 蜘蛛网CRM客户管理系统技术分析
- Remoting 技术应用的实际项目 妇幼保健信息管理系统
- <项目开发>简单的题库管理系统
- (&lt;虚拟项目&gt;广告管理投放系统-2)Sql Server 2008 R2主数据管理系统的安装和配置
- 房地产业务学习(06)-开发项目管理的难点分析&IT系统价值
- IBM UNIX & LINUX -AIX 5L 系统管理技术 学习笔记1 -网络文件系统 NFS network file system
- JAVA_WEB项目(结合Servlet+jsp+ckEditor编辑器+jquery easyui技术)实现新闻发布管理系统第三篇:新闻发布,新闻修改,新闻删除功能的实现
- 项目总结(1)-客户管理系统