목차
MVC 아키텍처로 웹 프로젝트 생성
계층 아키텍처를 위한 코드 작성
도메인 레이어 개발
데이터 액세스 레이어 개발(dao, dao.impl)
서비스 레이어 개발(서비스 레이어는 웹 레이어에 모든 비즈니스 서비스를 제공합니다)
웹 레이어 개발
모든 도서를 사용자에게 표시하는 기능 개발
书籍列表
开发购买书籍的功能
购物车列表
开发删除购物车中购物项的功能
开发清空购物车的功能
开发改变购物车某购物项数量的功能
Java java지도 시간 Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니

Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니

Aug 10, 2017 pm 03:16 PM
javascript

이전 글에서는 가장 일반적으로 사용되는 사용자 로그인 등록 프로그램을 사용하여 Servlet+JSP+JavaBean 개발 모델을 설명했기 때문에 Servlet+JSP+JavaBean(MVC) 모델에 대해서도 사전 이해가 되었습니다. 이제 온라인 쇼핑을 위한 장바구니 프로그램을 사용하여 이 개발 모델을 검토해 보겠습니다.

MVC 아키텍처로 웹 프로젝트 생성

Eclipse에서 새로운 day10 프로젝트를 생성하고, 프로젝트에 필요한 개발 패키지(jar 패키지)를 임포트하고, 프로젝트에 필요한 패키지를 생성합니다. Java 개발에서는 아키텍처 레벨을 기반으로 합니다. 형태에 반영된 패키지에.
프로젝트에 필요한 개발 패키지(jar 패키지):

일련 번호 개발 패키지 이름 Description
1 stl-1.2.jar jstl 태그 라이브러리 및 EL 표현식 유형 종속성 패키지

참고: 이전 기사의 사용자 로그인 등록 프로그램과 달리 이 장바구니 프로그램은 데이터베이스를 나타내는 클래스를 생성하므로 다른 jar 패키지를 사용할 필요가 없습니다. stl-1.2.jar
프로젝트에 필요한 패키지:

일련번호패키지 이름설명레벨1cn.itcast.DBstore 대표 데이터베이스 클래스 2cn.itcast.domain 제공되는 시스템의 JavaBean 클래스(간단한 속성과 해당 속성에 해당하는 get 및 set 메소드만 포함하고 특정 비즈니스 처리 메소드는 포함하지 않음)를 저장합니다. [데이터 액세스 계층], [비즈니스 논리 계층] 및 [웹 계층]에는 domain(도메인 모델) 계층3cn.itcast.dao을 사용하여 작업의 구현 클래스를 저장합니다. 데이터베이스 액세스를 위한 인터페이스데이터 액세스 레이어4cn.itcast.service는 처리 시스템 비즈니스 인터페이스 비즈니스 로직 레이어 5cn.itcast의 구현 클래스를 저장합니다. web.controller는 서블릿을 시스템 컨트롤러(요청을 처리하는 서블릿)웹 계층(프레젠테이션 계층)6cn.itcast.web.UI으로 사용자에게 사용자 인터페이스를 제공합니다. 엄격한 MVC 모드에서는 jsp가 보호되고 외부로부터의 직접 액세스가 금지되기 때문에 사용자가 등록하려면 양식 페이지를 가져와 서블릿을 사용하여 jsp로 전송해야 합니다. 즉, 실제 개발에서 일부 서블릿은 요청을 처리하는 데 사용되며 일부 서블릿은 특별히 요청을 수신한 다음 이를 jsp로 전송하여 사용자에게 사용자 인터페이스를 제공하는 데 사용됩니다웹 계층(프레젠테이션 계층) 7cn .itcast.utils 시스템의 일반적인 도구 클래스를 저장하고 [데이터 액세스 계층], [비즈니스 논리 계층] 및 [웹 계층]에 제공되어 사용

위는 이 프로젝트의 실제 상황을 기반으로 작성된 패키지입니다. 이는 프로젝트의 필요에 따라 다른 패키지를 작성해야 할 수도 있습니다.
데이터베이스를 나타내는 클래스 만들기:
이것이 온라인 서점 프로젝트라고 가정해 보겠습니다. 사용자가 구매한 제품은 책이므로 데이터베이스에 저장된 제품은 책입니다. cn.itcast.DB 패키지 아래에 DB 클래스를 만듭니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
DB 클래스의 구체적인 코드는 다음과 같습니다.

public class DB {    private static Map<String, Book> map = new LinkedHashMap<String, Book>();

    static {        map.put("1", new Book("1", "javaweb开发", "老张", 38, "一本好书"));        map.put("2", new Book("2", "jdbc开发", "老黎", 18, "一本好书"));        map.put("3", new Book("3", "ajax开发", "老佟", 328, "一本好书"));        map.put("4", new Book("4", "jbpm开发", "老毕", 58, "一本好书"));        map.put("5", new Book("5", "struts开发", "老方", 28, "一本好书"));        map.put("6", new Book("6", "spring开发", "老方", 98, "一本好书"));
    }    public static Map<String, Book> getAll() {        return map;
    }
}1234567891011121314151617
로그인 후 복사

참고: 데이터베이스를 나타내는 클래스 생성 방법 - DB.java에 대해서는 쿠키를 이용한 세션 관리를 참조하세요.
WEB-INF 디렉토리 아래에 jsp 디렉토리를 만듭니다. jsp 디렉토리는 시스템의 일부 보호된 jsp 페이지를 저장합니다(사용자는 URL 주소를 통해 직접 액세스할 수 없습니다). .itcast.web.UI 패키지의 cn Servlet을 통해 제공됩니다.
생성된 프로젝트 아키텍처는 아래 그림과 같습니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니

계층 아키텍처를 위한 코드 작성

계층 아키텍처를 위한 코드도 [도메인 모델 계층(domain)] → [데이터 액세스 계층(dao, dao. impl) ] → [비즈니스 로직 레이어(service, service.impl)] → [프레젠테이션 레이어(web.controller, web.UI, web.filter, web.listener)] → [Tool 클래스(util)] → [Test 클래스 (junit) .test)] 순으로 작성됩니다.

도메인 레이어 개발

cn.itcast.domain 패키지 아래에 Book 클래스를 만듭니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
Book 클래스의 구체적인 코드는 다음과 같습니다.

public class Book {    private String id;    private String name;    private String author;    private double price;    private String description;    public Book() {        super();        // TODO Auto-generated constructor stub
    }    public Book(String id, String name, String author, double price, String description) {        super();        this.id = id;        this.name = name;        this.author = author;        this.price = price;        this.description = description;
    }    public String getId() {        return id;
    }    public void setId(String id) {        this.id = id;
    }    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    public String getAuthor() {        return author;
    }    public void setAuthor(String author) {        this.author = author;
    }    public double getPrice() {        return price;
    }    public void setPrice(double price) {        this.price = price;
    }    public String getDescription() {        return description;
    }    public void setDescription(String description) {        this.description = description;
    }

}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
로그인 후 복사

데이터 액세스 레이어 개발(dao, dao.impl)

cn.itcast.dao 패키지 아래에 UserDao 클래스를 생성합니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
UserDao 클래스의 구체적인 코드는 다음과 같습니다.

public class BookDao {    public Map<String, Book> getAll() {        return DB.getAll();
    }    public Book find(String id) {        return DB.getAll().get(id);
    }

}1234567891011
로그인 후 복사

서비스 레이어 개발(서비스 레이어는 웹 레이어에 모든 비즈니스 서비스를 제공합니다)

처음 새 프로젝트를 개발할 때 우리는 모든 기능을 알지 못합니다. 따라서 우리는 가장 먼저 생각하기 쉬운 기능을 개발한 다음, 웹 사이트 페이지를 탐색하는 동안 사용자에게 어떤 기능이 필요한지 확인한 다음 프로그래머가 어떤 기능을 개발할 것입니다. 그런 다음 단계별로 작업하여 전체 프로젝트를 통합합니다.
예를 들어 제가 이 장바구니 기능 모듈을 처음 개발했을 때 가장 먼저 생각한 것은 모든 책을 사용자에게 보여주고, 책 ID를 기반으로 책 정보를 조회하는 것이었습니다. 다른 기능은 기대하지 않았기 때문에 이 기능이 완료될 때까지 기다렸다가 프런트 엔드 페이지를 기반으로 어떤 기능이 필요한지 확인할 수 있습니다.
cn.itcast.service 패키지 아래에 BusinessService 클래스를 만듭니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
먼저 다음 두 가지 비즈니스 서비스를 구현하는 BusinessService 클래스를 작성하세요.

  • 사용자에게 모든 도서 표시

  • 도서 ID를 기준으로 도서 정보 조회

구체 코드는 다음과 같습니다.

// 业务类,统一对web层提供所有服务public class BusinessService {    private BookDao dao = new BookDao();    public Map<String, Book> getAllBook() {        return dao.getAll();
    }    public Book findBook(String id) {        return dao.find(id);
    }
}12345678910111213
로그인 후 복사

웹 레이어 개발

모든 도서를 사용자에게 표시하는 기능 개발

cn에서는 itcast.web.controller 패키지 아래에 ListBookServlet이 작성되어 사용자에게 모든 책을 표시합니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
ListBookServlet 클래스의 구체적인 코드는 다음과 같습니다.

// 获取所有书public class ListBookServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        BusinessService service = new BusinessService();
        Map<String, Book> map = service.getAllBook();
        request.setAttribute("map", map);

        request.getRequestDispatcher("/WEB-INF/jsp/listbook.jsp").forward(request, response);

    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        doGet(request, response);
    }

}12345678910111213141516171819
로그인 후 복사

/WEB-INF/jsp/ 디렉토리에 jsp 페이지 listbook.jsp를 작성하여 사용자에게 모든 책을 표시합니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
WEB-INF 디렉터리에 있는 모든 jsp 페이지는 URL 주소를 통해 직접 접근할 수 없습니다. 개발 중에 프로젝트에 외부 세계에서 직접 접근하고 싶지 않은 민감한 웹 리소스가 있는 경우 이러한 민감한 웹 리소스를 WEB-INF 디렉터리에 배치하여 외부인이 접근하는 것을 금지할 수 있습니다. URL을 통해 직접 확인할 수 있습니다.
listbook.jsp 페이지의 코드는 다음과 같습니다:

<%@ 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"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>书籍列表页面</title></head><body style="text-align: center;">    <h1 id="书籍列表">书籍列表</h1>    <table width="70%" border="1" align="center">        <tr>            <td>书名</td>            <td>作者</td>            <td>售价</td>            <td>描述</td>            <td>操作</td>        </tr>        <c:forEach var="entry" items="${map }">            <tr>                <td>${entry.value.name }</td>                <td>${entry.value.author }</td>                <td>${entry.value.price }</td>                <td>${entry.value.description }</td>                <td>                    <a href="${pageContext.request.contextPath }/BuyServlet?id=${entry.key }" target="_blank">购买</a>                </td>            </tr>        </c:forEach>    </table></body></html>12345678910111213141516171819202122232425262728293031323334
로그인 후 복사

웹사이트에는 일반적으로 홈페이지가 있습니다. 이 프로젝트에서는 홈페이지 index.jsp에서 사용자가 浏览书籍하이퍼링크를 클릭하여 웹사이트의 모든 책을 탐색할 수 있습니다.
index.jsp 페이지의 코드는 다음과 같습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>网站首页</title></head><body>    <a href="${pageContext.request.contextPath }/ListBookServlet">浏览书籍</a></body></html>123456789101112
로그인 후 복사

이제 모든 책을 사용자에게 표시하는 기능 개발이 완료되었습니다! 개발된 기능을 테스트해 보겠습니다.
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니

开发购买书籍的功能

在现实中购买商品时,用户都是将商品放到购物车中,所以我们应该按照现实中的情况设计一个代表用户购物车的类——Cart.java。
现在再来思考一个问题:在设计代表用户购物车的Cart类时,应该使用private Book book字段(或属性)来代表用户所购买的商品吗?
答案显然不是。若是使用这样的字段,结果就是不可避免地在购物车中出现重复商品,即用户如果购买一本书多次,那么购物车中就出现一本书多次,显然在现实中这是不合理的。那么到底该怎么做呢?——为了避免在购物车里面出现重复商品,我们这时会设计一个专门的对象——CartItem(购物项,代表某个商品以及这个商品出现的次数)
在cn.itcast.domain包下创建一个CartItem类,用于代表某个商品,以及商品出现的次数(购物项)。
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
CartItem类的具体代码如下:

// 用于代表某个商品,以及商品出现的次数(购物项)public class CartItem {    private Book book;    private int quantity;    private double price;    public Book getBook() {        return book;
    }    public void setBook(Book book) {        this.book = book;
    }    public int getQuantity() {        return quantity;
    }    public void setQuantity(int quantity) {        this.quantity = quantity;        this.price = this.book.getPrice() * this.quantity;
    }    public double getPrice() {        return price;
    }    public void setPrice(double price) {        this.price = price;
    }

}12345678910111213141516171819202122232425262728
로그인 후 복사

在cn.itcast.domain包中创建一个代表用户购物车的Cart类。
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
Cart类的具体代码如下:

// 代表用户的购物车public class Cart {    /*
     * 为了避免在购物车里面出现重复商品,
     * 我们这时会设计一个专门的对象——CartItem(购物项,代表某个商品以及这个商品出现的次数)
     */    private Map<String, CartItem> map = new LinkedHashMap<>();    private double price; // 记住购物车中的所有商品多少钱    public void add(Book book) {        // 看购物车中有没有,要添加的书对应的购物项
        CartItem item = map.get(book.getId());        if(item==null) {
            item = new CartItem();
            item.setBook(book);
            item.setQuantity(1);
            map.put(book.getId(), item);
        } else {
            item.setQuantity(item.getQuantity()+1);
        }
    }    public Map<String, CartItem> getMap() {        return map;
    }    public void setMap(Map<String, CartItem> map) {        this.map = map;
    }    public double getPrice() {        double totalprice = 0;        for(Map.Entry<String, CartItem> entry : map.entrySet()) {
            CartItem item = entry.getValue();
            totalprice += item.getPrice();
        }        this.price = totalprice;        return price;
    }    public void setPrice(double price) {        this.price = price;
    }

}12345678910111213141516171819202122232425262728293031323334353637383940414243
로그인 후 복사

用户浏览网站首页时,会看到网站所有书籍,用户即可对自己感兴趣的书籍进行购买,点击购物超链接时,跳转到一个servlet对用户的请求进行处理。所以在cn.itcast.web.controller包中创建一个代表完成书籍购买的BuyServlet类。
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
BuyServlet类的具体代码如下:

// 完成书籍购买@WebServlet("/BuyServlet")public class BuyServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {

        String id = request.getParameter("id");
        BusinessService service = new BusinessService();
        Book book = service.findBook(id);        // 得到用户的购物车
        Cart cart = (Cart) request.getSession().getAttribute("cart");        // 用户第一次购买,为用户创建购物车        if(cart==null) {
            cart = new Cart();
            request.getSession().setAttribute("cart", cart);
        }        // 把书加到用户的购物车中,完成购买
        cart.add(book);        /* 
         * 浏览器重新访问地址:/WEB-INF/jsp/listcart.jsp
         * 但这个地址被保护起来,外面是无法直接访问的,
         * 要实现的话,会比较麻烦,需要先跳到servlet,然后再转到jsp。
         */        // response.sendRedirect("/WEB-INF/jsp/listcart.jsp");

        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        doGet(request, response);
    }

}1234567891011121314151617181920212223242526272829303132333435363738
로그인 후 복사

注意:显示购物车时,记住千万不要用请求转发,而应该使用重定向技术。若不是产生的后果可参考我的笔记Session——使用Session完成简单的购物功能。我上面的代码使用的是请求转发,这是不行的,读者要注意了啊!既然要使用重定向技术,下面这行代码可行吗?

response.sendRedirect("/WEB-INF/jsp/listcart.jsp");1
로그인 후 복사

答案不言而喻,这是不行的。因为这是浏览器重新访问地址/WEB-INF/jsp/listcart.jsp,listcart.jsp页面是被保护起来了,外界是无法直接访问的。如果一定要实现的话,会比较麻烦,还需要先跳到一个servlet,然后再跳转到listcart.jsp。所以正规的做法是:BuyServlet类中使用重定向技术,即添加如下代码:

response.sendRedirect(request.getContextPath()+"/ListCartUIServlet");1
로그인 후 복사

然后在cn.itcast.web.UI包下创建一个ListCartUIServlet类,专门用来接收请求之后转到jsp,给用户提供用户界面。
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
ListCartUIServlet类的具体代码如下:

public class ListCartUIServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        doGet(request, response);
    }

}12345678910111213
로그인 후 복사

这毕竟不是一个真实项目,所以不想把其搞得这么复杂哈!所以就干脆用了请求转发,但是读者一定要知道这还是不行的,要知道用重定向技术,怎么使用我也已经写的很明白了!
购物车显示页面listcart.jsp代码如下:

<%@ 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"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>购物车列表</title><script type="text/javascript">    function deleteitem(id) {        var b = window.confirm("您确认删除吗?");        if(b) {            // window代表当前浏览器窗口,location代表当前浏览器窗口的地址栏
            window.location.href = "${pageContext.request.contextPath }/DeleteItemServlet?id="+id;
        }
    }    function clearCart() {        var b = window.confirm("您确认清空吗?");        if(b) {
            window.location.href = "${pageContext.request.contextPath }/ClearCartServlet"
        }
    }    function changeQuantity(input, id, oldValue) {        var quantity = input.value; // 得到要修改的数量        /*
        // 检查用户输入的数量是不是一个数字
        if(isNaN(quantity)) {
            alert("请输入数字!!!");
            // 得到输入项原来的值
            input.value = oldValue;
            return;
        }
        */        // 检查用户输入的数量是不是一个正整数        if(quantity<0 || quantity!=parseInt(quantity)) {    // 1.1 != 1     parseInt("abc")返回NaN
            alert("请输入一个正整数!!!");
            input.value = oldValue;            return;
        }        var b = window.confirm("您确定把书的数量修改为"+quantity+"吗?")        if(b) {
            window.location.href = "${pageContext.request.contextPath }/ChangeQuantityServlet?id="+id+"&quantity="+quantity;
        }
    }</script></head><body style="text-align: center;">    <h1 id="购物车列表">购物车列表</h1>    <c:if test="${empty(cart.map) }"> <!-- cart.map.empty:map为空,没东西       el表达式的函数:empty()——检测map是否为null或"",若是则返回true   -->
        您没有购买任何商品!!!    </c:if>    <c:if test="${!empty(cart.map) }">    <table width="70%" border="1" align="center">        <tr>            <td>书名</td>            <td>作者</td>            <td>单价</td>            <td>数量</td>            <td>小计</td>            <td>操作</td>        </tr>        <c:forEach var="entry" items="${cart.map }">   <!-- entry<id, CartItem> -->            <tr>                <td>${entry.value.book.name }</td>                <td>${entry.value.book.author }</td>                <td>${entry.value.book.price }</td>                <td>                                                                                                <!-- this代表input输入项 -->              
                    <input type="text" name="quantity" value="${entry.value.quantity }" style="width: 35px" onchange="changeQuantity(this, ${entry.key }, ${entry.value.quantity })" />                </td>                <td>${entry.value.price }</td>                <td>                    <!-- javascript:void(0):去掉超链接的默认行为 -->                    <a href="javascript:void(0)" onclick="deleteitem(${entry.key })">删除</a>                </td>            </tr>        </c:forEach>        <tr>            <td colspan="3">总价</td>            <td colspan="2">${cart.price }元</td>            <td colspan="1">                <a href="javascript:void(0)" onclick="clearCart()">清空购物车</a>            </td>        </tr>    </table>    </c:if></body></html>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
로그인 후 복사

至此,用户购买书籍的功能就算是开发完成了!下面测试一下开发好的该功能:
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니

开发删除购物车中购物项的功能

编写实现如下业务服务的BusinessService类。

  • 删除购物车中购物项

此时BusinessService类的具体代码如下:

// 业务类,统一对web层提供所有服务public class BusinessService {    private BookDao dao = new BookDao();    public Map<String, Book> getAllBook() {        return dao.getAll();
    }    public Book findBook(String id) {        return dao.find(id);
    }    // 删除购物车中购物项    public void deleteCartItem(String id, Cart cart) {
        cart.getMap().remove(id);
    }

}12345678910111213141516171819
로그인 후 복사

在cn.itcast.web.controller下创建一个DeleteItemServlet类。
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
DeleteItemServlet类的具体代码如下:

public class DeleteItemServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {

        String id = request.getParameter("id");
        Cart cart = (Cart) request.getSession().getAttribute("cart");

        BusinessService service = new BusinessService();
        service.deleteCartItem(id, cart);        // 删除成功,还是跳转到listcart.jsp页面
        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        doGet(request, response);
    }

}123456789101112131415161718192021
로그인 후 복사

注意:我上面的代码使用的是请求转发,这依然是不行的,读者要注意了啊!仍然要使用请求重定向,考虑到这毕竟不是一个真实项目,所以尽量不要搞得那么复杂,一切从简。
在购物车显示页面listcart.jsp中还要写入以下JavaScript代码:

<script type="text/javascript">    function deleteitem(id) {        var b = window.confirm("您确认删除吗?");        if(b) {            // window代表当前浏览器窗口,location代表当前浏览器窗口的地址栏
            window.location.href = "${pageContext.request.contextPath }/DeleteItemServlet?id="+id;
        }
    }</script>123456789
로그인 후 복사

不然的话,用户手贱,不小心删除了所选的购物项,辛辛苦苦购买的商品又要重新购买,用户的感受肯定巨不爽,所以在用户不小心删除了所选的购物项时,还要问用户是否确认删除。只有用户点击确认按钮才会删除,这样对用户来说,体验会更好。
至此,删除购物车中购物项的功能就算是开发完成了!下面测试一下开发好的该功能:
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니

开发清空购物车的功能

编写实现如下业务服务的BusinessService类。

  • 清空购物车

编写对应的清空购物车的方法时,由于代表用户购物车的Cart类存在session中,是不是可以像下面这样写呢?

public void clearCart(HttpSession session) {    ...     }123
로그인 후 복사

答:不可以。业务逻辑层用到Web层对象——session,业务逻辑层和Web层牢牢绑定在一起了,业务逻辑层离开Web层就跑不起来了,如果这样写,若要对业务层进行测试,需要把Web服务器起起来,传一个session进去,所以在各层之间传递的只能是JavaBean,不能让Web层的特殊对象侵入到业务逻辑层,污染业务逻辑层
此时BusinessService类的具体代码如下:

// 业务类,统一对web层提供所有服务public class BusinessService {    private BookDao dao = new BookDao();    public Map<String, Book> getAllBook() {        return dao.getAll();
    }    public Book findBook(String id) {        return dao.find(id);
    }    // 删除购物车中购物项    public void deleteCartItem(String id, Cart cart) {
        cart.getMap().remove(id);
    }    // 清空购物车    public void clearCart(Cart cart) {
        cart.getMap().clear();
    }

}123456789101112131415161718192021222324
로그인 후 복사

在cn.itcast.web.controller包下创建一个ClearCartServlet类。
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
ClearCartServlet类的具体代码如下:

public class ClearCartServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {

        Cart cart = (Cart) request.getSession().getAttribute("cart");

        BusinessService service = new BusinessService();
        service.clearCart(cart);

        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        doGet(request, response);
    }

}12345678910111213141516171819
로그인 후 복사

注意:我上面的代码使用的是请求转发,这依然是不行的,读者要注意了啊!仍然要使用请求重定向,考虑到这毕竟不是一个真实项目,所以尽量不要搞得那么复杂,一切从简。
在购物车显示页面listcart.jsp中还要写入以下JavaScript代码:

<script type="text/javascript">    function clearCart() {        var b = window.confirm("您确认清空吗?");        if(b) {
            window.location.href = "${pageContext.request.contextPath }/ClearCartServlet";
        }
    }</script>12345678
로그인 후 복사

不然的话,用户手贱,不小心清空了购物车,辛辛苦苦购买的商品又要重新购买,用户的感受肯定巨不爽,所以在用户不小心清空了购物车时,还要问用户是否确认清空。只有用户点击确认按钮才会清空,这样对用户来说,体验会更好。
还有一点要注意:如果用户清空了购物车,那么购物车显示页面不能没有任何显示,这也是对用户体验的一种折磨,明智的做法应该是给用户显示您没有购买任何商品!!!,这样用户体验会更好。那怎样判断用户有没有购买商品呢?——可使用el表达式的函数:empty(object),检测object对象是否为null或”“,若是则返回true。这样购物车显示页面listcart.jsp页面中的关键代码如下:

<h1 id="购物车列表">购物车列表</h1><c:if test="${empty(cart.map) }"> <!-- cart.map.empty:map为空,没东西       el表达式的函数:empty()——检测map是否为null或"",若是则返回true   -->
    您没有购买任何商品!!!</c:if><c:if test="${!empty(cart.map) }">
    ...</c:if>12345678
로그인 후 복사

至此,清空购物车的功能就算是开发完成了!下面测试一下开发好的该功能:
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니

开发改变购物车某购物项数量的功能

在现实中的购物中,当用户购买一件商品时,发现还需要购买这件商品,比如数量为100,用户不可能点击这件商品100次,若是这样,那这样的购物网站倒闭1万亿遍了。所以一般来说用户只需要改变其数量即可,这时就需要用到<input>控件,而且用户要输入的数量要是一个正整数,不能是其他乱七八糟的东西。
编写实现如下业务服务的BusinessService类。

  • 改变购物车某购物项的数量

此时BusinessService类的具体代码如下:

// 业务类,统一对web层提供所有服务public class BusinessService {    private BookDao dao = new BookDao();    public Map<String, Book> getAllBook() {        return dao.getAll();
    }    public Book findBook(String id) {        return dao.find(id);
    }    // 删除购物车中购物项    public void deleteCartItem(String id, Cart cart) {
        cart.getMap().remove(id);
    }    // 清空购物车    public void clearCart(Cart cart) {
        cart.getMap().clear();
    }    // 改变购物车某购物项的数量    public void changeItemQuantity(String id, String quantity, Cart cart) {
        CartItem item = cart.getMap().get(id);
        item.setQuantity(Integer.parseInt(quantity));
    }

}123456789101112131415161718192021222324252627282930
로그인 후 복사

在cn.itcast.web.controller中创建ChangeQuantityServlet类。
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니
ChangeQuantityServlet类的具体代码如下:

// 把购物车中的书修改为指定数量public class ChangeQuantityServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {

        String id = request.getParameter("id");
        String quantity = request.getParameter("quantity");

        Cart cart = (Cart) request.getSession().getAttribute("cart");

        BusinessService service = new BusinessService();
        service.changeItemQuantity(id, quantity, cart);

        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {
        doGet(request, response);
    }

}1234567891011121314151617181920212223
로그인 후 복사

注意:我上面的代码使用的是请求转发,这依然是不行的,读者要注意了啊!仍然要使用请求重定向,考虑到这毕竟不是一个真实项目,所以尽量不要搞得那么复杂,一切从简。
在购物车显示页面listcart.jsp中还要写入以下JavaScript代码:

<script type="text/javascript">    function changeQuantity(input, id, oldValue) {        var quantity = input.value; // 得到要修改的数量        // 检查用户输入的数量是不是一个正整数        if(quantity<0 || quantity!=parseInt(quantity)) {    // 1.1 != 1     parseInt("abc")返回NaN
            alert("请输入一个正整数!!!");
            input.value = oldValue;            return;
        }        var b = window.confirm("您确定把书的数量修改为"+quantity+"吗?")        if(b) {
            window.location.href = "${pageContext.request.contextPath }/ChangeQuantityServlet?id="+id+"&quantity="+quantity;
        }
    }</script>1234567891011121314151617
로그인 후 복사

完整的购物车显示页面listcart.jsp代码前面已经给出了,这里不再赘写。
至此,改变购物车某购物项数量的功能就算是开发完成了!下面测试一下开发好的该功能:
Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니



위 내용은 Servlet+JSP+JavaBean 모델을 기반으로 개발된 장바구니의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 Dec 17, 2023 pm 02:54 PM

WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 Dec 17, 2023 pm 12:09 PM

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 Dec 17, 2023 am 09:39 AM

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

자바스크립트에서 insertBefore를 사용하는 방법 자바스크립트에서 insertBefore를 사용하는 방법 Nov 24, 2023 am 11:56 AM

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript 및 WebSocket: 효율적인 실시간 이미지 처리 시스템 구축 JavaScript 및 WebSocket: 효율적인 실시간 이미지 처리 시스템 구축 Dec 17, 2023 am 08:41 AM

JavaScript는 웹 개발에 널리 사용되는 프로그래밍 언어인 반면 WebSocket은 실시간 통신에 사용되는 네트워크 프로토콜입니다. 두 가지의 강력한 기능을 결합하면 효율적인 실시간 영상 처리 시스템을 만들 수 있습니다. 이 기사에서는 JavaScript와 WebSocket을 사용하여 이 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 첫째, 실시간 영상처리 시스템의 요구사항과 목표를 명확히 할 필요가 있다. 실시간 이미지 데이터를 수집할 수 있는 카메라 장치가 있다고 가정해 보겠습니다.

See all articles