JAVA遇见HTML—Servlet篇(二.Servlet高级-应用MVC架构实现购物车Demo+JSP)

获取初始化参数

在web.xml中配置Servlet时,可以配置一些初始化参数。而在Servlet中可以通过ServletConfig接口提供的方法来取得这些参数。

代码示例:

这里写图片描述

GetInitParameterServlet.java类

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class GetInitParameterServlet
 */
@WebServlet("/GetInitParameterServlet")
public class GetInitParameterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private String username;// 用户名
    private String password;// 密码

    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetInitParameterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        // 指定文件的输出类型
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<h2>"+"用户名:"+this.getUsername()+"</h2><br>");
        out.println("<h2>"+"密码:"+this.getPassword()+"</h2><br>");
    }

    public void init() throws ServletException {
        this.setUsername(this.getInitParameter("username")); 
        this.setPassword(this.getInitParameter("password")); 
    }

}

web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ServletLifeCycleDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>GetInitParameterServlet</servlet-name>
    <servlet-class>servlet.GetInitParameterServlet</servlet-class>
    <init-param>
      <param-name>username</param-name>
      <param-value>admin</param-value>
    </init-param>
    <init-param>
      <param-name>password</param-name>
      <param-value>123456</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>GetInitParameterServlet</servlet-name>
    <url-pattern>/servlet/GetInitParameterServlet</url-pattern>
  </servlet-mapping>

</web-app>

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>Insert title here</title>
</head>
<body>
  <h1>获取初始化参数演示案例</h1>
  <hr>
  <a href="servlet/GetInitParameterServlet">获取初始化参数Servlet</a>
</body>
</html>

MVC模型介绍

这里写图片描述

Model2模型介绍

这里写图片描述

这里写图片描述

项目概述

使用servlet技术实现购物车效果。

MVC模型实现(Jsp + Servlet + dao)

创建购物车类
编写Servlet
创建页面层

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

购物车类的设计

这里写图片描述

entity包下的Items.java类

package entity;

public class Items {

    private int id;//商品Id
    private String name;//商品名称
    private String city;//产地
    private int price;//单价
    private int number;//库存
    private String picture;//图片

    public Items() {

    }

    public Items(int id,String name,String city, int price,int number,String picture) {
        this.id = id;
        this.name = name;
        this.city = city;
        this.price = price;
        this.number = number;
        this.picture = picture;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }   
}

entity包下的Cart.java类

package entity;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

//购物车类
public class Cart {

    // 购买商品的集合
    private HashMap<Items, Integer> goods;

    // 购物车的总金额
    private double totalPrice;

    // 构造方法
    public Cart() {
       goods = new HashMap<Items,Integer>();
       totalPrice = 0.0;
    }

    public HashMap<Items, Integer> getGoods() {
        return goods;
    }

    public void setGoods(HashMap<Items, Integer> goods) {
        this.goods = goods;
    }

    public double getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(double totalPrice) {
        this.totalPrice = totalPrice;
    }

    //添加商品进购物车的方法
    public boolean addGoodsInCart(Items item,int number) {
        goods.put(item, number);
        calTotalprice();//重新计算购物车的总金额
        return true;
    }

    //删除商品的方法
    public boolean removeGoodsFromCart(Items item) {
        goods.remove(item);
        calTotalprice();//重新计算购物车的总金额
        return true;
    }

    //统计购物车的总金额
    public double calTotalprice() {
        double sum = 0.0;
        Set<Items> keys = goods.keySet();//获得键的集合
        Iterator<Items> it = keys.iterator();//获得迭代器对象
        while(it.hasNext()) {
            Items i = it.next();
            sum += i.getPrice() * goods.get(i);
        }
        this.setTotalPrice(sum);//设置购物车的总金额
        return this.calTotalprice();
    }
}

测试购物车类

Cart.java类下添加main方法:

public static void main(String[] args) {

        //先创建两个商品对象
        Items i1 = new Items(1,"沃特篮球鞋","温州",100,500,"001.jpg");
        Items i2 = new Items(2,"李宁运动鞋","广州",200,500,"002.jpg");
        Items i3 = new Items(1,"沃特篮球鞋","温州",100,500,"001.jpg");

        Cart c =  new Cart();
        c.addGoodsInCart(i1, 1);
        c.addGoodsInCart(i2, 1);
        //再次购买沃特篮球鞋,购买3双
        c.addGoodsInCart(i3, 3);

        //遍历购物商品的集合
        Set<Map.Entry<Items, Integer>>  items=  c.getGoods().entrySet();
        for(Map.Entry<Items, Integer> obj :items) {
            System.out.println(obj);
        }
        System.out.println("购物车的总金额"+c.getTotalPrice());
    }

Items.java类修改toString,hashCode,equals方法

public String toString()
    {
        return "商品Id:"+this.getId()+",商品名称:"+this.getName();
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return this.getId()+this.getName().hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        if(this==obj) {
            return true;
        }
        if(obj instanceof Items) {//判读是不是属于一个类

            Items i = (Items)obj;
            if(this.getId() == i.getId() && this.getName().equals(i.getName())) {//判断是不是相同的id和商品名
                return true;
            }
            else {
                return false;
            }
        }else {
            return false;
        }
    }

添加商品进购物车

创建serlvet包CartServlet.java类

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.ItemsDAO;
import entity.Cart;
import entity.Items;

/**
 * Servlet implementation class CartServlet
 */
@WebServlet("/CartServlet")
public class CartServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private String action; // 表示购物车的动作,add,show,delete
    //商品业务逻辑类对象
    private ItemsDAO idao = new ItemsDAO();
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CartServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        // 指定文件的输出类型
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        if(request.getParameter("action")!=null) {//判断提交动作类型,如果是添加商品进购物车
            this.action = request.getParameter("action");
            if(action.equals("add")) {
                if(addToCart(request,response)) {//服务器内部跳转
                    request.getRequestDispatcher("/success.jsp").forward(request, response);
                }else {
                    request.getRequestDispatcher("/failure.jsp").forward(request, response);
                }
            }
            if(action.equals("show")) {//如果是显示购物车

//              showCart(request,response);
            }
        }
    }

    //添加商品进购物车的方法
    private boolean addToCart(HttpServletRequest request, HttpServletResponse response) {
        String id = request.getParameter("id");
        String number = request.getParameter("num");
        Items item = idao.getItemsById(Integer.parseInt(id));

        //是否是第一次给购物车添加商品,需要给session中创建一个新的购物车对象
        if(request.getSession().getAttribute("cart")==null) {
            Cart cart = new Cart();
            request.getSession().setAttribute("cart", cart);    
        }
        Cart cart = (Cart)request.getSession().getAttribute("cart");
        if(cart.addGoodsInCart(item, Integer.parseInt(number))) {
            return true;
        }else {
            return false;
        }
    }
}

details.jsp页面

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ page import="entity.Items"%>
<%@ page import="dao.ItemsDAO"%>
<%@page import="java.net.URLDecoder"%>
<%@page import="java.net.URLEncoder"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'details.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <link href="css/main.css" rel="stylesheet" type="text/css">
    <script type="text/javascript" src="js/lhgcore.js"></script>
    <script type="text/javascript" src="js/lhgdialog.js"></script>
    <script type="text/javascript">
      function selflog_show(id)
      { 
         var num =  document.getElementById("number").value; 
         J.dialog.get({id: 'haoyue_creat',title: '购物成功',width: 600,height:400, link: '<%=path%>/servlet/CartServlet?id='+id+'&num='+num+'&action=add', cover:true});
      }
      function add()
      {
         var num = parseInt(document.getElementById("number").value);
         if(num<100)
         {
            document.getElementById("number").value = ++num;
         }
      }
      function sub()
      {
         var num = parseInt(document.getElementById("number").value);
         if(num>1)
         {
            document.getElementById("number").value = --num;
         }
      }

    </script>

    <style type="text/css">
       hr{

         border-color:FF7F00; 
       }

       div{
          float:left;
          margin-left: 30px;
          margin-right:30px;
          margin-top: 5px;
          margin-bottom: 5px;

       }
       div dd{
          margin:0px;
          font-size:10pt;
       }
       div dd.dd_name
       {
          color:blue;
       }
       div dd.dd_city
       {
          color:#000;
       }
       div #cart
       {
         margin:0px auto;
         text-align:right; 
       }
       span{
         padding:0 2px;border:1px #c0c0c0 solid;cursor:pointer;
       }
       a{
          text-decoration: none; 
       }
    </style>
  </head>

  <body>
    <h1>商品详情</h1>
    <a href="index.jsp">首页</a> >> <a href="index.jsp">商品列表</a>
    <hr>
    <center>
      <table width="750" height="60" cellpadding="0" cellspacing="0" border="0">
        <tr>
          <!-- 商品详情 -->
          <% 
             ItemsDAO itemDao = new ItemsDAO();
             Items item = itemDao.getItemsById(Integer.parseInt(request.getParameter("id")));
             if(item!=null)
             {
          %>
          <td width="70%" valign="top">
             <table>
               <tr>
                 <td rowspan="5"><img src="images/<%=item.getPicture()%>" width="200" height="160"/></td>
               </tr>
               <tr>
                 <td><B><%=item.getName() %></B></td> 
               </tr>
               <tr>
                 <td>产地:<%=item.getCity()%></td>
               </tr>
               <tr>
                 <td>价格:<%=item.getPrice() %></td>
               </tr>
               <tr>
                 <td>购买数量:<span id="sub" onclick="sub();">-</span><input type="text" id="number" name="number" value="1" size="2"/><span id="add" onclick="add();">+</span></td>
               </tr> 
             </table>
             <div id="cart">
               <img src="images/buy_now.png"><a href="javascript:selflog_show(<%=item.getId()%>)"><img src="images/in_cart.png"></a><a href="servlet/CartServlet?action=show"><img src="images/view_cart.jpg"/></a>
             </div>
          </td>
          <% 
            }
          %>
          <% 
              String list ="";
              //从客户端获得Cookies集合
              Cookie[] cookies = request.getCookies();
              //遍历这个Cookies集合
              if(cookies!=null&&cookies.length>0)
              {
                  for(Cookie c:cookies)
                  {
                      if(c.getName().equals("ListViewCookie"))
                      {
                          list = URLDecoder.decode(c.getValue(), "UTF-8");
                      }
                  }
              }

              list+=request.getParameter("id")+",";
              //如果浏览记录超过1000条,清零.
              String[] arr = list.split(",");
              if(arr!=null&&arr.length>0)
              {
                  if(arr.length>=1000)
                  {
                      list="";
                  }
              }
            //1.保存list到cookie中时需要转码
                Cookie cookie = new Cookie("ListViewCookie",URLEncoder.encode(list, "UTF-8"));
              response.addCookie(cookie);

          %>
          <!-- 浏览过的商品 -->
          <td width="30%" bgcolor="#EEE" align="center">
             <br>
             <b><font color="#FF7F00">您浏览过的商品</font></b><br>
             <!-- 循环开始 -->
             <% 
                ArrayList<Items> itemlist = itemDao.getViewList(list);
                if(itemlist!=null&&itemlist.size()>0 )
                {
                   System.out.println("itemlist.size="+itemlist.size());
                   for(Items i:itemlist)
                   {

             %>
             <div>
             <dl>
               <dt>
                 <a href="details.jsp?id=<%=i.getId()%>"><img src="images/<%=i.getPicture() %>" width="120" height="90" border="1"/></a>
               </dt>
               <dd class="dd_name"><%=i.getName() %></dd> 
               <dd class="dd_city">产地:<%=i.getCity() %>&nbsp;&nbsp;价格:<%=i.getPrice() %></dd> 
             </dl>
             </div>
             <% 
                   }
                }
             %>
             <!-- 循环结束 -->
          </td>
        </tr>
      </table>
    </center>
  </body>
</html>

显示购物车

CartServlet.java类中判断页面动作给予不同的反馈,我们判断action.equals("show")跳转到购物车页面

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        // 指定文件的输出类型
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        if(request.getParameter("action")!=null) {//判断提交动作类型,如果是添加商品进购物车
            this.action = request.getParameter("action");
            if(action.equals("add")) {
                if(addToCart(request,response)) {//服务器内部跳转
                    request.getRequestDispatcher("/success.jsp").forward(request, response);
                }else {
                    request.getRequestDispatcher("/failure.jsp").forward(request, response);
                }
            }
            if(action.equals("show")) {//如果是显示购物车

                request.getRequestDispatcher("/cart.jsp").forward(request, response);

            }
        }
    }

cart.jsp文件

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%@ page import="entity.Cart" %>
<%@ page import="entity.Items" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'cart.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <link type="text/css" rel="stylesheet" href="css/style1.css" />
    <script language="javascript">
        function delcfm() {
            if (!confirm("确认要删除?")) {
                window.event.returnValue = false;
            }
        }
   </script>
  </head>

  <body>
   <h1>我的购物车</h1>
   <a href="index.jsp">首页</a> >> <a href="index.jsp">商品列表</a>
   <hr> 
   <div id="shopping">
   <form action="" method="">       
            <table>
                <tr>
                    <th>商品名称</th>
                    <th>商品单价</th>
                    <th>商品价格</th>
                    <th>购买数量</th>
                    <th>操作</th>
                </tr>
                <% 
                   //首先判断session中是否有购物车对象
                   if(request.getSession().getAttribute("cart")!=null)
                   {
                %>
                <!-- 循环的开始 -->
                     <% 
                         Cart cart = (Cart)request.getSession().getAttribute("cart");
                         HashMap<Items,Integer> goods = cart.getGoods();
                         Set<Items> items = goods.keySet();//获得键的集合
                         Iterator<Items> it = items.iterator();//迭代器

                         while(it.hasNext())
                         {
                            Items i = it.next();
                     %> 
                <tr name="products" id="product_id_1">
                    <td class="thumb"><img src="images/<%=i.getPicture()%>" /><a href=""><%=i.getName()%></a></td>
                    <td class="number"><%=i.getPrice() %></td>
                    <td class="price" id="price_id_1">
                        <span><%=i.getPrice()*goods.get(i) %></span>
                        <input type="hidden" value="" />
                    </td>
                    <td class="number">
                        <%=goods.get(i)%>                   
                    </td>                        
                    <td class="delete">
                      <a href="servlet/CartServlet?action=delete&id=<%=i.getId()%>" onclick="delcfm();">删除</a>                                    
                    </td>
                </tr>
                     <% 
                         }
                     %>
                <!--循环的结束-->

            </table>
             <div class="total"><span id="total">总计:<%=cart.getTotalPrice() %></span></div>
              <% 
                }
             %>
            <div class="button"><input type="submit" value="" /></div>
        </form>
    </div>
  </body>
</html>

商品删除

CartServlet.java判断事件类型

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        // 指定文件的输出类型
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        if(request.getParameter("action")!=null) {//判断提交动作类型,如果是添加商品进购物车
            this.action = request.getParameter("action");
            if(action.equals("add")) {
                if(addToCart(request,response)) {//服务器内部跳转
                    request.getRequestDispatcher("/success.jsp").forward(request, response);
                }else {
                    request.getRequestDispatcher("/failure.jsp").forward(request, response);
                }
            }
            if(action.equals("show")) {//如果是显示购物车

                request.getRequestDispatcher("/cart.jsp").forward(request, response);

            }

            if(action.equals("delete")) {//如果是执行删除购物车中的商品
                if(deleteFromCart(request,response)) {
                    request.getRequestDispatcher("/cart.jsp").forward(request, response);
                }
                else {
                    request.getRequestDispatcher("/cart.jsp").forward(request, response);
                }
            }
        }
    }
//从购物车中删除商品
    private boolean deleteFromCart(HttpServletRequest request, HttpServletResponse response) {
        String id =request.getParameter("id");
        Cart cart =(Cart)request.getSession().getAttribute("cart");
        Items item = idao.getItemsById(Integer.parseInt(id));
        if(cart.removeGoodsFromCart(item)) {
            return true;
        }else {
            return false;
        }
    }

完整Demo下载

链接: https://pan.baidu.com/s/1dGIGrO9 密码: ede8

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值