通过这几天学习MVC形式开发web功能,有一个原则可以确定,就是必须先处理后台数据,然后获取处理完的后台数据,到前端显示
后台的数据结果。
今天案例出现频率很高的一个获取当前工程路径的代码:${pageContext.request.contextPath}指向了当前的工程路径
名称。比如:localhost:8080/day0610
这个形式的路径避免把绝对路径写死,便于后面的项目迁移。
比如,运用在前端的jQuery引入项目路径,可以写:
<script src='${pageContext.request.contextPath}/js/jquery1.8.3.js'>
</script>
这样子做的话,当以后前端部分的代码要迁移时,在正确迁移的情况下不必修改路径
2.创建一个PageBean 里面的成员属性有:
1)currPage:当前页面
2)pageSize:每页显示多少条记录
3)totalRecordNum:总记录数
4)totalPage:总页数
5)List<Product>:商品数据集合
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<Product>集合:
调用List<Product> list = PageService.findAll(begin,size);
PageService调用PageDao.findAll(begin,size);
PageDao创建List<Product> findAll(begin,size)方法
方法里使用查询所有的sql语句,使用new BeanListHandler结果集,返回一个List<Product> list;
5)获取总页数totalPage
Math.ceil(totalRecordNum/size);
注意整形转换成Double型,再转回int型
6)至此,已经获取PageBean对象的所有属性。存放到request对象中,然后转发到商品分页页面product_divide.jsp页面
7)前端jsp展示分页的数据效果:
前面步骤已经存储了pageBean在session。接下来在dividePage_list.jsp中获取pageBean就能做了
jsp前端代码:
<p>
分页条: <a href='/day0610/DividePageServelt?currPage=1'>【首页】</a>
<c:if test="${pageBean.currPage!=1}">
<a href='/day0610/DividePageServelt?currPage=${pageBean.currPage-1}'>[上一页]</a>
</c:if>
<c:forEach begin="1" end="${pageBean.totalPageNum}" var="status">
<a href='/day0610/DividePageServelt?currPage=${status}'>[${status}]</a>
</c:forEach>
<c:if test="${pageBean.currPage!=pageBean.totalPageNum}">
<a href='/day0610/DividePageServelt?currPage=${pageBean.currPage+1}'>[下一页]</a>
</c:if>
<a href='/day0610/DividePageServelt?currPage=${pageBean.totalPageNum}'>【尾页】</a>
${pageBean.currPage}/${pageBean.totalPageNum}页 共${pageBean.totalRecordNum}条记录
</p>
二、商品的添加改查功能:
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。
1)post方式提交pname到处理模糊查询的FindLikeServlet中。先进行中文编码的处理
2)新建一个ProductBean对象。
3)调用ProductService中的List<Product> list=findLike(pname)功能,Dao也创建该方法
4)在Dao的findLike(pname)中,sql语句是"select * from product order by pdate where pname like ?",
后面的参数是"%"+pname+"%"。返回的结果是BeanList;
5)把DAO返回的List<Product> list传递到Servlet中,赋值给productBean.list;
6)productBean存放到session.覆盖原来的seesion
7)
---------mark一下 明天再补全-----------------
后台的数据结果。
今天案例出现频率很高的一个获取当前工程路径的代码:${pageContext.request.contextPath}指向了当前的工程路径
名称。比如:localhost:8080/day0610
这个形式的路径避免把绝对路径写死,便于后面的项目迁移。
比如,运用在前端的jQuery引入项目路径,可以写:
<script src='${pageContext.request.contextPath}/js/jquery1.8.3.js'>
</script>
这样子做的话,当以后前端部分的代码要迁移时,在正确迁移的情况下不必修改路径
一.分页查询——物理分页思路:
1.首先点击首页的"分页查询"链接,访问到DividePageServlet,get方式上传当前首页currPage=0的参数。2.创建一个PageBean 里面的成员属性有:
1)currPage:当前页面
2)pageSize:每页显示多少条记录
3)totalRecordNum:总记录数
4)totalPage:总页数
5)List<Product>:商品数据集合
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<Product>集合:
调用List<Product> list = PageService.findAll(begin,size);
PageService调用PageDao.findAll(begin,size);
PageDao创建List<Product> findAll(begin,size)方法
方法里使用查询所有的sql语句,使用new BeanListHandler结果集,返回一个List<Product> list;
5)获取总页数totalPage
Math.ceil(totalRecordNum/size);
注意整形转换成Double型,再转回int型
6)至此,已经获取PageBean对象的所有属性。存放到request对象中,然后转发到商品分页页面product_divide.jsp页面
7)前端jsp展示分页的数据效果:
前面步骤已经存储了pageBean在session。接下来在dividePage_list.jsp中获取pageBean就能做了
jsp前端代码:
<p>
分页条: <a href='/day0610/DividePageServelt?currPage=1'>【首页】</a>
<c:if test="${pageBean.currPage!=1}">
<a href='/day0610/DividePageServelt?currPage=${pageBean.currPage-1}'>[上一页]</a>
</c:if>
<c:forEach begin="1" end="${pageBean.totalPageNum}" var="status">
<a href='/day0610/DividePageServelt?currPage=${status}'>[${status}]</a>
</c:forEach>
<c:if test="${pageBean.currPage!=pageBean.totalPageNum}">
<a href='/day0610/DividePageServelt?currPage=${pageBean.currPage+1}'>[下一页]</a>
</c:if>
<a href='/day0610/DividePageServelt?currPage=${pageBean.totalPageNum}'>【尾页】</a>
${pageBean.currPage}/${pageBean.totalPageNum}页 共${pageBean.totalRecordNum}条记录
</p>
二、商品的添加改查功能:
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<Product> list=findLike(pname)功能,Dao也创建该方法
4)在Dao的findLike(pname)中,sql语句是"select * from product order by pdate where pname like ?",
后面的参数是"%"+pname+"%"。返回的结果是BeanList;
5)把DAO返回的List<Product> 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提供的编辑器中,生成了<span style="white-space:pre;"> </span>这个东东,请忽略掉。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<link rel="stylesheet" type="text/css"
href="/day0610/demo/css/bootstrap.min.css" />
<script src="/day0610/demo/js/jquery-1.8.3.js"></script>
<script src="/day0610/demo/js/bootstrap.min.js"></script>
<script>
$(function() {
// 偶数行表格背景变色
$("table tbody tr:odd").css("background-color", "#AFD9EE");
});
</script>
<style>
* {
margin: 0;
padding: 0;
}
table {
width: 100%;
border-collapse: separate;
border-spacing: 0px;
border-color: grey;
border: 1px solid #aaa;
}
th {
vertical-align: baseline;
padding: 5px 15px 5px 6px;
background-color: #3F3F3F;
border: 1px solid #3F3F3F;
text-align: center;
color: #fff;
}
td {
border: 1px solid #3F3F3F;
padding: 5px 15px 5px 6px;
text-align: center;
}
</style>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
function addPage() {
//页面跳转的方法:window.location.href = ${pageContext.request.contextPath}/jsp/demo/product_list.jsp;
window.location.href = "${pageContext.request.contextPath}/demo/jsp/addProduct.jsp";
}
</script>
</head>
<body>
<center>
<h2>商品详情列表</h2>
<tr>
<td colspan=7>商品名称:<input type="text" name="pname"><input
type="submit" value="查询"> <input
type="button" value="添加" οnclick="addPage()" />
</td>
</tr>
<br />
<br />
</center>
<div class="container">
<div class="rows">
<div class="col-lg-12"></div>
</div>
</div>
<