网上书城项目
1.dao
1.1.OrderDao
public class OrderDao { /** * 添加一张定单 * @param order * @throws SQLException */ public void add(Order order) throws SQLException{ //1.sql语句 String sql = "insert into orders values(?,?,?,?,?,?,?,?)"; //2.参数 List<Object> params = new ArrayList<Object>(); params.add(order.getId()); params.add(order.getMoney()); params.add(order.getReceiverAddress()); params.add(order.getReceiverName()); params.add(order.getReceiverPhone()); params.add(order.getPaystate()); params.add(order.getOrdertime()); params.add(order.getUser().getId()); //3.执行 /*QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); qr.update(sql,params.toArray());*/ QueryRunner qr = new QueryRunner(); qr.update(ManagerThreadLocal.getConnection(),sql,params.toArray()); } /** * 通过用户id查找他的所有定单 * @param userid * @return * @throws SQLException */ public List<Order> findOrdersByUserId(String userid) throws SQLException{ String sql = "select * from orders where user_id = ?"; QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); return qr.query(sql, new BeanListHandler<Order>(Order.class),userid); } /** * 通过订单id查询Order数据 * @param orderId * @return * @throws SQLException * * 如果模型里模型,这个的话需要自己封装数据 */ public Order findOrderByOrderId(String orderId) throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); //1.查询Order表,把数据封装到Order对象 String sql1 = "select * from orders where id = ?"; Order order = qr.query(sql1, new BeanHandler<Order>(Order.class),orderId); //2.查询OrderItem表,把数据封装到Order的items属性 /* OrderItem item = new OrderItem(); item.setBuynum(buynum); item.setProduct(product);//商品的话,只需要名称和价格的字段 */ String sql2 = "SELECT o.*,p.name,p.price FROM orderitem o,products p WHERE o.product_id = p.id and order_id=?"; //自己封装数据 List<OrderItem> mItems = qr.query(sql2, new ResultSetHandler<List<OrderItem>>(){ @Override public List<OrderItem> handle(ResultSet rs) throws SQLException { //1.创建集合对象 List<OrderItem> items = new ArrayList<OrderItem>(); //2.遍历 while (rs.next()) { //创建OrderItem对象 OrderItem item = new OrderItem(); item.setBuynum(rs.getInt("buynum")); //创建Product对象 Product p = new Product(); p.setId(rs.getInt("product_id")); p.setName(rs.getString("name")); p.setPrice(rs.getDouble("price")); //把product放在item item.setProduct(p); //把item放在items去 items.add(item); } return items; } },orderId); //把items放在order里面 order.setItems(mItems); return order; } public static void main(String[] args) throws SQLException { Order order = new OrderDao().findOrderByOrderId("b2fe9800-cd21-40c8-aec6-614eedfddeec"); System.out.println(order); System.out.println("商品详情:"); for(OrderItem item:order.getItems()){ System.out.print("数量:" + item.getBuynum()); System.out.print(" 名称:" + item.getProduct().getName()); System.out.print(" 价格:" + item.getProduct().getPrice()); System.out.println(); } } }
1.2.OrderItemDao
public class OrderItemDao { /** * 添加定单详情 * @param items * @throws SQLException */ /*public void addOrderItems(List<OrderItem> items) throws SQLException{ String sql = "insert into orderitem (order_id,product_id,buynum) values(?,?,?)"; QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); for(OrderItem item : items){ qr.update(sql,item.getOrder().getId(),item.getProduct().getId(),item.getBuynum()); } }*/ /** * 性能更加批处理:因为只执行1条sql语句 * @param items * @throws SQLException */ public void addOrderItems(List<OrderItem> items) throws SQLException{ String sql = "insert into orderitem (order_id,product_id,buynum) values(?,?,?)"; //创建二维数组 /** * { * {a,b,c}, * {a,b,c} * } * * sql批处理: * insert into orderitems values('1234','1','2'),('1234','1','2'),('1234','1','2') * insert into orderitems values('1234','1','2') * insert into orderitems values('1234','1','2') * insert into orderitems values('1234','1','2') */ Object[][] params = new Object[items.size()][]; for(int i=0;i<items.size();i++){ OrderItem item = items.get(i); params[i] = new Object[]{item.getOrder().getId(),item.getProduct().getId(),item.getBuynum()}; } //批处理执行sql语句 //QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); //qr.batch(sql, params); QueryRunner qr = new QueryRunner(); qr.batch(ManagerThreadLocal.getConnection(),sql, params); } }
1.3.ProductDao
public class ProductDao { /** * 计算总记录数 * @param category 如果是null,是表的所有记录数 * @return * @throws SQLException */ public long count(String category) throws SQLException{ //1.定义记录数变量0 long count = 0; QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select count(*) from products where 1=1"; if(category != null && !"".equals(category)){ sql += " and category = ?"; count = (long) qr.query(sql, new ScalarHandler(),category); }else{ count = (long) qr.query(sql, new ScalarHandler()); } return count; } /** * * @param category 类型 * @param page 当前页 * @param pageSize 每页显示的条数 * @return * @throws SQLException */ public List<Product> findBooks(String category,int page,int pageSize) throws SQLException{ //拼接sql和参数 String sql = "select * from products where 1=1"; List<Object> params = new ArrayList<Object>(); if(category != null && !"".equals(category)){ sql += " and category = ?"; params.add(category); } sql += " limit ?,?"; int start = (page - 1) * pageSize; int length = pageSize; params.add(start); params.add(length); //执行 QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); return qr.query(sql, new BeanListHandler<Product>(Product.class),params.toArray()); } /** * 通过id查找商品 * @throws SQLException */ public Product findBook(String id) throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from products where id=?"; return qr.query(sql, new BeanHandler<Product>(Product.class),id); } /** * 测试下Dao * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { ProductDao dao = new ProductDao(); //long count = dao.count(null); String category = "计算机"; long count = dao.count(category); List<Product> books = dao.findBooks(category, 3, 4); for(Product b : books){ System.out.println(b); } System.out.println(count); } /** * 更新库存 * @param productId 商品ID * @param num 减的数量 * @throws SQLException */ public void updatePNum(int productId,int num) throws SQLException{ String sql = "update products set pnum = pnum - ? where id = ?"; /*QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); qr.update(sql,num,productId);*/ QueryRunner qr = new QueryRunner(); qr.update(ManagerThreadLocal.getConnection(),sql,num,productId); } }
1.4.UserDao
public class UserDao { /** * @param user * @throws SQLException */ public void addUser(User user) throws SQLException{ //1.QueryRunner QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); //2.sql String sql = "insert into user"; sql += " (username,PASSWORD,gender,email,telephone,introduce,activeCode,state,role,registTime)"; sql += " values(?,?,?,?,?,?,?,?,?,?)"; //3参数 /*Object[] prams = new Object[10]; prams[0]*/ List<Object> list = new ArrayList<Object>(); list.add(user.getUsername()); list.add(user.getPassword()); list.add(user.getGender()); list.add(user.getEmail()); list.add(user.getTelephone()); list.add(user.getIntroduce()); list.add(user.getActiveCode()); list.add(user.getState()); list.add(user.getRole()); list.add(user.getRegistTime()); //4.执行sql qr.update(sql, list.toArray()); } //通过激活码找到用户 public User findUserByActiveCode(String activeCode) throws SQLException{ //1.QueryRunner QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); //2.sql String sql = "select * from user where activeCode=?"; return qr.query(sql, new BeanHandler<User>(User.class),activeCode); } //通过激活码更新用户的状态 public void updateState(String activeCode) throws SQLException{ //1.QueryRunner QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); //2.sql String sql = "update user set state = 1 where activeCode=?"; qr.update(sql, activeCode); } /** * 更改用户信息 * @param user * @throws SQLException */ public void updateUser(User user) throws SQLException{ //1.QueryRunner QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); //2.sql String sql = "update user set password = ?,gender = ?,telephone = ? where id = ?"; qr.update(sql, user.getPassword(),user.getGender(),user.getTelephone(),user.getId()); } public User findUserByUsernameAndPassword(String username,String password) throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from user where username = ? and password = ?"; return qr.query(sql, new BeanHandler<User>(User.class),username,password); } public User findUserById(String id) throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from user where id = ?"; return qr.query(sql, new BeanHandler<User>(User.class),id); } }
2.exception
2.1.UserException
public class UserException extends Exception{ public UserException(String message) { super(message); // TODO Auto-generated constructor stub } }
3.model
4.service
4.1.OrderService
public class OrderService { /*public void createOrder(Order order,List<OrderItem> items){ }*/ /** * 添加定单业务方法 * @param order */ private OrderDao orderDao = new OrderDao(); private OrderItemDao orderItemDao = new OrderItemDao(); private ProductDao productDao = new ProductDao(); public void createOrder(Order order){ try { //开启事务 ManagerThreadLocal.beginTransaction(); //1.插入定单表 orderDao.add(order); //2插入定单详情表 orderItemDao.addOrderItems(order.getItems()); //3.减库存 for(OrderItem item : order.getItems()){ productDao.updatePNum(item.getProduct().getId(), item.getBuynum()); } //结束事务 ManagerThreadLocal.commitTransaction(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); //事务回滚 ManagerThreadLocal.rollbackTransaction(); } } public List<Order> findOrdersByUserId(String userid){ try { return orderDao.findOrdersByUserId(userid); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 通过订单id找Order * @param orderid * @return */ public Order findOrderByOrderId(String orderId){ try { return orderDao.findOrderByOrderId(orderId); } catch (SQLException e) { e.printStackTrace(); } return null; } }
4.2.ProductService
public class ProductService { ProductDao productDao = new ProductDao(); public PageResult<Product> findBooks(String category,int page){ try { //创建模型 PageResult<Product> pr = new PageResult<Product>(); //设置总记录数 long totalCount = productDao.count(category); pr.setTotalCount(totalCount); //设置总页数 int totalPage = (int) Math.ceil(totalCount * 1.0 / pr.getPageSize()); pr.setTotalPage(totalPage); //设置当前页数 pr.setCurrentPage(page); //设置数据list List<Product> list = productDao.findBooks(category, page, pr.getPageSize()); pr.setList(list); return pr; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return null; } } public Product findBook(String id){ try { return productDao.findBook(id); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
4.3.UserService
public class UserService { UserDao userDao = new UserDao(); public void register(User user)throws UserException{ try { //往数据库添加用户 userDao.addUser(user); /** * 项目发布时,连接要改成域名www.bookstore.com */ String link = "http://localhost:8080/bookstore/active?activeCode=" + user.getActiveCode(); String html = "<a href=\"" + link + "\">欢迎你注册网上书城帐号,请点击激活</a>"; System.out.println(html); //发送激活邮件 SendJMail.sendMail(user.getEmail(), html); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new UserException("注册失败,用户名重复"); } } /** * 激活用户 * 不要在try里面写throw,否则在catch */ public void activeUser(String activeCode)throws UserException { try { //1.查询激活码的用户是否存在 User user = userDao.findUserByActiveCode(activeCode); if(user == null){ throw new UserException("非法激活,用户不存在"); } if(user!=null && user.getState() == 1){ throw new UserException("用户已经激活过了..."); } userDao.updateState(activeCode); } catch (SQLException e) { throw new UserException("激活失败"); } } /*public void activeUser(String activeCode)throws UserException { User user = null; try { //1.查询激活码的用户是否存在 user = userDao.findUserByActiveCode(activeCode); } catch (Exception e) { throw new UserException("激活失败"); } if(user == null){ throw new UserException("非法激活,用户不存在"); } if(user!=null && user.getState() == 1){ throw new UserException("用户已经激活过了..."); } //2.激活用户 try { userDao.updateState(activeCode); } catch (SQLException e) { throw new UserException("激活失败"); } }*/ public User login(String username,String password)throws UserException{ try { //1.查询 User user = userDao.findUserByUsernameAndPassword(username, password); //2.判断 if(user == null){ throw new UserException("用户名或者密码不正确"); } if(user.getState() == 0){ throw new UserException("用户未激活,请先登录邮件进行激活"); } return user; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new UserException("登录失败"); } } public User findUserById(String id)throws UserException{ try { //1.查询 User user = userDao.findUserById(id); //2.判断 if(user == null){ throw new UserException("用户名不存在"); } return user; } catch (SQLException e) { e.printStackTrace(); throw new UserException("未知错误"); } } public void modifyUserInfo(User user)throws UserException{ try { userDao.updateUser(user); } catch (SQLException e) { throw new UserException("未知错误"); } } }
5.utils
5.1.C3P0Utils
public class C3P0Utils { private static DataSource ds = new ComboPooledDataSource(); /** * 返回数据源[连接池] * @return */ public static DataSource getDataSource(){ return ds; } /** * 返回一个连接 * @return */ public static Connection getConnection(){ try { return ds.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block throw new RuntimeException("服务器错误"); } } public static void closeAll(Connection conn,Statement statement,ResultSet resultSet){ if(resultSet != null){ try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } resultSet = null; } if(statement != null){ try { statement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } statement = null; } if(conn != null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); conn = null; } } } }
5.2.ManagerThreadLocal
public class ManagerThreadLocal { private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); public static Connection getConnection(){ try { Connection conn = tl.get(); //第一次是空 if(conn == null){ //从数据源取 conn = C3P0Utils.getConnection(); tl.set(conn); System.out.println("第一次从数据源获取connection对象:" + conn); }else{ //System.out.println("第n次从ThreadLocal获取connection对象"); } return conn; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 开启事务 */ public static void beginTransaction(){ try { getConnection().setAutoCommit(false); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 回滚事务 */ public static void rollbackTransaction(){ try { getConnection().rollback(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 提交事务 */ public static void commitTransaction(){ try { getConnection().commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 关闭连接 */ public static void close(){ try { getConnection().close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
5.3.SendJMail
public class SendJMail { static final String smtphost = "smtp.163.com";//smtp服务器地址 static final String from = "15989566325@163.com"; // 邮件发送人的邮件地址 static final String username = "15989566325@163.com"; // 发件人的邮件帐户 static final String password = "gyfitedu"; // 发件人的邮件密码 /** * * @param email * 接收人的邮箱地址 * @param emailMsg * 邮箱内容 * @return */ public static boolean sendMail(String email, String emailMsg) { String to = email; // 邮件接收人的邮件地址 // 定义Properties对象,设置环境信息 Properties props = System.getProperties(); // 设置邮件服务器的地址 props.setProperty("mail.smtp.host", smtphost); // 指定的smtp服务器 props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.transport.protocol", "smtp");// 设置发送邮件使用的协议 // 创建Session对象,session对象表示整个邮件的环境信息 Session session = Session.getInstance(props); // 设置输出调试信息 session.setDebug(true); try { // Message的实例对象表示一封电子邮件 MimeMessage message = new MimeMessage(session); // 设置发件人的地址 message.setFrom(new InternetAddress(from)); // 设置主题 message.setSubject("用户激活"); // 设置邮件的文本内容 // message.setText("Welcome to JavaMail World!"); message.setContent((emailMsg), "text/html;charset=utf-8"); // 设置附件 // message.setDataHandler(dh); // 从session的环境中获取发送邮件的对象 Transport transport = session.getTransport(); // 连接邮件服务器 transport.connect(smtphost, 25, username, password); // 设置收件人地址,并发送消息 transport.sendMessage(message, new Address[] { new InternetAddress(to) }); transport.close(); return true; } catch (MessagingException e) { e.printStackTrace(); return false; } } }
6.web
6.1.filter:MyEncodingFilter
@WebFilter("/*")
public class MyEncodingFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//解决响应的乱码
HttpServletResponse mResponse = (HttpServletResponse) response;
mResponse.setHeader("content-type", "text/html;charset=utf-8");
//1.POST解决请求参数乱码
HttpServletRequest hsr = (HttpServletRequest)request;
if(hsr.getMethod().equalsIgnoreCase("post")){
request.setCharacterEncoding("UTF-8");
}
chain.doFilter(request, response);
}
}
6.2.UserServlet
@WebServlet("/user")
public class UserServlet extends BaseServlet{
public void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//检验验证码
//获取表单的验证码
String checkcode_client = request.getParameter("checkcode");
String checkcode_session = (String) request.getSession().getAttribute("checkcode_session");
System.out.println("checkcode_client:" + checkcode_client);
System.out.println("checkcode_session:" + checkcode_session);
if(!checkcode_client.equals(checkcode_session)){
//客户端提交的验证和服务器不一样,跳回注册页面
request.setAttribute("checkcode_err", "验证不一至");
request.getRequestDispatcher("/register.jsp").forward(request, response);
return;
}
//1.把参数转成Bean,model
User user = new User();
try {
BeanUtils.populate(user, request.getParameterMap());
System.out.println(user);
//给无数据的属性赋值
user.setActiveCode(UUID.randomUUID().toString());//激活码
user.setRole("普通用户");//角色
user.setRegistTime(new Date());
System.out.println(user);
//2.注册
UserService us = new UserService();
us.register(user);
//3.返回结果
//3.1成功-进入成功界面
request.getRequestDispatcher("/registersuccess.jsp").forward(request, response);
}catch (UserException e) {
e.printStackTrace();
//3.2失败-回到注册页面
request.setAttribute("register_err", e.getMessage());
request.getRequestDispatcher("/register.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
System.out.println("参数转模型失败....");
}
}
public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
// TODO Auto-generated method stub
request.getSession().invalidate();
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
/**
* 处理登录
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//1.获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.调用service
UserService us = new UserService();
try {
User user = us.login(username, password);
//把user保存到session
request.getSession().setAttribute("user", user);
if("管理员".equals(user.getRole())){//进入后台界面
response.sendRedirect(request.getContextPath() + "/admin/login/home.jsp");
}else{//登录成功,回到首页index.jsp
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
} catch (UserException e) {
e.printStackTrace();
//登录失败,回到登录页面
request.setAttribute("login_msg", e.getMessage());
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
public void delete() throws ServletException, IOException {
}
}
6.3.ActiveServlet
@WebServlet("/active")
public class ActiveServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("content-type", "text/html;charset=utf-8");
//1.获取参数
String activecode = request.getParameter("activeCode");
//2.激活
UserService us = new UserService();
try {
us.activeUser(activecode);
response.getWriter().write("激活成功");
} catch (UserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response.getWriter().write(e.getMessage());
}
}
}
6.4.BaseServlet
public class BaseServlet extends HttpServlet{ /*@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //处理请求 //1.获取action参数 String action = request.getParameter("action"); //2.通过反射来调用方法 //2.1获取Class Class clz = this.getClass(); //2.2通过class获取方法 try { Method method = clz.getMethod(action, HttpServletRequest.class,HttpServletResponse.class); //2.3调用方法 method.invoke(this, request,response); } catch (NoSuchMethodException e) { e.printStackTrace(); response.getWriter().write("未知错误"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); response.getWriter().write("未知错误"); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); response.getWriter().write("未知错误"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); response.getWriter().write("未知错误"); } catch (InvocationTargetException e) { response.getWriter().write("未知错误"); } }*/ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("接收到请求:" + request.getMethod()); //1.获取action参数 String action = request.getParameter("action"); //2.通过反射来调用方法 //2.1获取Class Class clz = this.getClass(); System.out.println(clz); //2.2通过class获取方法 try { Method method = clz.getMethod(action, HttpServletRequest.class,HttpServletResponse.class); //2.3调用方法 method.invoke(this, request,response); } catch (NoSuchMethodException e) { e.printStackTrace(); response.getWriter().write("未知错误"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); response.getWriter().write("未知错误"); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); response.getWriter().write("未知错误"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); response.getWriter().write("未知错误"); } catch (InvocationTargetException e) { response.getWriter().write("未知错误"); } } }
6.5.AddCartServlet
/** * 添加购物车 * @author gyf * 难点:如何判断你当前买的书在购物车已经存在? * 技巧:重写Product的equals方法,根据id判断就可以 */ @WebServlet("/addCart") public class AddCartServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //1.获取id String id = request.getParameter("id"); //2.通过id查询数据库对应商品 ProductService ps = new ProductService(); Product p = ps.findBook(id); //3.把购买商品放在购物车Map //3.1先从session获取购物车数据[cart] Map<Product,Integer> cart = (Map<Product, Integer>) request.getSession().getAttribute("cart"); //3.2如果没有购物车数据,就创建一个map对象 if(cart == null){ cart = new HashMap<Product, Integer>(); cart.put(p, 1); }else{ //3.3 判断map里面是否有当前想购物商品 if(cart.containsKey(p)){ cart.put(p, cart.get(p) + 1); }else{ cart.put(p, 1); } } //4.打印购物车数据 for(Entry<Product, Integer> entry : cart.entrySet()){ System.out.println(entry.getKey() + "数量" + entry.getValue()); } //5.存session request.getSession().setAttribute("cart", cart); //6.响应客户端面 //继续购物,查看购物车 String a1 = "<a href=\"" + request.getContextPath()+"/showProductByPage\">继续购物</a>"; String a2 = " <a href=\"" + request.getContextPath()+"/cart.jsp\">查看购物车</a>"; response.getWriter().write(a1); response.getWriter().write(a2); } /* public static void main(String[] args) { //map Map<Product, Integer> cart = new HashMap<Product, Integer>(); ProductService ps = new ProductService(); Product p1 = ps.findBook("2"); cart.put(p1, 1); Product p2 = ps.findBook("2"); *//** * 默认情况下,key是根据地址来判断是否存在 * 所以要改比较规则,重写equals方法 *//* if(cart.containsKey(p2)){ System.out.println("p2已经在购物车存在"); }else{ System.out.println("p2在购物车不存在"); } }*/ }
6.6.ChangeNumServlet
@WebServlet("/changeNum")
public class ChangeNumServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取参数
String id = req.getParameter("id");//商品ID
String num = req.getParameter("num");//购物数量
//2.更新购物车数据
//2.1 通过id查找商品
ProductService ps = new ProductService();
Product p = ps.findBook(id);
//to-do.....
//判断购物的数据与库存的数量...
//2.2 通过商品更新session数据
@SuppressWarnings("unchecked")
Map<Product,Integer> cart = (Map<Product, Integer>) req.getSession().getAttribute("cart");
//替换
if(cart.containsKey(p)){//判断是否有这个商品
if("0".equals(num)){//移除商品
cart.remove(p);
}else{
cart.put(p, Integer.parseInt(num));
}
}
//重新保存到session
req.getSession().setAttribute("cart", cart);
//回到购物车页面
resp.sendRedirect(req.getContextPath() + "/cart.jsp");
}
}
6.7.CheckImgServlet
/** * 验证码生成程序 * */ @WebServlet("/imageCode") public class CheckImgServlet extends HttpServlet { // 集合中保存所有成语 private List<String> words = new ArrayList<String>(); @Override public void init() throws ServletException { // 初始化阶段,读取new_words.txt // web工程中读取 文件,必须使用绝对磁盘路径 String path = getServletContext().getRealPath("/WEB-INF/new_words.txt"); try { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8")); String line; while ((line = reader.readLine()) != null) { words.add(line); } reader.close(); } catch (IOException e) { e.printStackTrace(); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 禁止缓存 // response.setHeader("Cache-Control", "no-cache"); // response.setHeader("Pragma", "no-cache"); // response.setDateHeader("Expires", -1); int width = 120; int height = 30; // 步骤一 绘制一张内存中图片 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 步骤二 图片绘制背景颜色 ---通过绘图对象 Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔 // 绘制任何图形之前 都必须指定一个颜色 graphics.setColor(getRandColor(200, 250)); graphics.fillRect(0, 0, width, height); // 步骤三 绘制边框 graphics.setColor(Color.WHITE); graphics.drawRect(0, 0, width - 1, height - 1); // 步骤四 四个随机数字 Graphics2D graphics2d = (Graphics2D) graphics; // 设置输出字体 graphics2d.setFont(new Font("宋体", Font.BOLD, 18)); Random random = new Random();// 生成随机数 int index = random.nextInt(words.size()); String word = words.get(index);// 获得成语 // 定义x坐标 int x = 10; for (int i = 0; i < word.length(); i++) { // 随机颜色 graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110))); // 旋转 -30 --- 30度 int jiaodu = random.nextInt(60) - 30; // 换算弧度 double theta = jiaodu * Math.PI / 180; // 获得字母数字 char c = word.charAt(i); // 将c 输出到图片 graphics2d.rotate(theta, x, 20); graphics2d.drawString(String.valueOf(c), x, 20); graphics2d.rotate(-theta, x, 20); x += 30; } // 将验证码内容保存session request.getSession().setAttribute("checkcode_session", word); // 步骤五 绘制干扰线 graphics.setColor(getRandColor(160, 200)); int x1; int x2; int y1; int y2; for (int i = 0; i < 30; i++) { x1 = random.nextInt(width); x2 = random.nextInt(12); y1 = random.nextInt(height); y2 = random.nextInt(12); graphics.drawLine(x1, y1, x1 + x2, x2 + y2); } // 将上面图片输出到浏览器 ImageIO graphics.dispose();// 释放资源 ImageIO.write(bufferedImage, "jpg", response.getOutputStream()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * 取其某一范围的color * * @param fc * int 范围参数1 * @param bc * int 范围参数2 * @return Color */ private Color getRandColor(int fc, int bc) { // 取其随机颜色 Random random = new Random(); if (fc > 255) { fc = 255; } if (bc > 255) { bc = 255; } int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } }
6.8.CreateOrderServlet
/** * 生成定单 * @author gyf * */ @WebServlet("/createOrder") public class CreateOrderServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取session的user User user = (User) request.getSession().getAttribute("user"); if(user == null){ response.getWriter().write("非法访问..."); return; } //取购物车 Map<Product,Integer> cart = (Map<Product, Integer>) request.getSession().getAttribute("cart"); if(cart == null || cart.size() == 0){ response.getWriter().write("购物车没商品"); return; } //1.把数据封装好 Order order = new Order(); try { //1.1把请求参数封装成Order BeanUtils.populate(order, request.getParameterMap()); //1.2补全Order数据 order.setId(UUID.randomUUID().toString()); order.setOrdertime(new Date()); order.setUser(user); //1.3封装定单详情OrderItem【定单有n个商品】 List<OrderItem> items = new ArrayList<OrderItem>(); //取购物车 double totalPrice = 0; for(Entry<Product, Integer> entry : cart.entrySet()){ OrderItem item = new OrderItem(); //设置购物数量 item.setBuynum(entry.getValue()); //设置商品 item.setProduct(entry.getKey()); //设置定单 item.setOrder(order); totalPrice += entry.getKey().getPrice() * entry.getValue(); items.add(item); } //设置Order中items order.setItems(items); //1.4设置总价格 order.setMoney(totalPrice); //打印: System.out.println("---------------"); System.out.println("定单:"); System.out.println(order); System.out.println("定单中商品:"); for(OrderItem item : items){ System.out.println("商品名称:" + item.getProduct().getName() + " 数量:" + item.getBuynum()); } //System.out.println(order); //2.插入数据库 OrderService os = new OrderService(); os.createOrder(order); //3.定单成功(移除购物车数据) request.getSession().removeAttribute("cart"); //4.响应: response.getWriter().write("下单成功...."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
6.9.FindOrderByOrderIdServlet
/** * 定单详情的Servlet * @author gyf * */ @WebServlet("/findOrderByOrderId") public class FindOrderByOrderIdServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //1.获取orderId String orderId = request.getParameter("orderId"); //2.调用service OrderService os = new OrderService(); Order order = os.findOrderByOrderId(orderId); //3.转发到orderInfo.jsp【显示数据】 request.setAttribute("order", order); request.getRequestDispatcher("/orderInfo.jsp").forward(request, response); } }
6.10.FindUserByIdServlet
@WebServlet("/findUserById")
public class FindUserByIdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取参数
String userid = request.getParameter("id");
//2.从数据库查
UserService us = new UserService();
try {
User user = us.findUserById(userid);
/**
* el表达式取数据顺序:page,request,session,application
*/
//3.放在request
request.setAttribute("u", user);
//4.回到modifyuserinfo.jsp,显示数据
request.getRequestDispatcher("/modifyuserinfo.jsp").forward(request, response);
} catch (UserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response.getWriter().write(e.getMessage());
}
}
}
6.11.ModifyUserInfoServlet
@WebServlet("/modifyUserInfo")
public class ModifyUserInfoServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取表单的参数
User user = new User();
try {
BeanUtils.populate(user, request.getParameterMap());
System.out.println(user);
//2.修改
UserService us = new UserService();
us.modifyUserInfo(user);
//3.跳转
response.sendRedirect(request.getContextPath() + "/modifyUserInfoSuccess.jsp");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
response.getWriter().write(e.getMessage());
}
//2........
}
}
6.12.MyAccountServlet
@WebServlet("/myacount")
public class MyAcountServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = (User) request.getSession().getAttribute("user");
if(user != null){
//如果登录进入myAccount.jsp
response.sendRedirect(request.getContextPath() + "/myAccount.jsp");
}else{
//如果未登录,进入login.jsp
response.sendRedirect(request.getContextPath() +"/login.jsp");
}
}
}
6.13.OrderServlet
/** * 订单模块 * @author gyf * */ @WebServlet("/order") public class OrderServlet extends BaseServlet{ /** * 通过用户id查找他所属定单 * @param request * @param response * @throws ServletException * @throws IOException */ public void findOrderById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //1.获取用户的id User user = (User) request.getSession().getAttribute("user"); if(user == null){ response.getWriter().write("非法访问.."); return; } //2.调用service OrderService os = new OrderService(); List<Order> orders = os.findOrdersByUserId(user.getId()+""); //3.存数据在request request.setAttribute("orders", orders); request.getRequestDispatcher("/orderlist.jsp").forward(request, response); } }
6.14.ProductInfoServlet
@WebServlet("/productInfo")
public class ProductInfoservlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1.获取id
String id = request.getParameter("id");
//2.通过id查询数据库对应商品 dao/service
ProductService ps = new ProductService();
Product product = ps.findBook(id);
//3.把商品存在request,跳转到product_info.jsp进行数据展示
request.setAttribute("product", product);
request.getRequestDispatcher("/product_info.jsp").forward(request, response);
}
}
6.15.SettleAccountServlet
/** * 结帐的功能 * @author gyf * */ @WebServlet("/settleAccount") public class SettleAccountServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 判断当前浏览器是否有登录 User user = (User) req.getSession().getAttribute("user"); // 如果有登录进行定单页面 if(user != null){ resp.sendRedirect(req.getContextPath() + "/order.jsp"); }else{ // 如果没有登录,先进行登录 resp.sendRedirect(req.getContextPath() + "/login.jsp"); } } }
6.16.ShowProductByPageServlet
@WebServlet("/showProductByPage")
public class ShowProductByPageServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取参数
String category = request.getParameter("category");
String pageStr = request.getParameter("page");
int page = 1;
if(pageStr != null && !"".equals(pageStr)){
//把字符串转成int
page = Integer.parseInt(pageStr);
}
//2.调用service
ProductService ps = new ProductService();
PageResult<Product> pageResult = ps.findBooks(category, page);
//3.存在request
request.setAttribute("pageResult", pageResult);
request.setAttribute("category", category);
//4.跳转页面
request.getRequestDispatcher("/product_list.jsp").forward(request, response);
}
}
7.配置文件
7.1.c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore
</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 初始化连接池数量 -->
<property name="initialPoolSize">10</property>
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">60</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">25</property>
<!--连接池中保留的 最小连接数,Default:3 -->
<property name="minPoolSize">10</property>
</default-config>
</c3p0-config>
7.2.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>bookstore4</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>
</web-app>

浙公网安备 33010602011771号