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();
}
}