Java遇见HTML的6篇文章技术较老只是在熟悉java基础知识和了解mvc模型思想
第四步:创建items.jsp
先实现在界面上查看所有商品信息,该类创建在web/TestCart目录下
跳转到商品详情页时把商品id带过去,这样能实现通过商品id查找商品详情。
<%@ page import="com.zhidaoauto.dao.ItemsDao" %>
<%@ page import="com.zhidaoauto.Entity.Items" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2020/4/29
Time: 9:56
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>items</title>
</head>
<body>
<%
// 实例化ItemsDao对象,并调用getAllItems方法返回的是个Items类型的list,再调用Items中的get方法获取参数值
ItemsDao itemsDao=new ItemsDao();
ArrayList<Items> list=itemsDao.getAllItems();
for (Items items:list)
{
%>
商品id:<%=items.getId()%><br>
商品数量:<%=items.getNumber()%><br>
商品名称:<%=items.getName()%><br>
城市:<%=items.getCity()%><br>
图片:<%=items.getPicture()%><br>
价格:<%=items.getPrice()%><br>
<%--通过超链接跳转到商品详情页同时把商品id带过去--%>
<a href="itemdetail.jsp?id=<%=items.getId()%>">点击进入查看商品详情页面</a>
<hr>
<%
}
%>
</body>
</html>
第五步:创建itemdetail.jsp
该页面实现输入购买商品数量,添加到购物车,跳转到购物车页面(在商品详情页同时展示浏览器过的前5条商品信息)
读取代码时关注注释内容,先不关注“展示浏览过的商品信息”下面会讲。
<%@ page import="com.zhidaoauto.dao.ItemsDao" %>
<%@ page import="com.zhidaoauto.Entity.Items" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2020/4/29
Time: 9:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>itemdetail</title>
</head>
<body>
<%
//根据商品id查询商品详情
ItemsDao itemsDao=new ItemsDao();
// 通过request.getParameter("id")获取从上一页超链接中传过来的id参数值,调ItemsDao类中的getItemDetail方法
Items items=itemsDao.getItemDetail(Integer.valueOf(request.getParameter("id")));
%>
<%--先展示商品详情--%>
商品id:<%=items.getId()%><br>
商品数量:<%=items.getNumber()%><br>
商品名称:<%=items.getName()%><br>
城市:<%=items.getCity()%><br>
图片:<%=items.getPicture()%><br>
价格:<%=items.getPrice()%><br>
<%
// 通过session设置一个属性,把当前items通过session传到cartservlet中,这样能实现添加items到购物车的功
request.getSession().setAttribute("items",items);
%>
<%--输入商品数量并跳转到cartservlet中,注意路径必须这样写,先跳转到上级目录再去找servlet/cartservlet--%>
<%--同时携带一个action动作参数,添加购物车所以参数值定为add--%>
<form action="../servlet/cartservlet?action=add" method="post">
<table>
<tr>
<td>添加商品数量:</td>
<td><input type="text" name="numbers"></td>
</tr>
<tr>
<td><input type="submit" value="添加到购物车"></td>
</tr>
</table>
</form>
<hr>
<h1>展示浏览过的商品信息</h1>
<%
String list="";
//从客户端获取cookie集合,刚开始就能获取到cookie
Cookie[] cookies=request.getCookies();
//遍历cookie集合
if (cookies!=null && cookies.length>0){
for (Cookie c:cookies){
if (c.getName().equals("ListViewCookie")){
list=c.getValue();
}
}
list+=request.getParameter("id")+":";
//如果超过1000条就清空list
String[] arr=list.split(":");
if (arr!=null && arr.length>0)
{
if (arr.length>=1000){
list="";
}
}
}
//把list添加到cookie中
Cookie cookie=new Cookie("ListViewCookie",list);
//添加到response中这样才能被下面的方法调用cookie,才能在返回中结果中看到cookie信息
response.addCookie(cookie);
%>
<%
ArrayList<Items> arrayListitem=itemsDao.getViewlist(list);
for (Items items1:arrayListitem)
{
%>
浏览过的商品id:<%=items1.getId()%><br>
浏览过的商品数量:<%=items1.getNumber()%><br>
浏览过的商品名称:<%=items1.getName()%><br>
浏览过的城市:<%=items1.getCity()%><br>
浏览过的图片:<%=items1.getPicture()%><br>
浏览过的价格:<%=items1.getPrice()%><br>
<hr>
<%
}
%>
</body>
</html>
**第六步:创建Cart类,购物车类,该类实现了创建map存储商品信息和用户添加的商品数量,同时实现了查看添加的商品信息和数量、删除商品信息、计算购物车中商品价格总额的功能
**
package com.zhidaoauto.Entity;
import com.sun.xml.internal.ws.util.QNameMap;
import com.zhidaoauto.dao.ItemsDao;
import java.util.*;
/*
购物车类,该类实现了创建map存储商品信息和用户添加的商品数量,同时实现了查看添加的商品信息和数量、删除商品信息、计算购物车中商品价格总额的功能
*/
public class Cart {
// 创建一个map,key值是Items类型的值,value是添加到购物车的商品数量值,所以是Integer类型
// 把该map定义为私有属性,并未其创建get方法,在showcart.jsp中会用到get方法获取该map
private Map<Items,Integer> itemsMap=new HashMap<Items, Integer>();
public Map<Items, Integer> getItemsMap() {
return itemsMap;
}
public void setItemsMap(Map<Items, Integer> itemsMap) {
this.itemsMap = itemsMap;
}
/**
* 添加商品到购物车
* @param items
* @param i
* @return
*/
public boolean addItems(Items items, int i){
//实现不能添加重复的items,如果添加重复的商品数量要累加在一起。
//先判断map中是否已经添加该items,如果已经添加,重新添加该items并且商品数量要加上之前的商品数量
if (itemsMap.containsKey(items)){
itemsMap.put(items,itemsMap.get(items)+i);
return true;
}else {
itemsMap.put(items,i);
return true;
}
}
// //查看购物车中商品信息,测试添加和删除方法
// public void getItemsMapdetail(){
// Set<Map.Entry<Items,Integer>> itemsMapEntrySet=itemsMap.entrySet();
// Iterator<Map.Entry<Items,Integer>> it=itemsMapEntrySet.iterator();
// while (it.hasNext()){
// Map.Entry<Items,Integer> itemsentry=it.next();
// System.out.println("添加的商品id为:"+itemsentry.getKey().getId()+
// " 添加的商品名称为:"+itemsentry.getKey().getName()+
// " 添加的商品单价为:"+itemsentry.getKey().getPrice()+
// " 添加的商品总额为:"+getTotalSum()+
// " 该商品添加的数量为:"+itemsentry.getValue());
// }
//
// }
/**
* 实现从购物车中删除商品
* @param items
* @return
*/
public boolean deleteItems(Items items){
itemsMap.remove(items);
return true;
}
/**
* 计算添加到购物车的商品总额
* @return
*/
public double getTotalSum(){
double sum=0.0;
//先获取map中items,再获取items中的商品价格,再跟商品数量相乘,再把所有商品总额相加
Set<Map.Entry<Items,Integer>> itemMapEntryset=itemsMap.entrySet();
Iterator<Map.Entry<Items,Integer>> it=itemMapEntryset.iterator();
while (it.hasNext()){
Map.Entry<Items,Integer> entry=it.next();
sum=sum+(entry.getKey().getPrice()*entry.getValue());
}
return sum;
}
// public static void main(String[] args) {
// Cart cart=new Cart();
// //添加商品不能从数据库中获取,要从页面根据用户选择数量获取
//// ItemsDao itemsDao=new ItemsDao();
//// itemsDao.addItems();
//// ArrayList<Items> itemslist=itemsDao.getAllItems();
//// for (Items items:itemslist){
//// cart.addItems(items,2);
//// }
//
// //创建item实例添加到map中
// Items items=new Items(7,"鼠标",20,3,"深圳","8888");
// Items items1=new Items(7,"鼠标",20,3,"深圳","8888");
// cart.addItems(items,1);
// cart.addItems(items1,2);
//
//
// System.out.println("添加完查看商品信息:");
// cart.getItemsMapdetail();
//// cart.deleteItems(itemslist.get(0));
//
//// System.out.println("删除后查看商品信息:");
//// cart.getItemsMapdetail();
//
// double totalsum=cart.getTotalSum();
// System.out.println("所有商品的总额是:"+totalsum);
//
//
// }
}
第七步:创建cartservlet类主要调用Cart类处理添加和删除商品信息,然后实现跳转到showcart.jsp页面
package servlet;
import com.zhidaoauto.Entity.Cart;
import com.zhidaoauto.Entity.Items;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
cartservlet类主要调用Cart类处理添加和删除商品信息,然后实现跳转到showcart.jsp页面
*/
public class cartservlet extends HttpServlet {
Cart cart=new Cart();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//获取action参数值,判断参数值时add还是delete,如果是add就调添加方法,是delete就调删除方法,添加和删除后都内部转发到showcart.jsp页面
String action=req.getParameter("action");
if (action.equals("add")){
addTocart(req,resp);
req.getRequestDispatcher("../TestCart/showcart.jsp").forward(req,resp);
}else if (action.equals("delete")){
deletefromcart(req,resp);
req.getRequestDispatcher("../TestCart/showcart.jsp").forward(req,resp);
}
}
public void addTocart(HttpServletRequest req, HttpServletResponse resp){
//获取从itemdetail.jsp页面添加的商品数量
int addtocartitemnumber=Integer.valueOf(req.getParameter("numbers"));
//获取从itemdetail.jsp页面设置的session属性值,获取的是object类型要强制转换成Items类型
Items items=(Items)req.getSession().getAttribute("items");
//调用Cart类中的addItems方法,传值items和商品数量
cart.addItems(items,addtocartitemnumber);
//设置一个session把cart传过去,供下面的showcart.jsp中查看商品信息使用
req.getSession().setAttribute("cart",cart);
}
public void deletefromcart(HttpServletRequest req, HttpServletResponse resp){
//获取在showcart.jsp页面设置的要删除的items的session值
Items items=(Items)req.getSession().getAttribute("deleteitem");
cart.deleteItems(items);
}
}
第八步:创建showchart.jsp页面,购物车页面
查看添加到购物车中的商品信息,购买商品总金额,在购物车页面可以删除添加到购物车中的商品。
<%@ page import="com.zhidaoauto.Entity.Cart" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.zhidaoauto.Entity.Items" %>
<%@ page import="java.util.Set" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="com.sun.xml.internal.ws.util.QNameMap" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2020/4/29
Time: 9:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>showcart</title>
</head>
<body>
<h1>查看购物车页面</h1>
<hr>
<%
//获取在cartservlet的addTocart方法中设置的session值,得到cart对象,可以调用getItemsMap方法获取map从而获取商品信息
Cart cart=(Cart)request.getSession().getAttribute("cart");
Map<Items,Integer> itemsIntegerMap=cart.getItemsMap();
Set<Map.Entry<Items,Integer>> itemsentryset=itemsIntegerMap.entrySet();
Iterator<Map.Entry<Items,Integer>> its=itemsentryset.iterator();
while (its.hasNext()) {
Map.Entry<Items,Integer> itementry=its.next();
Items items=itementry.getKey();
out.println("商品id:" + items.getId()+"<br>");
out.println("商品名称:" + items.getName()+"<br>");
out.println("商品单价:" + items.getPrice()+"<br>");
out.println("添加到购物车的该商品数量:" + itementry.getValue()+"<br>");
%>
<%
//设置一个session,这样在删除item时能知道要删除哪一个item
request.getSession().setAttribute("deleteitem",items);
%>
把该商品从购物车中删除<a href="../servlet/cartservlet?action=delete">删除</a>
<hr>
<%
}
%>
<%--最后调用商品总额,删除和新添加商品后都会到这个页面,都会重新加载该方法这样保证商品总额计算正确--%>
商品总额:<%=cart.getTotalSum()%>
</body>
</html>
页面效果
数据库中数据
返回到item.jsp页面重新进入商品详情再添加商品:
删除商品:
补充:
上面讲到的在界面上查看浏览过的商品信息,就需要用到cookie。
在itemdetail.jsp中把浏览器过的商品item的商品id用冒号“:”分隔符添加到list中,然后存到cookie中,同时从cookie中获取该id调用根据id查找商品详情的方法,把该商品信息展示在浏览器中。
itemdetail.jsp中的代码:
<h1>展示浏览过的商品信息</h1>
<%
String list="";
//从客户端获取cookie集合
Cookie[] cookies=request.getCookies();
//遍历cookie集合
if (cookies!=null && cookies.length>0){
for (Cookie c:cookies){
if (c.getName().equals("ListViewCookie")){
list=c.getValue();
}
}
list+=request.getParameter("id")+":";
//如果超过1000条就清空list
String[] arr=list.split(":");
if (arr!=null && arr.length>0)
{
if (arr.length>=1000){
list="";
}
}
}
//把list添加到cookie中
Cookie cookie=new Cookie("ListViewCookie",list);
//添加到response中这样才能被下面的方法调用cookie,才能在返回中结果中看到cookie信息
response.addCookie(cookie);
%>
<%
ArrayList<Items> arrayListitem=itemsDao.getViewlist(list);
for (Items items1:arrayListitem)
{
%>
浏览过的商品id:<%=items1.getId()%><br>
浏览过的商品数量:<%=items1.getNumber()%><br>
浏览过的商品名称:<%=items1.getName()%><br>
浏览过的城市:<%=items1.getCity()%><br>
浏览过的图片:<%=items1.getPicture()%><br>
浏览过的价格:<%=items1.getPrice()%><br>
<hr>
<%
}
%>
itemdao中的getViewlist方法:
//获取最近浏览的前5条信息
public ArrayList<Items> getViewlist(String list){
ArrayList<Items> itemslist=new ArrayList<Items>();
if (list!=null && list.length()>0){
String[] s=list.split(":");
if (s.length>=5){
for (int i=s.length-1;i>=s.length-5;i--){
int id=Integer.valueOf(s[i]);
itemslist.add(getItemDetail(id));
}
}else {
for (int j=s.length-1;j>=0;j--){
int id=Integer.valueOf(s[j]);
itemslist.add(getItemDetail(id));
}
}
return itemslist;
}else {
return null;
}
}