通过这几天学习MVC形式开发web功能,有一个原则可以确定,就是必须先处理后台数据,然后获取处理完的后台数据,到前端显示
后台的数据结果。
今天案例出现频率很高的一个获取当前工程路径的代码:${pageContext.request.contextPath}指向了当前的工程路径
名称。比如:localhost:8080/day0610
这个形式的路径避免把绝对路径写死,便于后面的项目迁移。
比如,运用在前端的jQuery引入项目路径,可以写:
这样子做的话,当以后前端部分的代码要迁移时,在正确迁移的情况下不必修改路径
一.分页查询——物理分页思路: 1.首先点击首页的"分页查询"链接,访问到DividePageServlet,get方式上传当前首页currPage=0的参数。
2.创建一个PageBean 里面的成员属性有:
1)currPage:当前页面
2)pageSize:每页显示多少条记录
3)totalRecordNum:总记录数
4)totalPage:总页数
5)List
:商品数据集合
3.接下来DividePageServlet的工作就是填充PageBean里面的属性。
1)新建一个PageBean对象。
2)由于分页查询的sql语句是使用关键字limit:select * from product limit [begin],[size];
begin:表示从哪一条查起
size:应该查多少条
3)可以算出:
begin = (currPage-1)*10:第1页 从0条开始;第2页从 从10条开始;第3页,从20条开始...
size = PageSize 可以写死final 10条;
4)上面的两个参数算完以后,
(1)获取总记录数totalRecordNum:
调用int count = PageService.getCount();
PageService调用PageDao.getCount();
使用sql语句select count(*) from product;
要使用new ScalarBeanHandler结果集,返回单一查询结果
(2)获取List集合:
调用List list = PageService.findAll(begin,size);
PageService调用PageDao.findAll(begin,size);
PageDao创建List findAll(begin,size)方法
方法里使用查询所有的sql语句,使用new BeanListHandler结果集,返回一个List list;
5)获取总页数totalPage
Math.ceil(totalRecordNum/size);
注意整形转换成Double型,再转回int型
6)至此,已经获取PageBean对象的所有属性。存放到request对象中,然后转发到商品分页页面product_divide.jsp页面
7)前端jsp展示分页的数据效果:
前面步骤已经存储了pageBean在session。接下来在dividePage_list.jsp中获取pageBean就能做了
jsp前端代码:
分页条: 【首页】
[上一页]
[${status}]
[下一页]
【尾页】
${pageBean.currPage}/${pageBean.totalPageNum}页 共${pageBean.totalRecordNum}条记录
二、商品的添加改查功能:
1.添加商品: 1).新建一个处理添加商品的Servlet:AddProductServlet,新建一个商品添加页面addProduct.jsp。里面加一个商品添加商品种类的表单.
2).表单提交到AddProductServlet后,使用request.getParamterMap()得到一个含有所有参数的map集合
3).这里使用BeanUtils直接封装表单Product对象:BeanUtils.populate(product,map);
4).给封装后的Product对象设置一个32位随机字符串的pid属性,使用Java自带UUIDUtils.因为初始生成含有'-'号,使用replace()方法将"-"替代为"";
5).将对象传入Service->dao:使用update进行更新操作。由于对象有10个属性。可以建立一个参数数组Object[] params存储对象的成员值
6).关于重复提交的本质原因是没有对当前页面进行刷新。这里使用令牌(token)的形式对没有刷新页面的提交进行处理。原理和验证码一次性使用一样
在客户端jsp代码中获得一个UUID形式的token。分别存放在客户端的request请求域对象中,和服务端的session中。当有刷新提交访问到服务端,从服务端获取到这个
token。然后移除该session。只要有访问服务端,request域对象的token和session的token是一样的。当第二次再重复提交。第一次的Session中的token被
移除了。拿到的是null的session。
2.模糊查询查找商品:
查寻含有关键字的商品名称,在sql操作中,使用like "%a%"模糊查询来查
1)post方式提交pname到处理模糊查询的FindLikeServlet中。先进行中文编码的处理
2)新建一个ProductBean对象。
3)调用ProductService中的List list=findLike(pname)功能,Dao也创建该方法
4)在Dao的findLike(pname)中,sql语句是"select * from product order by pdate where pname like ?",
后面的参数是"%"+pname+"%"。返回的结果是BeanList;
5)把DAO返回的List list传递到Servlet中,赋值给productBean.list;
6)productBean存放到session.覆盖原来的seesion
7)
---------mark一下 明天再补全-----------------
3.删除商品
删除商品分为
1)选择多项商品删除
2)单击单项商品删除链接
删除商品中要使用事务机制,这里采用的是DBUtils中的事务封装的方法
4.修改商品:
修改商品。因为request请求发送的是字符串链接。不能上传一个bean对象。所以我们只能把商品id上传到后台,让后台查找到
数据库的商品。然后利用后台的
----------------完善------------------ 1.添加/删除/修改/删除所选等操作,添加一个msg信号。在js接收msg。这样子当操作成功的时候,能够弹出一个alert警告框提示操作成功 因为是一次性信号,所以使用reuqest域对象存储信号: 添加成功:"msg","msgAddSuccess" 修改成功:"msg","msgUpdateSuccess" 删除成功:"msg","msgDeleteSuccess" 查询失败:"msg","msgLikeFindError"
【案例:商品的增删改查与分页】代码
一、JSP页面:
1.显示所有商品:
product_list.jsp
这段代码在CSDN提供的编辑器中,生成了 这个东东,请忽略掉。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
href="/day0610/demo/css/bootstrap.min.css" />
商品详情列表
商品名称: type="submit" value="查询"> type="button" value="添加" οnclick="addPage()" />
序号
商品名字
市场价格
商品价格
是否热门
是否下架
操作
${status.count}
${i.pname}
${i.market_price}
${i.shop_price}
是
否
未下架
已下架
修改 |删除