分页:limit ?,?
参数1 : startIndex 开始索引.
参数2 : pageSize 每页显示的个数
n 表示第几页 给定一个特殊的单词 pageNumber
select * from product; 第一页显示五条数据:
select * from product LIMIT 0 , 5;
第二页显示五条数据
select * from product LIMIT 5 , 5;
第三页显示五条数据
select * from product LIMIT 10 , 5; 第N页显示五条数据
select * from product LIMIT (pageNumber-1)*pageSize , pageSize; 如果只有一个参数 表示 第一页 显示几个数据
select * from product LIMIT 5; 简单分页查询步骤:
1.sql : select from table limit ?,?
2.startIntdex : 开始索引 不可以是负数
3.pageSize : 每页显示的个数
4.pageNumber : 用户访问的当前页
5.由页面发起传入 pageNumber 和 pageSize(目前写死) 在service层中进行计算startIndex
6.公式 (pageNumber-1)*pageSize 高级分页查询:
将service返回的六个参数,封装成一个PageBean
两个传的
pageNumber,pageSize.
两个查的
totalRecord,data
两个算的
startIndex,totalPage 在service编写代码逻辑 --> 将所有的代码逻辑封装到PageBean中 /* <!--分页 class="disabled" class="active"-->
<div style="width:1100px;margin:0 auto;margin-top:50px;"> <ul class="pagination" style="text-align:center; margin-top:10px;"> <%-- 如果当前页 等于 1 不需要再显示上一页 如果当前不等于1 显示 --%>
<c:if test="${pageBean.pageNumber != 1}">
<li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=1" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
<li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber - 1 }" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
</c:if> <%-- 循环显示 所有的页数 --%>
<c:forEach begin="${pageBean.start}" end="${pageBean.end}" var="num" step="1">
<li ${pageBean.pageNumber == num ? " class='active'" : ""} ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${num}">${num}</a></li>
</c:forEach> <%-- 如果当前页小于总页数 显示下一页 --%>
<c:if test="${pageBean.pageNumber < pageBean.totalPage}">
<li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber + 1 }" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
<li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.totalPage}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>
</c:if> </ul> </div>
<!-- 分页结束======================= --> 以后专门用来处理分页的数据:
泛型的定义:
1:方法级别的定义,修饰和返回值之间<T>
2:类级别泛型定义,类名后<T>
public class PageBean<T> {
/*
一共六个参数:
2个传入:
pageNumber : 表示当前页
pageSize : 表示每页显示个数
2个查询
data : 分页的数据
totalRecord : 总记录数
2个计算
startIndex : 开始索引
totalPage : 总页数
private int pageNumber;
private int pageSize;
private int totalRecodr;
private int startIndex;
private int totalPage;
private List<T> data; public int getStartIndex() {
startIndex = (pageNumber - 1)*pageSize;
} public int getTotalPage() {
if(totalRecord % pageSize == 0) {
totalPage = totalRecord / pageSize;
}else {
totalPage = totalRecord / pageSize + 1;
}
return totalPage;
} public int getPageNumber() {
return pageNumber;
} public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
}
开发中真实案例--前五后四动态条 - 扩展 - 前四后五
开发中应用:
//循环的开始
private int start;
//循环结束
private int end; //计算 开始 和 结束的数据
private void jisuan() {
//总页数有没有可能小于10
//小于 10 不需要前四后五的动态条
if(getTotalPage() < 10) {//必须调用getTotalPage() 因为totalPage需要提前计算
start = 1;
end = totalPage;//最后一页等于最大页数 }else {
//总页数一定大于10 需要前四后五动态条
start = pageNumber - 4;
end = pageNumber + 5;
//如果start < 1 表示 当前1 2 3 4 总共显示10页
if(start < 1) {
start = 1;
end = 10;
} //如果end > totalPage 需要 计算start值
if(end > totalPage) {
end = totalPage;
start = totalPage - 9;
} } } 案例:代码体现 public class ProductServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try {
//获得页面传递的参数 用来执行某段代码
String method = request.getParameter("method"); ProductService pService = new ProductService();
CategoryService cService = new CategoryService();
//根据页面功能执行某段特殊的代码
if("findAll".equals(method)){
/**
* 1.类型问题 两种解决方式: 1.正则 2.try
* 2.索引不可以是负数
*/
//1.获得
// 获得分页的数据 pageNumber
String pageNumberStr = request.getParameter("pageNumber");
int pageNumber = 1;
try {
//如果是a 强转失败 赋值操作没有成功 pageNumber = 1
pageNumber = Integer.valueOf(pageNumberStr);
if(pageNumber < 1 ){
pageNumber = 1;
} } catch (Exception e) {
}
int pageSize = 2;
//2.处理
//List<Product> pList = pService.findByPage(pageNumber , pageSize);
PageBean<Product> pageBean = pService.findByPage(pageNumber , pageSize);
//3.响应
//3.1 将数据存到request
request.setAttribute("pageBean", pageBean);
//3.2 请求转发给jsp
request.getRequestDispatcher("/admin/product/product_list.jsp").forward(request, response);
return;
} //添加商品前查询分类的数据
if("addProductUI".equals(method)){
//1.获得
//2.处理
//2.1 调用service 查询出所有分类 返回值 List<Category> List<Category> cList = cService.findAll();
//3.响应
//3.1 将数据存到request
request.setAttribute("cList", cList);
//3.2 请求转发给product_add.jsp
request.getRequestDispatcher("/admin/product/product_add.jsp").forward(request, response); return;
} //添加商品数据
if("addProduct".equals(method)){ //1.获得
//1.1 获得map
Map<String, String[]> map = request.getParameterMap();
//1.2 创建Product
Product product = new Product();
//1.3 封装数据
BeanUtils.populate(product, map);
//1.4 手动封装数据
product.setPid( UUID.randomUUID().toString().replace("-", "") );//主键会随机生成
product.setPimage("products/1/c_0001.jpg");
product.setPdate(new Date().toLocaleString());
product.setIs_hot(0);//0表示非热门
product.setPflag(0);//0表示未下架
//2.处理
//调用service保存
pService.save(product);
//3.响应
//重定向到查询所有的案例
response.sendRedirect(request.getContextPath() +"/ProductServlet?method=findAll");
return; } //根据pid查询出商品的信息
if("findByPid".equals(method)){
//1.获得
//获得pid的编号
String pid = request.getParameter("pid");
//2 处理
//2.1 商品数据
Product product = pService.findByPid(pid);
//2.2 分类的数据
List<Category> cList = cService.findAll();
//3 响应
request.setAttribute("product", product);
request.setAttribute("cList", cList);
request.getRequestDispatcher("/admin/product/product_edit.jsp").forward(request, response);
return;
} //修改商品数据的代码
if("editProduct".equals(method)){
//1.获得
//1.1 获得map集合
Map<String, String[]> map = request.getParameterMap();
//1.2 创建product对象
Product product = new Product();
//1.3 封装
BeanUtils.populate(product, map);
//2.处理
//2.1 调用service修改
boolean flag = pService.update(product);
//3.响应
//3.1 重定向到查询所有的案例
if(flag){
//成功
response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
}
return ;
} //根据pid删除商品
if("deleteByPid".equals(method)){
//1.获得
//获得pid
String pid = request.getParameter("pid");
//2.处理
int count = pService.deleteByPid(pid);
//3.响应
if(count > 0){
response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
}
return;
} } catch (Exception e) {
e.printStackTrace();
} } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
} public static void main(String[] args) {
System.out.println(UUID.randomUUID().toString().replace("-", "")); } } public class ProductService { /*public PageBean<Product> findByPage(int pageNumber, int pageSize) throws SQLException {
//创建一个即将被返回的对象 PageBean<Product>
PageBean<Product> pageBean = new PageBean<Product>(); ProductDao dao = new ProductDao(); //将pageNumber 转换成startIndex
int startIndex = (pageNumber - 1) * pageSize; //查询当前页的2条数据
List<Product> data = dao.findByPage( startIndex, pageSize); //查询总记录数
int totalRecord = dao.findRecord(); //计算总页数
int totalPage = 0;
if(totalRecord % pageSize == 0 ){
totalPage = totalRecord / pageSize;
}else{
totalPage = totalRecord / pageSize + 1;
} //赋值
pageBean.setData(data);
pageBean.setPageNumber(pageNumber);
pageBean.setPageSize(pageSize);
pageBean.setStartIndex(startIndex);
pageBean.setTotalPage(totalPage);
pageBean.setTotalRecord(totalRecord);
return pageBean;
}*/
public PageBean<Product> findByPage(int pageNumber, int pageSize) throws SQLException {
//创建一个即将被返回的对象 PageBean<Product>
PageBean<Product> pageBean = new PageBean<Product>( pageNumber , pageSize); ProductDao dao = new ProductDao(); //查询当前页的2条数据
List<Product> data = dao.findByPage( pageBean.getStartIndex() , pageSize); //查询总记录数
int totalRecord = dao.findRecord(); //赋值
pageBean.setData(data);
pageBean.setTotalRecord(totalRecord);
return pageBean;
} public List<Product> findAll() throws SQLException {
ProductDao dao = new ProductDao();
return dao.findAll();
} public void save(Product product) throws SQLException {
ProductDao dao = new ProductDao();
dao.save(product);
} public Product findByPid(String pid) throws SQLException {
ProductDao dao = new ProductDao();
return dao.findByPid(pid);
} public boolean update(Product product) throws SQLException {
ProductDao dao = new ProductDao();
return dao.update(product);
} public int deleteByPid(String pid) throws SQLException {
ProductDao dao = new ProductDao();
return dao.deleteByPid(pid);
} } package com.baidu.domain; public class Product { /*
`pid` VARCHAR(32) NOT NULL,
`pname` VARCHAR(50) DEFAULT NULL, #商品名称
`market_price` DOUBLE DEFAULT NULL, #商场价 `shop_price` DOUBLE DEFAULT NULL, #商城价
`pimage` VARCHAR(200) DEFAULT NULL, #商品图片路径
`pdate` DATE DEFAULT NULL, #上架时间 `is_hot` INT(11) DEFAULT NULL, #是否热门:0=不热门,1=热门
`pdesc` VARCHAR(255) DEFAULT NULL, #商品描述
`pflag` INT(11) DEFAULT 0, #商品标记:0=未下架(默认值),1=已经下架 `cid` VARCHAR(32) DEFAULT NULL, #分类id*/ private String pid;
private String pname;
private double market_price; private double shop_price;
private String pimage;
private String pdate; private int is_hot;
private String pdesc;
private int pflag; private String cid; public String getPid() {
return pid;
} public void setPid(String pid) {
this.pid = pid;
} public String getPname() {
return pname;
} public void setPname(String pname) {
this.pname = pname;
} public double getMarket_price() {
return market_price;
} public void setMarket_price(double market_price) {
this.market_price = market_price;
} public double getShop_price() {
return shop_price;
} public void setShop_price(double shop_price) {
this.shop_price = shop_price;
} public String getPimage() {
return pimage;
} public void setPimage(String pimage) {
this.pimage = pimage;
} public String getPdate() {
return pdate;
} public void setPdate(String pdate) {
this.pdate = pdate;
} public int getIs_hot() {
return is_hot;
} public void setIs_hot(int is_hot) {
this.is_hot = is_hot;
} public String getPdesc() {
return pdesc;
} public void setPdesc(String pdesc) {
this.pdesc = pdesc;
} public int getPflag() {
return pflag;
} public void setPflag(int pflag) {
this.pflag = pflag;
} public String getCid() {
return cid;
} public void setCid(String cid) {
this.cid = cid;
} } public class ProductDao {
/**
* 分页的dao
* @param startIndex
* @param pageSize
* @return
* @throws SQLException
*/
public List<Product> findByPage(int startIndex, int pageSize) throws SQLException {
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
String sql =" select * from product limit ?,? ";
Object [] params = {
startIndex , pageSize
};
return queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
}
/**
* 计算总记录数
* @return
* @throws SQLException
*/
public int findRecord() throws SQLException {
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
String sql =" select count(*) from product ";
Object [] params = {
};
Object object = queryRunner.query(sql, new ScalarHandler(), params);
return Integer.valueOf(object.toString());
} public List<Product> findAll() throws SQLException {
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql =" select * from product order by pdate desc "; Object [] params = {}; return queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
} public void save(Product product) throws SQLException {
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql =" insert into product values(?,?,?,?,?,?,?,?,?,?) "; Object [] params = {
product.getPid() , product.getPname() , product.getMarket_price() ,
product.getShop_price() , product.getPimage() , product.getPdate() ,
product.getIs_hot() , product.getPdesc() , product.getPflag() ,
product.getCid()
}; queryRunner.update(sql, params);
} public Product findByPid(String pid) throws SQLException {
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql =" select * from product where pid = ? "; Object [] params = {pid}; return queryRunner.query(sql, new BeanHandler<Product>(Product.class), params);
} public boolean update(Product product) throws SQLException { QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = " update product set pname = ? , shop_price = ? , pdesc = ? , cid = ? where pid = ? "; Object [] params = {
product.getPname() , product.getShop_price() , product.getPdesc() ,
product.getCid() , product.getPid()
}; return queryRunner.update(sql, params) > 0 ;
} public int deleteByPid(String pid) throws SQLException { QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = " delete from product where pid = ? "; Object [] params = {
pid
}; return queryRunner.update(sql, params) ;
} /**
* 处理乱码的工具类
*
*/
public class EncodingFilter implements Filter { public void destroy() {
// TODO Auto-generated method stub
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
try { //处理post乱码
request.setCharacterEncoding("utf-8"); //处理响应
response.setHeader("content-type", "text/html;charset=utf-8"); //处理get乱码
HttpServletRequest myRequest = (HttpServletRequest)Proxy.newProxyInstance(
EncodingFilter.class.getClassLoader(),
request.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //可以对getParameter进行增强 get提交方式 //1.判断是get请求方式
String requestMethod= request.getMethod();
if("GET".equalsIgnoreCase(requestMethod)){
//get提交 只对getParameter方法进行拦截
String methodName = method.getName();
if("getParameter".equals(methodName)){
//get方式 并且 调用的getParameter方法
//获得以前乱码 return 不乱码
String tempValue = request.getParameter(args[0].toString());
//如果没有获得数据 防止空指针
if(tempValue == null){
return null;
}
return new String(tempValue.getBytes("iso-8859-1"),"utf-8"); }
} //不需要增强
return method.invoke(request, args);
}
}); //放行
chain.doFilter(myRequest, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
} } jsp代码:
<%-- 获得数据 并遍历 --%>
<c:forEach items="${pageBean.data}" var="product">
<tr onmouseover="this.style.backgroundColor = '#F5FAFE'"
onmouseout="this.style.backgroundColor = '#fff';">
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
<input type="checkbox" name="" value="" />
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
<img src="${pageContext.request.contextPath}/${product.pimage}" style="height: 200px;width:150px" />
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.cid}
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.pname}
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.shop_price}
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.pdesc}
</td>
<td align="center" style="HEIGHT: 22px">
<%--编辑 --%>
<a href="${pageContext.request.contextPath}/ProductServlet?pid=${product.pid}&method=findByPid">
<img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
</a>
</td>
<td align="center" style="HEIGHT: 22px">
<%--查询 --%>
<a href="../user/view.html?userID=15">
<img src="${pageContext.request.contextPath}/images/button_view.gif" border="0" style="CURSOR: hand">
</a>
</td>
<td align="center" style="HEIGHT: 22px">
<%--删除 ctrl + q --%>
<a href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid=${product.pid}">
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</a> <%--提示删除 --%>
<a href="javascript:void(0)" onclick="deleteByPid('${product.pid}')">
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</a>
</td> </tr>
</c:forEach>
<%-- 获得数据 并遍历 --%>
<script>
//javascript 需要在写在 header标签中
function deleteByPid(pid){
//alert(pid);
//提示用户
var flag = confirm("您确定要删除信息吗?");
if(flag){
//确定删除
//访问服务器删除的Servlet
//修改地址栏 跳转路径 等效我们自己点击超链接
location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid="+pid;
}
}
</script>
</table>
</td>
</tr>
</TBODY>
</table>
<!--分页 class="disabled" class="active"-->
<div style="width:1100px;margin:0 auto;margin-top:50px;"> <ul class="pagination" style="text-align:center; margin-top:10px;"> <%-- 如果当前页 等于 1 不需要再显示上一页 如果当前不等于1 显示 --%>
<c:if test="${pageBean.pageNumber != 1}">
<li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=1" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
<li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber - 1 }" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
</c:if> <%-- 循环显示 所有的页数 --%>
<c:forEach begin="${pageBean.start}" end="${pageBean.end}" var="num" step="1">
<li ${pageBean.pageNumber == num ? " class='active'" : ""} ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${num}">${num}</a></li>
</c:forEach> <%-- 如果当前页小于总页数 显示下一页 --%>
<c:if test="${pageBean.pageNumber < pageBean.totalPage}">
<li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber + 1 }" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
<li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.totalPage}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>
</c:if> </ul> </div>
<!-- 分页结束======================= --> 条件查询:
1: 先在首页上查询分类数据,并且遍历显示
分析:
select * from product where cid = ? and pname = ?;
含有的可能性:
1.两者都有.
2.两者都没有.
3.有cid但没有pname
4.没有cid但有pname select count(*) from product where 1=1;
伪代码:
SQL = " select * from product where 1=1 ";
if(cid != null) {
SQL += " and cid = ? "
}
if(pname != null) {
SQL += " and pname like ? "
}
1: 修改表单 action属性,method属性,name属性,自定义的method判断逻辑.
2: 调用Servlet
a : 获得 cid和pname
b : 处理 调用service 调用dao(重要)
c : 响应 - 将数据存到request里,请求转发给product_list.jsp
3.对jsp页面进行改造 条件查询注意事项:
1 . Dao的sql部分,拼接的问题,使用 where 1=1 解决了脏读、不可重复读、
2 . Dao的参数拼接部分,使用List接收数据,最后将list转换成数组,解决.
3 . 查询完以后将数据返回给页面,但还需要加上,用户传入后台的cid和pname;
切记:条件查询 不可以 和 分页 同一个项目 但以后 条件查询需要和分页结合
4 . 如果条件查询和分页需要做到同一个项目,需要处理参数问题.
5 . PageBean 查询总记录数 --> 如果加入条件查询,查询总记录数时需要加上条件. 案例:代码体现
public class ProductServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try {
//获得页面传递的参数 用来执行某段代码
String method = request.getParameter("method"); ProductService pService = new ProductService();
CategoryService cService = new CategoryService();
//根据页面功能执行某段特殊的代码
if("findAll".equals(method)){
//执行查询所有的代码
//1.获得
//1.31 获得cid
String cid = request.getParameter("cid");
//1.2 获得pname
String pname = request.getParameter("pname"); //2.处理
List<Product> pList = pService.findAll( cid , pname );
List<Category> cList = cService.findAll();
//3.响应
//3.1 将数据存到request
request.setAttribute("pList", pList);
request.setAttribute("cList", cList); request.setAttribute("cid", cid);
request.setAttribute("pname", pname); //3.2 请求转发给jsp
request.getRequestDispatcher("/admin/product/product_list.jsp").forward(request, response);
return;
} public class ProductDao {
/**
* 条件查询
* @param cid
* @param pname
* @return
* @throws SQLException
*/
public List<Product> findAll(String cid, String pname) throws SQLException {
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); String sql = " select * from product where 1=1 "; //定义一个List 作用 用来保存参数
List<Object> paramList = new ArrayList<Object>();
//cid判断
if(cid != null && !"".equals(cid)){
sql += " and cid = ? ";
paramList.add(cid);
}
//pname判断
if(pname != null && !"".equals(pname)){
sql += " and pname like ? ";
paramList.add("%"+pname+"%");
} //数组的缺陷 长度固定 集合的长度不固定 集合最后转换成数组
Object [] params = paramList.toArray(); return queryRunner.query(sql,new BeanListHandler<Product>(Product.class), params); } <form action="${pageContext.request.contextPath}/ProductServlet" method="post">
<%--隐藏域 --%>
<input type="hidden" name="method" value="findAll"/> <table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td height="22" align="center" bgColor="#f5fafe" class="ta_01" style="width: 15%">
分类
</td>
<td class="ta_01" bgColor="#ffffff" style="width: 30%">
<select name="cid" class="form-control">
<option value="">请选择</option>
<c:forEach items="${cList}" var="category">
<option ${category.cid==cid ? "selected" : ""} value="${category.cid}">${category.cname}</option>
</c:forEach>
</select>
</td>
<td height="22" align="center" bgColor="#f5fafe" class="ta_01" style="width: 15%">
商品名称:
</td>
<td class="ta_01" bgColor="#ffffff">
<input type="text" name="pname" size="15" value="${pname}" class="form-control"/>
</td> 批量删除:
思想:
前台两套方法:
1 . 表单提交:将所有被选中的数据,的pid传入后台,后台执行批量删除.
2 . 修改sql 修改成 sql=" delete from product where pid in (?) " 数据循环拼接 1,2,4
3 . 开发中会使用jdbc jdbc当中有批处理,也可以处理批量任务. 事务特性:
A : 原子性;
C : 一致性;
I : 隔离性 : isolation 隔离会产生隔离问题
D : 持久性. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try {
//获得页面传递的参数 用来执行某段代码
String method = request.getParameter("method"); ProductService pService = new ProductService();
CategoryService cService = new CategoryService();
//根据pid删除商品
if("deleteByPid".equals(method)){
//1.获得
//获得数组集合
String[] pids = request.getParameterValues("pid");
//2.处理
int count = pService.deleteByPid(pids);
//3.响应
if(count > 0){
response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
}
return;
} <td align="center" width="6%">
<input type="button" value="删除选中" onclick="deleteAll()">
<script>
function deleteAll(){
//1.提示
var flag = confirm("您确定要删除信息吗?");
if(!flag){
return ;
}
//2.获得所有选中的pid 获得所有的数组 最后的格式 pid=1&pid=2&pid3..
var pids = $("input[name='pid']:checked").serialize() ;
//3.发送
location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&"+pids;
}
</script>
</td>
<td align="center" width="15%">
预览图
</td>
<td align="center" width="12%">
商品分类
</td>
<td align="center" width="25%">
商品名称
</td>
<td align="center" width="8%">
商品价格
</td>
<td width="11%" align="center">
描述
</td>
<td width="7%" align="center">
编辑
</td>
<td width="7%" align="center">
查看
</td>
<td width="7%" align="center">
删除
</td>
</tr>
<%-- 获得数据 并遍历 --%>
<c:forEach items="${pList}" var="product">
<tr onmouseover="this.style.backgroundColor = '#F5FAFE'"
onmouseout="this.style.backgroundColor = '#fff';">
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
<input type="checkbox" name="pid" value="${product.pid}" />
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
<img src="${pageContext.request.contextPath}/${product.pimage}" style="height: 200px;width:150px" />
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.cid}
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.pname}
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.shop_price}
</td>
<td style="CURSOR: hand; HEIGHT: 22px" align="center">
${product.pdesc}
</td>
<td align="center" style="HEIGHT: 22px">
<%--编辑 --%>
<a href="${pageContext.request.contextPath}/ProductServlet?pid=${product.pid}&method=findByPid">
<img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
</a>
</td>
<td align="center" style="HEIGHT: 22px">
<%--查询 --%>
<a href="../user/view.html?userID=15">
<img src="${pageContext.request.contextPath}/images/button_view.gif" border="0" style="CURSOR: hand">
</a>
</td>
<td align="center" style="HEIGHT: 22px">
<%--删除 ctrl + q --%>
<a href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid=${product.pid}">
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</a> <%--提示删除 --%>
<a href="javascript:void(0)" onclick="deleteByPid('${product.pid}')">
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</a>
</td> </tr>
</c:forEach>
<%-- 获得数据 并遍历 --%>
<script>
//javascript 需要在写在 header标签中
function deleteByPid(pid){
//alert(pid);
//提示用户
var flag = confirm("您确定要删除信息吗?");
if(flag){
//确定删除
//访问服务器删除的Servlet
//修改地址栏 跳转路径 等效我们自己点击超链接
location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid="+pid;
}
}
</script>
</table>
</td>
</tr>
</TBODJY>
</table> 数据库开启手动提交以后,只要commit以后,会改成自动提交.查一下是否改成了自动提交
05-17 08:50