Java遇见HTML-servlet(三)

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>

页面效果
数据库中数据

image.png

image.png

image.png

image.png

返回到item.jsp页面重新进入商品详情再添加商品:
image.png

删除商品:
image.png

image.png

补充:
上面讲到的在界面上查看浏览过的商品信息,就需要用到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;
        }

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

推荐阅读更多精彩内容

  • 我们没有自己想象中的那么重要。 我们时常都会认为自己很重要,把自己在一件事或一个集体里看的太重。事实是,我们并没有...
    文霞_0efe阅读 55评论 0 3
  • 流觞曲水一觞咏, 惠风和畅亦啸歌。 海棠诗社秋爽斋, 黛玉重建桃花社。 海棠桃花诗自华, 大观园里联诗乐。 黛玉桃...
    琴雪_山人阅读 1,021评论 22 29
  • 近些天,租的房子到期,因为周边房子租金下降,和房东谈降低租金,房主不答应,是走是留,困扰于心。 和房东谈了三次,均...
    张齐无敌阅读 283评论 1 7
  • 你是遗世独立的一支莲 沁出人间六月的艳阳天 此香芬芳 婆娑自...
    胡渣子先生阅读 99评论 0 2
  • 每个人或许都会有这样一首歌:这首歌可以承载的东西很多,其中打动你的歌词,会在再次听到时,一下子就会把你拉入某...
    熠熠生星光阅读 638评论 0 0