综合练习
总体分析:
1. 简单功能
1. 列表查询
列表查询,无非是,把查询到的数据全部给显现出来,通过对数据库里面的信息的拉取,以及传值到前端,然后最后在页面显示出来
重点就是$符的使用,如何进行传值,还有访问路径的问题,都是需要注意的方面。
2. 登录
登录功能呢,则是对输入数据的校验,判断是否存在问题,最重要的一点则是验证码方面
下面附上登录界面图:
对于这三个信息的校验呢,我是先考虑的去校验验证码的正确性,验证码通过,再对输入的用户名和密码进行判断,这样感觉逻辑上简便一点。
其中还加入了Filter进行限制,不论要进行什么操作,都必须先登录,这里我们就不放代码了。
3. 添加
添加用户信息,则是往数据库新建一条数据,这里我们放上逻辑图
增加用户信息,相对于比较简单,我们就不放代码了,大家可以自行尝试。
4. 删除
从上面的逻辑图来看,我们在后台只需要拿到一个名为ID的字段,即可对其信息进行操作,对于删除功能的编写,也不做过多的介绍,我们把重点放在复杂功能里面的选中删除。
5. 修改
从上面的逻辑图可以看到,存在一个隐藏域ID, 后台则是通过拿到的隐藏域里面的ID,去实现用户信息的修改,该字段一般被加上了hidden修饰。
该功能的后台代码也比较简单,所以就不作过多的解释,但是 上面所说的重点就是 隐藏域真的很重要很重要,必须加以记忆。
2. 复杂功能
1. 分页查询
- 好处:
1. 减轻服务器内存的开销
2. 提升用户体验
其逻辑图如下:
分页查询,是一个重点,首先你得创建一个实体类PageBean,最重要的是里面的变量,如下:
private int totalCount; //总记录数
private int totalPage; //总页码
private List list; //每页
private int currentPage; //当前页码
private int rows; //每页记录数据
然后用Generate生成 set get方法。
前端代码里面最重要的一部分就是:
<div>
<nav aria-label="Page navigation">
<ul class="pagination">
<c:if test="${pb.currentPage==1}">
<li class="disabled">
</c:if>
<c:if test="${pb.currentPage!=1}">
<li>
</c:if>
<a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage-1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<c:forEach begin="1" end="${pb.totalPage}" var="i">
<c:if test="${pb.currentPage==i}">
<li class="active"><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li>
</c:if>
<c:if test="${pb.currentPage!=i}">
<li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li>
</c:if>
</c:forEach>
<c:if test="${pb.currentPage==pb.totalPage}">
<li class="disabled">
</c:if>
<c:if test="${pb.currentPage!=pb.totalPage}">
<li>
</c:if>
<a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage==pb.totalPage ? pb.totalPage : pb.currentPage+1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
<span style="font-size: 25px;margin: 5px">
共${pb.totalCount}条记录,共${pb.totalPage}页
</span>
</ul>
</nav>
</div>
UserServiceImpl代码 :
@Override
public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
int currentPage=Integer.parseInt(_currentPage);
int rows=Integer.parseInt(_rows);
if (currentPage<=0){
currentPage=1;
}
//1.创建一个空的PageBean对象
PageBean<User> pb=new PageBean<User>();
//2.设置参数
pb.setCurrentPage(currentPage);
pb.setRows(rows);
//3.调用dao查询总记录数
int totalCount=dao.findTotalCount(condition);
pb.setTotalCount(totalCount);
//4.调用dao查询list集合
// 计算开始的记录索引
int start =(currentPage-1)*rows;
List<User> list=dao.findByPage(start,rows,condition);
pb.setList(list);
//5.计算总页码
int totalPage=(totalCount % rows ==0) ? totalCount/rows: (totalCount/rows)+1;
pb.setTotalPage(totalPage);
return pb;
}
FindUserByPageServlet:
request.setCharacterEncoding("utf-8");
//1.获取参数
String currentPage=request.getParameter("currentPage");//当前页码
String rows=request.getParameter("rows");//每页显示条数
if (currentPage==null || "".equals(currentPage)){
currentPage="1";
}
if (rows==null || "".equals(rows)){
rows="5";
}
//获取条件查询参数
Map<String,String[]> condition=request.getParameterMap();
//调用service查询
UserService service=new UserServiceImpl();
PageBean<User> pb=service.findUserByPage(currentPage,rows,condition);
//System.out.println(pb);
//3.将PageBean存入request
request.setAttribute("pb",pb);
//将查询条件存入request域中
request.setAttribute("condition",condition);
//转发到list.jsp
request.getRequestDispatcher("/list.jsp").forward(request,response);
里面的内容就不作过多的描述
实现分页查询,其实换标不换本,只要你掌握了一个分页,就把他当做一个基础一个模板,放到以后的应用中,直接拿来用就可以了。
3. 复杂条件查询
这个就更是重点了,有一个点是最重要的,去拼接sql语句
UserDaoImpl
成功的将我们输入的内容给拼接上了,这里面的一个重点就是:
最初我们需要初始化一个查询语句,然后在对其进行后续的拼接,拼接的关键点则是
该空格的地方就得空格,以及该加%的地方必须加上,不然则会出现sql语句的错误。
sql=sb.toString();
return template.queryForObject(sql, Integer.class,params.toArray());
最后就是上面这串代码,因为我们需要的是拼接后的sql语句,所以最好是重新给sql赋值一下,因为我就犯了这个错误,该写sb.toString()的地方我写成了sql,导致我的模糊查询一直失败,最初以为是拼接的问题,实际上则是我写错了sql哈哈。
感谢大佬们的观看,谢谢,我会在今后的学习里面越发努力地,冲冲冲!!!
文章评论