1. 程式人生 > >實現網站的登陸,註冊,查看商品詳細信息,加入購物車,註銷登陸等簡單功能。

實現網站的登陸,註冊,查看商品詳細信息,加入購物車,註銷登陸等簡單功能。

如果 進入 enc 獲取請求參數 一個 ota ati dispatch 轉發

創建一個LoginFilter攔截器

@WebFilter("*.do")// 攔截需要進行登陸校驗的請求 /home /addCart.do /myCart.do /login /reg

// 判斷是否登陸
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;

Object user = req.getSession().getAttribute("user");
if(user == null){
//session中沒有取到用戶信息 證明 沒有登錄 則跳轉到登陸界面
resp.sendRedirect("/shop/views/login.jsp");
}else{
//session中獲取到了用戶信息 證明 已經登陸 則 放行
filterChain.doFilter(req,resp);
}

在網址輸入地址進入首頁/home/servlet

進行操作:1調用dao獲取數據庫中所有商品的數據

        IProductDAO中{List<Map<String,Object>> getAllProduct}

        ProductDAOImpl中{ String sql = "select * from product"; return DBUtil.executeQuery( sql ); }

          IProductDAO dao = new ProductDAOImpl();
          List<Map<String,Object>> allProduct = dao.getAllProduct();

     2請求共享數據

        req.setAttribute( "allProduct",allProduct );

     3請求轉發到首頁 index.jsp

        req.getRequestDispatcher( "/views/index.jsp" ).forward( req,resp );

     4在index.jsp中用<c:forEach> 對數據進行循環輸出

        <c:forEach var="p" items="${allProduct}">
        <div class="products">
         <!--商品圖片-->
         <a href="/shop/product?pid=${p.pid}" class="pimg" style="background-image: url(${p.pimage});"></a>
         <div class="info">
         <div class="part">
         <!--商品價格-->
         <div class="price">¥${p.shopPrice}</div>
         <div class="collect">
         <!--商品收藏-->
         <i class="icon-star"></i>${p.collect}
         </div>
         </div>
         <i class="icon-select">
         <!--商品簡介-->
         </i>${p.pname}
         </div>
         </div>

        </c:forEach>

查看商品詳細信息:在首頁點擊圖片 根據圖片對應的ID 進行查詢所有信息

在index.jsp中圖片設置成<a>標簽 跳轉 並設置跳轉屬性根據pid href="/shop/product?pid=${p.pid}"

在ProductServlet中進行操作:

            try{

1 獲取請求參數pid    String pid = req.getParameter( "pid" );

             2 在dao中根據pid查詢商品信息

              IProductDAO中{ Map<String,Object> getProduct(int pid); }

              ProductDAOImpl中{String sql = "select * from product where pid = ?"; List<Map<String, Object>> list = DBUtil.executeQuery( sql,pid ); if(list.size()>0){ return list.get( 0 ); } return null; }

              IProductDAO productDAO = new ProductDAOImpl();

                Map<String, Object> product = productDAO.getProduct( Integer.parseInt( pid ) );

             3 共享數據

              req.setAttribute( "product",product );

             4 請求轉發到product.jsp 商品詳細信息頁面

               req.getRequestDispatcher( "/views/product.jsp" ).forward( req,resp );

            }catch(Exception e){System.out.println("程序出錯了"); resp.sendRedirect( "/views/index.jsp" ); }

            註: 這裏try catch 是因為如果pid我輸入字符串會出BUG 所以這裏直接處理異常 重定向到index.jsp 首頁即可

              

      在product.jsp頁面中

<c:choose>
<%--if(商品為空 ){--%>
<c:when test="${empty product}">
<h1>對不起 暫無該商品</h1>
</c:when>

<%--else{ --%>
<c:otherwise>
<div class="wrap">
<img src="${product.pimage}" />
<div class="description">

<form action="/shop/addCart" method="post">
<h2>"${product.pname}</h2>
<div class="old_price">
原價:
<span>
¥${product.marketPrice}
</span>
</div>
<div class="price">
折扣價:
<span>
¥${product.shopPrice}
</span>
</div>

<div>
尺碼:均碼
</div>

<div class="count">
數量:
<span class="s">-</span>
<input type="text" value="1" name="num" class="num" />
<span class="s">+</span>
</div>

<input type="hidden" name="pid" value="${product.pid}" />

<div>
<input type="submit" value="加入購物車" class="goods_cart" />
</div>

<div>
<input type="submit" value="立即購買" class="buy"/>
</div>
</form>
</div>

</div>

</c:otherwise>

</c:choose>

<c:choose> 選擇 <c:when 判斷 ¥{empty product}> 如果超出 則顯示商品不存在

                         註冊

在header.jsp中給註冊設置成<a> 標簽 點擊時 直接跳轉到registr.jsp頁面中

當我點擊註冊時 跳轉到RegisterServlet

    1:設置編碼格式 req.setCharacterEncoding( "UTF-8" );

     2:獲取請求參數

String username = req.getParameter("username");

String password = req.getParameter("password");

String telephone = req.getParameter("telephone");

String nickname = req.getParameter("nickname");

String email = req.getParameter("email");

    3:驗證用戶名是否已經被註冊 唯一性效驗

    在IUserDAO中{ boolean isExist(String username); }

    在UserDAOImpl中{ String sql = "select * from user where username = ?"; List<Map<String, Object>> list = DBUtil.executeQuery(sql, username); return list.size()>0; }

          IUserDAO userDAO = new UserDAOImpl();
          boolean exist = userDAO.isExist( username );

        if(exist){

            //3 如果用戶名已經被註冊 提示用戶 用戶名被占用
         req.setAttribute("error","用戶名已經被占用"); 在register.jsp頁面中寫入一個
${error};
       }else {
          //4 沒有註冊 則 將用戶信息添加到數據庫中
          在IUserDAO中{boolean saveUser(User user);  }
          在UserDAOImpl中{
String sql = "insert into user(telephone,password,username) values (?,?,?)";
          return DBUtil.executeUpdate( sql,user.getTelephone(),user.getPassword(),user.getUsername() ); } 

        User user = new User(0, username, password, nickname, email, telephone);
            userDAO.saveUser(user);
        req.setAttribute("success","註冊成功"); }
          
//5 請求轉發到註冊界面
          
req.getRequestDispatcher("/views/register.jsp").forward(req,resp);




                        在register.jsp頁面中寫入



          <script>
             if("${success}" == "註冊成功"){

           if(confirm("註冊成功是否去登陸")){
                    window.location.href = "/shop/views/login.jsp";
           }
          }
           </script>
                註冊成功後彈出一個警告框  
    
                          
                            登陸操作
在header.jsp中點擊登陸 跳轉到login.jsp頁面。 在login.jsp頁面中點擊登陸 跳轉到LoginServlet
1:獲得數據
String username = req.getParameter( "username" ); String password = req.getParameter( "password" );
2:驗證賬號密碼是否正確
IUserDAO userDAO = new UserDAOImpl();


在IUserDAO中{ Map<String,Object> isLogin(String username,String password); }
在UserDAOImpl中{
String sql = "select * from user where username = ? and password = ?";

           List<Map<String, Object>> list = DBUtil.executeQuery(sql, username, password);
            if(list.size()>0){
            return list.get( 0 );
            }
            return null;


Map<String, Object> user  = userDAO.isLogin(username, password);

判斷 : if(user==null){
      // 3 如果不正確  請求轉發到  login.jsp 並 提示 賬號或密碼不正確
      req.setAttribute("error","對不起用戶名或密碼不正確");
      req.getRequestDispatcher("/views/login.jsp").forward(req,resp); 在login.jsp 頁面中 寫入 ${error} 提示 錯誤
      }else{
        // 4 如果正確  重定向到  servlet
       HttpSession session = req.getSession();//獲取session對象 session 可在多頁面直接顯示登陸後的信息。
       session.setAttribute("user",user);
     // 5 重定向到查詢所有商品後的首頁
      resp.sendRedirect("/shop/home");}


         在header.jsp頁面中把 登陸註冊換成
            <c:choose>
            <c:when test="${empty user}"> // 判斷用戶名是否為空
            <li><a href="/shop/views/login.jsp">登錄</a></li>
            <li><a href="/shop/views/register.jsp">註冊</a></li>
             </c:when>
             <c:otherwise> // 不為空顯示用戶別名
             <li>歡迎尊敬的VIP:<a href="/shop/views/persional.jsp">${user.nickname}</a></li>
             </c:otherwise>
            </c:choose>
  

                              註銷操作

點擊用戶別名 進入到個人中心 persional.jsp 頁面中  點擊註銷 跳轉到LogOutServlet中
步驟:    
req.getSession().invalidate(); //銷毀session 銷毀之後 相當於 將登陸信息全部清除
 resp.sendRedirect( "/shop/home" );        //  重定向到主頁

                        



                                添加到購物車

需要在product.jsp頁面中 添加    <input type="hidden"  name="pid"  value="${product.pid}" />   得到pid的值


在商品詳細信息頁面點擊添加購物車 跳轉到AddCartServlet中

1: 判斷房前是否有用戶登陸
Map user = (Map) req.getSession().getAttribute("user");

2: 獲取商品信息關於pid 數量num 跟用戶uid
String pid = req.getParameter("pid");

String num = req.getParameter("num");
Integer uid = (Integer) user.get("uid");
3: 調用dao層中的方法
IProductDAO productDAO = new ProductDAOImpl();
4:判斷:
     在IProductDAO中{ boolean isAddCart(String pid,Integer uid); } 
     在ProductDAOImpl中{
String sql = "select * from car where pid = ? and uid = ?";
                 List<Map<String, Object>> list = DBUtil.executeQuery( sql,pid,uid );
                  return list.size()>0;
}
if (productDAO.isAddCart(pid, uid)) {   //  如果用戶與商品存在 

  
        
          在IProductDAO中{   boolean  updateCart(String pid,String num,Integer uid);   } 
           在ProductDAOImpl中{String sql = "update car set num = num+? where uid = ? and pid = ?";
                    return DBUtil.executeUpdate(sql,num,uid,pid);}
        // 修改購物車中商品信息
productDAO.updateCart(pid, num, uid);
} else {



在IProductDAO中{   boolean  addCart(String pid,String num,Integer uid);   }
在ProductDAOImpl中{   String sql = "insert into car (uid,pid,num) values (?,?,?)";
             return DBUtil.executeUpdate(sql,uid,pid,num);}
        //不存在就直接添加商品到購物車
productDAO.addCart(pid, num, uid);
}
5: 共享數據
req.setAttribute("success", "添加成功");
6:轉發到詳細商品信息的ProductServlet
req.getRequestDispatcher("/product").forward(req, resp);

}


在 product.jsp頁面中寫入
<script>

if("${error}" != ""){
if(confirm("對不起 您還沒有登陸 是否去登錄")){
window.location.href = "/shop/views/login.jsp";
}
}

if("${success}" != ""){
if(confirm("添加成功 是否去購物車")){
window.location.href = "/shop/views/goodscart.jsp";
}
}


</script> 如果用戶不存在 提示是否去登陸界面 存在 提示是否去購物車頁面






                          進入我的購物車

在header.jsp頁面中 點擊購物車跳轉到MyCartServlet中

1: 判斷用戶是否登陸 Map user = (Map) req.getSession().getAttribute("user");

2: 如果登陸了則
獲取用戶的 uid ----》 根據uid 獲取用戶的購物車商品

Integer uid = (Integer) user.get("uid");

IUserDAO userDAO = new UserDAOImpl();

    在IUserDAO中{
List<Map<String,Object>> getMyCart(Integer uid); }
    在UserDAOImpl中{
    String sql = "select p.pid ,p.pimage,p.pname,p.shopPrice,c.num  " +
"from car c " +
"INNER JOIN product p " +
"on c.pid = p.pid " +
"where c.uid = ? ";

  return DBUtil.executeQuery(sql,uid); }
List<Map<String, Object>> myCart = userDAO.getMyCart(uid);

3: 共享數據
req.setAttribute("myCart", myCart);
4:
請求轉發到 goodscart.jsp 展示數據
    req.getRequestDispatcher("/views/goodscart.jsp").forward(req, resp);




在goodscart.jsp 頁面中

<c:choose>
<c:when test="${empty myCart}">

<h1>對不起 您的購物車 空空如也 請先去 <a href="/shop/home">購物</a> </h1>

</c:when>
<c:otherwise>

<c:forEach var="p" items="${myCart}">
<div class="goods">
<ul>
<li><img src="${p.pimage}"/> ${p.pname}</li>
<li>尺碼:均碼</li>
<li class="price">${p.shopPrice}</li>
<li>
<div class="count">
<span class="s">-</span>
<input type="text" value="${p.num}" name="num" class="num" />
<span class="s">+</span>
</div>
</li>
<li class="subtotal">76</li>
<li>
<a href="#">刪除</a>
</li>
</ul>
</div>
</c:forEach>

</c:otherwise>

</c:choose>



 


 

                                                    



















          
 

實現網站的登陸,註冊,查看商品詳細信息,加入購物車,註銷登陸等簡單功能。