网上书城项目

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

 

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);
    }
    
}
View Code

 

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);
    }
}
View Code

 

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);
    }
    
    
    
}
View Code

 

2.exception

2.1.UserException

public class UserException extends Exception{

    public UserException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    
}
View Code

 

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;
    }
}
View Code

 

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;
    }
}
View Code

 

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("未知错误");
        }
    }
}
View Code

 

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;
            }
        }
    }
}
View Code

 

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

 

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;
        }
    }
}
View Code

 

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);
        
    }
}
View Code

 

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 {
        
    }
}
View Code

 

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

 

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("未知错误");
        }
    }
}
View Code

 

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 = "&nbsp;&nbsp;<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在购物车不存在");
        }
    }*/
}
View Code

 

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");
    }
}
View Code

 

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

}
View Code

 

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

 

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);
        
    }
    
}
View Code

 

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

 

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........
        
    }
}
View Code

 

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");
        }
        
        
    }
}
View Code

 

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);
    }
}
View Code

 

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);
    }
}
View Code

 

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

    }
}
View Code

 

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);
                
    
    }
}
View Code

 

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>
View Code

 

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>
View Code

 

posted @ 2019-07-11 11:52  惯看秋风  阅读(18)  评论(0)    收藏  举报