目录
当一个jsp页面有java代码,还有html标签时,不便于后期的维护,所以需要分离java和html,分离就需要使用到JSTL标签
index.jsp 商城主页
<%--引入jar包后再引入标签库:tag标签,lib库,导入一个标签库 prefix是标签库的名字--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<style>
td:nth-child(3)::before{
content: "$";
}
</style>
</head>
<body>
<c:if test="${ user==null }">
<c:redirect url="login.jsp"/>
</c:if>
<c:if test="${ goods==null }">
<!-- 重定向 -->
<c:redirect url="doIndex.jsp"/>
</c:if>
<div class="jumbotron">
<div class="container">
<h1>欢迎光临喜洋洋SuperMarket</h1>
<!-- 拿到用户的登录数据,转成user类型才能拿到user实体类中的属性 -->
<p>尊贵的${user.account}</p>
<a href="car.jsp">购物车🛒</a>
<br>
<a href="doExit.jsp">退了</a>
</div>
</div>
<div class="container">
<table class="table">
<tr>
<th>商品序号</th>
<th>商品名称</th>
<th>商品单价</th>
<th>商品描述</th>
<th>操作</th>
</tr>
<c:forEach items="${goods }" var="g">
<tr>
<td>${g.id }</td>
<td>${g.name }</td>
<td>${g.price }</td>
<td>${g.info}</td>
<td>
<div class="btn-group btn-group-xs">
<a href="doAddCar.jsp?id=${g.id }" class="btn btn-primary">添加购物车</a>
</div>
</td>
</tr>
</c:forEach>
</table>
</body></html>
doIndex.jsp 商城数据刷新页
这页只负责取到数据,在赋给主界面
<%
//为首页提供数据
IGoodsBiz goodsBiz=new GoodsBizImpl();
List<Goods> goods=goodsBiz.getAll(ipage);
request.setAttribute("goods", goods);//已经将数据放在请求中了
//请求中的数据如果想带到其他界面 必须是转发
request.getRequestDispatcher("index.jsp").forward(request, response);
%>
分页功能在页面上的体现
<div class="container text-center">
<ul class="pagination" style="margin: 20px auto;">
<li>
<a href="index.jsp?ipage=${Math.max(ipage-1,1) }"><span>«</span></a>
</li>
<c:forEach begin="1" end="${maxPageCount}" var="num">
<li class='${num==ipage ? "":"active"}'><a href="doIndex.jsp?ipage=${num}">${num}</a></li>
</c:forEach>
<li>
<a href="index.jsp?ipage=${ipage+1>maxPageCount?maxPageCount:ipage+1}"><span>»</span></a>
</li>
</ul>
</div>
doIndex.jsp 上的取到分页的总页数
<%
//首页的java代码
String p=request.getParameter("ipage");//ipage(当前页码)
int ipage=1; //默认为第一页,如果用户修改则改为其他页
if(p!=null){
ipage=Integer.parseInt(p);
}
//调用业务逻辑层
IGoodsBiz goodsBiz=new GoodsBizImpl();
int maxPageCount=goodsBiz.pageCount();
//将数据存入域对象
request.setAttribute("maxPageCount",maxPageCount);
%>
GoodsBizImpl.java 业务逻辑层实现类代码补充
//查询分页商品行总数量
@Override
public int pageCount() {
return goodsDao.pageCount();
}
IGoodsBiz.java 业务逻辑层接口代码补充
//查询所有商品
List<Goods> getAll(int pagenumber);
GoodsDaoImpl.java 数据库访问层实现类代码补充
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
@Override
public List<Goods> getAll(int pagenumber) { //pagenumber 页面编号
List<Goods> list=new ArrayList<Goods>();
try {
int pageRow=5;//一面显示的条数
int begin=1+((pagenumber-1)*pageRow);
int end=pagenumber*pageRow;
con=DBHelper.getCon();
ps=con.prepareStatement("select * from(select a.*,rownum rm from shop_goods a)b where rm between ? and ?");
ps.setInt(1, begin);
ps.setInt(2, end);
rs=ps.executeQuery();
while(rs.next()){
Goods goods=new Goods();
goods.setId(rs.getInt(1));
goods.setName(rs.getString(2));
goods.setPrice(rs.getDouble(3));
goods.setInfo(rs.getString(4));
list.add(goods);
}
return list;
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return null;
}
public int pageCount() { //pageCount分页商品行总数量
int pagecount=0;
try {
con=DBHelper.getCon();
ps=con.prepareStatement("select count(1) from shop_goods");
rs=ps.executeQuery();
if(rs.next()) {
pagecount=(int)Math.ceil(rs.getInt(1)*1.0/5);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con, ps, rs);
}
return pagecount;
}
IGoodsDao.java 数据库访问层代码补充
//查询所有商品
List<Goods> getAll(int pagenumber);
//查询分页商品行总数量
int pageCount();
你要尽全力保护你的梦想。那些嘲笑你梦想的人,他们注定失败,他们想把你变成和他们一样。我坚信,只要心中有梦想,我就会与众不同。你也是。