javaWeb核心技术第十二篇之分页和条件

```

分页: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以后,会改成自动提交.查一下是否改成了自动提交

```

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容