实现结账

 

BookServlet:  用户名账号不能为空--》用户名和账号不匹配--》库存不足--》余额不足

复杂的业务逻辑     四个 验证的关联性  

 

protected void cash(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1.简单验证  用户名  账号是否为空  
		 String  username=request.getParameter("username");
		 String   accountid=request.getParameter("accountId");
		 StringBuffer   errors=validateFormField(username, accountid);
		 //表单验证通过  
		   if(errors.toString().equals("")){//errors.append("亲 ^-^用户名不能为空!!!");若为空则没错   过
			   
			   errors=validateUser(username, accountid);
			   //用户名和账号验证通过
			   if(errors.toString().equals("")){
				   errors=validateBookStoreNumber(request, response);
				   //库存验证通过
				   if(errors.toString().equals("")){
					   errors=validateBalance(request, accountid);
				   }
			   }
		   }
		 if(!errors.toString().equals("")){
			 request.setAttribute("errors", errors);
			 request.getRequestDispatcher("/WEB-INF/pages/cash.jsp").forward(request, response);
			 return ; 
		 }
		//验证通过 执行具体的逻辑操作
		 
		 bookService.cash(BookStoreWebUtils.getShoppingCart(request),username,accountid);
		 response.sendRedirect(request.getContextPath()+"/success.jsp");//操作成功    
	}
	// 验证余额是否充足
	public StringBuffer validateBalance(HttpServletRequest request, String accountid)
			throws ServletException, IOException {
		StringBuffer errors = new StringBuffer("");
		ShoppingCart cart = BookStoreWebUtils.getShoppingCart(request);
		Account account = accountService.getAccount(Integer.parseInt(accountid));
		if (cart.getTotalMoney() > account.getBalance()) {
			errors.append("余额不足^--^");
		}
		return errors;
	}

	// 验证库存是否充足
	public StringBuffer validateBookStoreNumber(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		StringBuffer errors = new StringBuffer("");
		ShoppingCart cart = BookStoreWebUtils.getShoppingCart(request);
		for (ShoppingCartItem sci : cart.getItems()) {
			int quantity = sci.getQuantity();
			// 获取最新的库存剩余数量
			int storeNumber = bookService.getBook(sci.getBook().getId()).getStoreNumber();
			if (quantity > storeNumber) {
				// 哪本书库存不足
				errors.append(sci.getBook().getTitle() + "库存不足<br>");
			}
		}
		return errors;
	}

	// 验证用户名和账号是否匹配
	public StringBuffer validateUser(String username, String accountid) {
		boolean flag = false;
		User user = userService.getUserByUserName(username);
		if (user != null) {
			int accountid2 = user.getAccountId();
			if (accountid.trim().equals("" + accountid2)) {
				flag = true;
			}
		}
		StringBuffer errors2 = new StringBuffer("");
		if (!flag) {
			errors2.append("用户名和账号不匹配");
		}
		return errors2;
	}

	// 验证表单域是否符合基本的规则
	public StringBuffer validateFormField(String username, String accountid) {
		StringBuffer errors = new StringBuffer("");
		if (username == null || username.trim().equals("")) {
			errors.append("亲 ^-^用户名不能为空!!!");
		}
		if (accountid == null || accountid.trim().equals("")) {
			errors.append("亲^-^账号不能为空!!!");
		}
		return errors;
	}
package com.greatest.mvcapp.dao.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.greatest.mvcapp.dao.TradeItemDAO;
import com.greatest.mvcapp.main.TradeItem;

public class TradeItemDAOImpl extends BaseDAO<TradeItem> implements TradeItemDAO {
	@Override
	//批量进行插入
	public void batchSave(Collection<TradeItem> items) {
		String sql = "INSERT INTO tradeitem(bookid, quantity, tradeid) " +
				"VALUES(?,?,?)";
		Object [][] params = new Object[items.size()][3];
		//初始化
		List<TradeItem> tradeItems = new ArrayList<>(items);
		for(int i = 0; i < tradeItems.size(); i++){
			params[i][0] = tradeItems.get(i).getBookId();
			params[i][1] = tradeItems.get(i).getQuantity();
			params[i][2] = tradeItems.get(i).getTradeId(); 
		}
		batch(sql, params);
	}
    //获取TradeItem集合     
	@Override
	public Set<TradeItem> getTradeItemsWithTradeId(Integer tradeId) {
		                    //别名
		String sql = "SELECT itemId tradeItemId, bookId, " +
				"quantity, tradeId FROM tradeitem WHERE tradeid = ?";
		return new HashSet<>(queryForList(sql, tradeId));
	}
}
package com.greatest.mvcapp.Servlet;

import java.io.IOException;

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 com.greatest.mvcapp.main.User;
import com.greatest.mvcapp.service.UserService;

/**
 * Servlet implementation class UserServlet
 */
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
   private UserService  userService=new UserService();
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 //获取username请求参数的值
		String username=request.getParameter("username");
		//调用UserServlet的getUser(username)获取User对象 
		//:要求trade是诶装配好的。而且每一个Teade对象的items也被装配好 
		User user=userService.getUserWithTrades(username);
		//把User对象放入到request中sp
		if(user==null){
			response.sendRedirect(request.getServletPath()+"error.jsp");
		return ;
		}
		request.setAttribute("user", user);
    //转发页面到/WEB-INF/pages/trades.jsp
		request.getRequestDispatcher("/WEB-INF/pages/trades.jsp").forward(request, response);
	
	}

}
package com.greatest.mvcapp.service;

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

import com.greatest.mvcapp.dao.BookDAO;
import com.greatest.mvcapp.dao.TradeDAO;
import com.greatest.mvcapp.dao.TradeItemDAO;
import com.greatest.mvcapp.dao.UserDAO;
import com.greatest.mvcapp.dao.impl.BookDAOImpl;
import com.greatest.mvcapp.dao.impl.TradeDAOImpl;
import com.greatest.mvcapp.dao.impl.TradeItemDAOImpl;
import com.greatest.mvcapp.dao.impl.UserDAOImpl;
import com.greatest.mvcapp.main.Trade;
import com.greatest.mvcapp.main.TradeItem;
import com.greatest.mvcapp.main.User;

public class UserService {
    private   UserDAO   userdao=new UserDAOImpl();
    public  User  getUserByUserName(String username){
    	return userdao.getUser(username);
    }
    private  TradeDAO  tradeDAO=new TradeDAOImpl();
    private TradeItemDAO  tradeItemDAO=new TradeItemDAOImpl();
    private  BookDAO   bookDAO=new BookDAOImpl();
    //关联关系
    
	public User getUserWithTrades(String username) {
		// 调用UserDao的方法获取User对象
	  User  user =userdao.getUser(username);
	  
	  if(user==null){
		  return null;
	  }
		//调用TradeDAO方法获取Trade的集合 把其装配为User的属性
	  int  userId=user.getUserId();
	  //调用TradeItemDAO的方法 获取每一个Trade中的TradeItem的集合
	  //并把其装配为Trade的属性    获取Trade集合  
	  Set<Trade>  trades=tradeDAO.getTradesWithUserId(userId);
	  
	  //防止空指针
	  if(trades!=null){
		  //
		  Iterator<Trade> tradeIt=trades.iterator();
		  //遍历Trade集合
		  while(tradeIt.hasNext()){
			  //有    对应的一条记录 
			  Trade trade=tradeIt.next();
			  //找tradeid 
			  int tradeId=trade.getTradeId();
			  //根据tradeid找TtradeItem 
			  Set<TradeItem> items=tradeItemDAO.getTradeItemsWithTradeId(tradeId);
			  if(items!=null){
				  //遍历TradeItem
				  for(TradeItem  item:items){
					  item.setBook(bookDAO.getBook(item.getBookId()));
				  }
				  //有交易记录放入到Trade中去 --》User的Trade集合 
				  if(items!=null && items.size()!=0){
					  trade.setItems(items);
				  }
				  
				  
			  }
			  //空有一个时间记录  没有购买商品的记录
			  if(items==null||items.size()==0){
				  tradeIt.remove();
			  }
			  
		  }
	  }
	  //用户有记录就放入到集合中去
		if(trades!=null && trades.size()!=0){
			user.setTrades(trades);
		}
		
		
		return user;
	}
            
}

 ThreadLocal:新技术  处理事物   存一次拿一次 

package com.greatest.test;
public  class ThreadLocalTest implements Runnable{
	            //绑定线程和变量  多线程对于对象的访问   +Filter一起处理事务
		ThreadLocal <String>	threadLocal=new ThreadLocal();
			 // String name;
			  int i=0;
	@Override
	public void run() {
		synchronized(this){
			for(;i<10;i++){
				//变量放入了线程的Map里面   值放在线程里面   ThreadLocal是作为keycunzaMap里
				threadLocal.set(Thread.currentThread().getName());//不是解决线程安全问题 的办法
				try {//线程安全问题
					Thread.sleep(10);
				} catch (InterruptedException e) { }                          //取值
				System.out.println(Thread.currentThread().getName()+" : " +threadLocal.get());
			}
		}
	}
	public static  void  main(String args[]){
		ThreadLocalTest  teet=new ThreadLocalTest();
		new Thread(teet,"AAA").start();
		new Thread(teet,"BBB").start();
	}
}
package com.greatest.mvcapp.web;

import java.sql.Connection;

public class ConnectionContext {
	//单例
	private ConnectionContext(){}
	
	private static ConnectionContext instance = new ConnectionContext();
	
	public static ConnectionContext getInstance() {
		return instance;
	}

	private ThreadLocal<Connection> connectionThreadLocal = 
			new ThreadLocal<>();
			
	public void bind(Connection connection){
		connectionThreadLocal.set(connection);
	}
	
	public Connection get(){
		return connectionThreadLocal.get();
	}
	
	public void remove(){
		connectionThreadLocal.remove();
	}
	
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值