王刘锁
2018-6-12,补6-11日:
代码量太大,到晚上12点才勉强敲完代码,实在没精力写总结,拿到今天来补,昨天学习的是CRUD对数据库表中数据的增删改查操作,虽然是以前做过的,但是如今写起来还是吃力,那就来记录一下写代码遇到的问题和需要注意的地方:直接进入主题好了,先来添加商品的:点击添加按钮跳转到添加商品页面,输入商品信息后点击提交,把数据提交到servlet中,然后就是对数据库的查询
操作(很简单也写过很多次了.),需要注意的是给单选按钮或下来列表设置value=0/1好来接收数据,最重要的是注意重复提交问题,这里学习了新的东西来解决转发的地址栏不改变引起的刷新页面重复提交和其它一些重复提交问题--令牌机制!,就是Java有一个UUID的工具类来生成随机的字符串,那我们也需要在添加商品的时候给商品随机生成一个id,还要设置date-new date(),在查询的时候可以根据日期来排序,令牌机制就是在添加页面jsp中先生成一个随机字符串UUID.randomUUID().toString(),然后存在session域中-因为这个id是私有的,再在jsp中存一份隐藏的<input type="hidden" name="token" value="${token }">,然后就可以在添加商品的servlet中先获取session域中存的令牌和表单提交的令牌,取出后remove掉session中的令牌,下面先比较连个令牌是否一样,不一样说明页面没有刷新但是重复点了提交按钮,这就是重复提交了,那我们就不要再执行下面的添加商品代码了,添加的就是这么一点要注意的,下面说删除的,删除一条就是在删除按钮点击后触发onclick事件,执行window.location.href=""页面跳转功能,提交该商品的pid到后台进行操作,要注意的是删除多条记录时的事务管理,首先也是传pid到后台,点击按钮触发onclick事件执行代码document.getElementById("form1").submit()提交表单,但是在servlet中获取的pid的数组,然后在service中先获取连接,然后开启事务,遍历数组得到每一个pid根据每一个id去dao层操作数据库,好像没什么要注意的了,然后说修改吧,修改和添加页面相似,不同的是修改页面需要把商品原本的信息显示出来,这就需要我们点击修改按钮先把该商品id提交到后台去查询出该商品的信息,保存到request域中再转发到修改页面,在页面jsp中获取域中商品,得到每一个商品属性显示在表单中,这里对于单选按钮和下拉列表的数据需要做一个<c:if>的判断,前面我们给按钮设置的value值对应的数据内容就可以用的到了,然后是修改后提交的update数据库操作,接下来就是查询了,这个没什么注意的,就是查询后得到结果集,在jsp中遍历结果集得到每一个商品,再得到商品属性显示在页面就可以了,我们要学习的有模糊查询和分页查询,模糊查询就是输入关键字,根据关键字去数据库中查询数据,查询到也是一个结果集,要注意到是模糊查询的关键字是like-pname like ? 然后执行的时候参数就是%输入的关键字%这样可以查询到所有名字中有关键字的记录,也不难哈,
最终的重点来了,分页查询,思想搞懂了代码就很简单了,首先准备工作,创建一个类来封装一些需要在页面显示的数据PageBean,属性有currPage-当前页数,totalCount-总记录数,totalPage-总页数,pageSize-每页记录数,还有一个list<product>集合来存每一页的商品,然后首页点击分页查询要从第一页显示所以就传一个currPage=1到后台,然后去数据库中查,分页查询的关键字根据数据库不同也不相同,我们用的MySQL是limit关键字,String sql = "select * from product order by pdate desc limit ?,?";这里第一个?是从哪一条记录开始,第二个?是查多少条,从那一条记录开始可以用当前页减一乘以每页显示的条数来获取,begin=(currPage-1)*pageSize;dao层我呢只需要在service调用的时候传过去计算后的begin和pageSize就可以了重要的是service层中我们要new一个pagebean来封装数据,总页数可以用总记录数除以每页条数来获取,如果有余数就加一页,totalPage=totalCount/pageSize/(+1);再把查到的一定数量(pageSize)的结果集也封装到pagebean中,在servlet中吧pagebean存到request域中转发到分页查询显示页面,遍历结果集显示商品属性,为了效果可以在最后加一行来显示首页,下一页上一页尾页等,那首页就是连接路径跳转到分页查询servlet中提交的参数是currPage=1,那么尾页就是currPage=totalpage,上一页下一页就是当前页加一或减一,currPage+/-1;效果更好的可以显示每一页的数字(1,2,3,..);只需要加一个循环<c:forEach var="i" begin="1" end="${pageBean.totalPage }">循环的次数就是总页数.也可以在循环中判断,如果查看的是当前页就不可以再点这个数字,因为每点一次就刷新了一次页面,那点一次就会循环一次,在循环中判断把当前页显示成纯数字没有连接就可以实现了..另外在记一下以前学的全选全不选的实现,在引入jquery后用jquery来实现更简洁
$(function() {
$("#checkAll").click(function() {
$("input[name='check']").prop("checked", this.checked);
});
});当全选按钮点击触发事件执行代码获取所有name=check的input标签并用prop方法把这些标签的checked属性赋值为这个全选按钮的checked属性值this.checked; |