李思贤:今天学习了对商品的增删改查操作和分页:
在写代码前需要创建好数据库和导包(7个包),分别是 :
msysql驱动包,c3p0的包,dbutils的包,beanUtils的包:两个.,JSTL的包:两个
1查询所有功能
创建一个首页,超链接到查询所有商品的Servlet中.....,查询所有数据放在一个list集合中存入request域中,转发在页面列表页面显示(JSTL遍历)
2添加功能
在Productile_list.jsp中在表上加一行:放入查询(submit)添加按钮(跳转到addProduct.jsp),
Button没有跳转功能,要定义一个点击事件,跳入addProduct.jsp中 在建一个表格()填写提交的商品信息)在提交到ProductAddServlet中,
用map接收表单中的数据,还有两个表单中没有的数据要封装进去,
product.setPid(UUIDUtils.getUUID()); //这里注意是Pid!!!!
product.setPdate(new Date());
然后插入数据库,转发到ProductFindAllServlet中,不要直接转发到Product_list中,那样list读不到信息,没有商品信息.
添加完我们就要解决重复提交的问题了,运用令牌机制:
解决重复提交的根本解决办法:令牌机制(一次性).
1在addProduct.jsp中生成随机的令牌保存在session中.
2也这个令牌放入到表单的隐藏字段中.
3在Servlet中获得session中和表单中的令牌是否一致.
4如果一致执行插入操作,不一致跳转到其他页面.将令牌销毁.
代码实现:
// 判断是否是重复提交:
String token1 = (String)request.getSession().getAttribute("token");
String token2 = request.getParameter("token");
// 清空session中的令牌:
request.getSession().removeAttribute("token");
if(!token2.equals(token1)){
request.setAttribute("msg", "亲!您已经提交过!请不要重复提交了!");
request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
return;
}
3修改商品功能
首先我们在Product_list.jsp中某商品后面的点击修改按键,需要先跳转到一个ProductEditServlet中,要获得该商品所有属性回显到一个editProduct.jsp页面中(和添加页面类似),在这个页面中修改商品信息后再点击提交按钮提交给updateServlet中
在Product_list.jsp想要让Servlet中接收到该商品信息,需要传个id过去
<a href="${ pageContext.request.contextPath }/ProductEditServlet?pid=${ p.pid }">修改</a>
下一步就可以在Servlet中接收参数,...找到该数据传到editProduct.jsp页面(拿addProduct改),
在这个jsp中把刚才拿到的product中的数据用EL表达式写在页面中,最后提交前要注意加一个隐藏标签,放入pid,不然跳转到UpdateServlet中接收不到pid信息啊.
在UpdateServlet中 以map形式接收传来的参数,和添加类似...修改成功转发到ProductFindAllServlet,就完成了.
4删除功能
同样在列表页面点击删除,跳转到Servlet中,调用业务层就行,想要点击出现弹框就要定义一个onclick事件,同时要传pid,因为pid只在循环内部,所以在onclick事件中就要传过去,
<a href="#" onclick="del(${ p.pid })">删除</a>
function del(pid) {
var flag = window.confirm("你确定删除这条记录吗?");
if(flag==true){
window.location.href="${ pageContext.request.contextPath }/jsp/ProdectDeleteServlet?pid="+pid;
}
}
多条商品一起删除,先在表格上加上CheckBox,这里复习了用JQ的JS完成全选.引入JS文件,(
<script type="text/javascript" src="${ pageContext.request.contextPath }/js/jquery-1.8.3.js"></script>)只要页面一加载,就让上面的复选框绑定一个事件,用JQ一行搞定:
$(function(){
$("#selectAll").click(function(){
$("input[name='ids']").prop("checked",this.checked);
});
});
提交之前在CheckBox中 value=${ p.pid }
这里涉及到表单提交,加个form 提交到ProductDeleteAllServlet
接收传来的ids数组,直接调用业务层,
在业务层中开启事物,
Connection conn = JDBCUtils.getConnection();
try {
conn.setAutoCommit(false);
ProductDao productDao = new ProductDao();
for (String id : ids) {
productDao.delete(conn, id);
}
DbUtils.commitAndClose(conn);
} catch (Exception e) {
try {
DbUtils.rollbackAndClose(conn);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO Auto-generated catch block
e.printStackTrace();
}
这里重写了delete方法,.....就可以实现多条商品信息的删除.
分页见下次吧... |