A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2020-1-8 21:46 编辑

【济南中心】JavaEE就业班同步笔记第一阶段:
JavaWeb之商城案例Part01
1  网上商城的实战的案例:
1.1  需求:
1.2  数据库设计:

1.3  网上商城用户模块的代码实现:(前台)
1.3.1  编写一个通用的Servlet:
传统方式的开发一个请求对应一个Servlet:这样的话会导致一个模块的Servlet过多,导致整个项目的Servlet都会很多.能不能做一个处理?让一个模块致用一个Servlet处理请求.
注册:http://localhost:8080/store_2.0/UserServlet?method=regist
登录:http://localhost:8080/store_2.0/UserServlet?method=login
激活:http://localhost:8080/store_2.0/UserServlet?method=active
商品查询所有:http://localhost:8080/store_2.0/ProductServlet?method=findAll
商品查询某个:http://localhost:8080/store_2.0/ProductServlet?method=findById
传统:
[Java] 纯文本查看 复制代码
public class UserServlet extends HttpServlet{
    public void service(HttpServletRequest req,HttpServletResponse resp){
        // 接收参数:
        String methodName = request.getParameter(“method”);
        if(“regist”.equals(methodName)){
            regist(req,resp);
        }else if(“login”.equals(methodName)){
            login(req,resp);
       }
   }
   public void regist(HttpServletRequest req,HttpServletResponse resp){
   }
   public void login(HttpServletRequest req,HttpServletResponse resp){
   }
}


[Java] 纯文本查看 复制代码
public class ProductServlet extends HttpServlet{
    public void service(HttpServletRequest req,HttpServletResponse resp){
        // 接收参数:
        String methodName = request.getParameter(“method”);
        if(“findAll”.equals(methodName)){
            findAll(req,resp);
        }else if(“findById”.equals(methodName)){
            findById(req,resp);
       }
   }
   public void findAll(HttpServletRequest req,HttpServletResponse resp){
   }
   public void findById(HttpServletRequest req,HttpServletResponse resp){
   }
}

反射:
[Java] 纯文本查看 复制代码
public class BaseServlet extends HttpServlet{
     public void service(HttpServletRequest req,HttpServletResponse resp){
          // http://localhost:8080/store_2.0/UserServlet?method=regist
          // http://localhost:8080/store_2.0/ProductServlet?method=findAll
          String methodName = request.getParameter(“method”);
          // 获得Class:
          Class clazz = this.getClass();
          Method method = clazz.getMethod(methodName,HttpServletRequest.class,HttpSerlvetResponse.class);
          String path = (String)method.invoke(this,req,resp);
          if(path != null){
              req.getRequestDispatcher(path).forward(req,resp);
          }
     }
}


[Java] 纯文本查看 复制代码
public class UserServlet extends BaseServlet {
   public String regist(HttpServletRequest req,HttpServletResponse resp){    
         return “/login.jsp”;
   }
   public String login(HttpServletRequest req,HttpServletResponse resp){
         return “/index.jsp”;
   }
}


[Java] 纯文本查看 复制代码
public class ProductServlet extends BaseServlet{
   public String findAll(HttpServletRequest req,HttpServletResponse resp){
       
   }
   public String findById(HttpServletRequest req,HttpServletResponse resp){
   }
}

1.3.2 搭建开发环境:
【步骤一】:引入开发jar包
   * mysql           1
   * c3p0             1
   * dbutils          1
   * beanutils       2
   * jstl                 2
   * mail              1
   * fileupload     2
【步骤二】:创建包结构:
   
【步骤三】:引入工具类和配置文件:
【步骤四】:编写通用的Servlet:
1.3.3 用户模块的代码实现:
【创建数据库和表】:
[SQL] 纯文本查看 复制代码
CREATE TABLE `user` (
  `uid` varchar(32) NOT NULL,
  `username` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `email` varchar(30) DEFAULT NULL,
  `telephone` varchar(20) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `sex` varchar(10) DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  `code` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【引入页面】
【创建相关类】
【用户的注册功能】
在首页上点击【注册】链接:
跳转到注册页面:
在注册页面中输入相关的信息:
    * 进行表单校验:JQuery实现校验.
    * 异步用户名校验:
点击【注册】按钮:提交到Servlet:
在Servlet中调用业务层调用Dao完成保存操作,同时发送一封激活邮件:
【发送激活邮件】
  • 邮件发送的相关的概念:
* 邮箱服务器        :如果一台电脑安装了邮箱服务器的软件,这台电脑称为是邮箱服务器.
* 电子邮箱           :其实就是邮箱服务器上的一块空间,通过电子邮箱账号访问这块空间的数据.
* 收发邮件的协议    :
    * 发邮件:SMTP协议:SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 25默认端口号
    * 收邮件:POP3协议:POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员。默认端口是110
    * 收邮件:IMAP协议:IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。
* 收发邮件的过程:
  
【搭建邮箱服务器】
  • 安装易邮邮箱服务器:
  • 配置易邮邮箱服务器:
* 修改域名:

* 注册账号:
  • 客户端收发邮件的软件:
* OutLook    :微软,收费的.
* FoxMail    :免费的.
  • 安装收邮件客户端软件:
【邮件发送的代码】
【激活用户】
在邮箱中点击【激活连接】
提交到Servlet:
    * 根据激活码查询用户:
        * 修改用户状态:
        * 将激活码置为null:
页面跳转:
【用户登录】
在首页上点击【登录】链接.
跳转到登录页面:
在登录页面中输入信息:
点击【登录】按钮:
【用户退出】
在首页上点击【退出】链接
提交到Servlet:销毁session.
页面跳转:

2  前台分类模块的功能:
2.1  需求:

2.2  分析:
使用异步的方式完成分类的加载:
2.3 代码实现:
在首页上添加事件:
[JavaScript] 纯文本查看 复制代码
$(function(){
    异步加载分类的数据;
});


创建分类的表:
[SQL] 纯文本查看 复制代码
CREATE TABLE `category` (
  `cid` varchar(32) NOT NULL,
  `cname` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建分类的相关的类:
相关代码的实现:异步加载分类,显示JSON数据:
每个页面上都由分类的信息,每次进行页面跳转的时候都需要去连接数据库进行查询:这样效率很低.需要优化当前程序!!!
* 将数据存入到缓存中,每次获取的时候从缓存中进行获取.
    * EHCache    :Hibernate框架 二级缓存使用
    * Memcached
    * Redis
* 使用缓存的技术优化程序!!!
    * 引入ehcache的包:
    * 代码实现:
   
[Java] 纯文本查看 复制代码
@Override
    public List<Category> findAll()throws SQLException {
        /*CategoryDao categoryDao = new CategoryDaoImpl();
        return categoryDao.findAll();*/
        /**
         * 使用缓存优化程序,先从缓存中获取数据
         *   * 获取到:直接返回
         *   * 获取不到:查询数据库,将记录存入到缓存中.
         */
        // 读取配置文件
        CacheManager cacheManager = CacheManager.create(CategoryServiceImpl.class.getClassLoader().getResourceAsStream("ehcache.xml"));
        // 从配置文件中获取名称为categoryCache缓存区
        Cache cache = cacheManager.getCache("categoryCache");
        // 判断缓存中是否有list集合:
        Element element = cache.get("list");
        List<Category> list = null;
        if(element == null){
            // 缓存中没有数据
            System.out.println("缓存中没有数据 ,查询数据库=====");
           
            CategoryDao categoryDao = new CategoryDaoImpl();
            list = categoryDao.findAll();
            element = new Element("list",list);
            cache.put(element);
        }else{
            // 缓存中已经存在数据
            System.out.println("缓存中有数据 ,没有查询数据库=====");
            list = (List<Category>)element.getObjectValue();
           
        }
        return list;
    }


3  前台商品信息的显示:
3.1  首页上最新商品和热门商品的显示:
创建商品表
[SQL] 纯文本查看 复制代码
CREATE TABLE `product` (
  `pid` varchar(32) NOT NULL,
  `pname` varchar(50) DEFAULT NULL,
  `market_price` double DEFAULT NULL,
  `shop_price` double DEFAULT NULL,
  `pimage` varchar(200) DEFAULT NULL,
  `pdate` date DEFAULT NULL,
  `is_hot` int(11) DEFAULT NULL,
  `pdesc` varchar(255) DEFAULT NULL,
  `pflag` int(11) DEFAULT NULL,
  `cid` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`pid`),
  KEY `sfk_0001` (`cid`),
  CONSTRAINT `sfk_0001` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建相关的类:
在IndexServlet调用业务层完成查询即可:
3.2  显示某个分类的商品:
在首页上点击某个分类:
提交到Servlet:传递分类的ID,当前页数.
3.3  显示某个商品详情:
在商品列表页面上点击【某个商品】
提交到Servlet:传递一个pid.
3.4  登录的验证码及自动登录及记住用户:
验证码---session、jq动态绑定
自动登录—--cookie+filter
记住用户名---cookie

16 个回复

倒序浏览

回帖奖励 +1

感谢分享
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报

回帖奖励 +1

感谢楼主分享!
回复 使用道具 举报

回帖奖励 +1

666666666666666
回复 使用道具 举报

回帖奖励 +1

感谢分享
回复 使用道具 举报

回帖奖励 +1

为啥我按照视频做注册时,注册页面出生日期,我的显示是文本输入框,视频里是可选择的组件,这个是为啥呢?我把项目导入进来,jquery.js就报错,怎么办
回复 使用道具 举报
Cerol 中级黑马 2017-4-12 19:05:45
7#

回帖奖励 +1

力挺楼主,支持你   666
回复 使用道具 举报

回帖奖励 +1

感谢分享。
回复 使用道具 举报

回帖奖励 +1

感谢分享
回复 使用道具 举报
mmp 初级黑马 2017-4-22 10:00:06
10#

回帖奖励 +1

感谢分享
回复 使用道具 举报

回帖奖励 +1

明天学这个 看看
回复 使用道具 举报

回帖奖励 +1

谁有商城的原型呀,我也在做这个小项目
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
感谢分享!!!~~
回复 使用道具 举报
请问哪里有源码
回复 使用道具 举报
看看
回复 使用道具 举报
666666666666666
回复 使用道具 举报
xy1008 中级黑马 2017-11-27 22:27:26
17#
666666666666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马