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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同学们,今天是主要做的是分类和商品模块,大家一定注意一个点:在敲代码之前养成一个习惯,把代码的实现思路和逻辑先用画图或伪代码的形式整理出来,再去写代码。

今日需要掌握的有:
  • 首页展示分类案例
  • 首页加载展示热门和最新商品
  • 登录功能完善


请同学们按照如上要求,总结今日所学。




12 个回复

倒序浏览
陈叶隆
新知识点:利用缓存技术优化程序(使用工具类都需要导包+配置文件)
// 读取配置文件
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){
                        // 缓存中没有数据
                        CategoryDao categoryDao = new CategoryDaoImpl();
                        list = categoryDao.findAll();
                        element = new Element("list",list);
                        cache.put(element);
                }else{
                        // 缓存中已经存在数据
                        list = (List<Category>)element.getObjectValue();
                }
                return list;

点评

发表于 2019-7-13 00:08
回复 使用道具 举报
陈强
商城实战二的一天;
这一天的内容,新的知识点很少,都是之前学过的,所以重在复习之前学过的和与之前写过的代码进行比较和改善;
首先今天讲到的一个新的知识点就是,使用缓存优化程序,我们使用到的是Ehcache,在业务层进行优化,而整体的一个思路就是先在缓存中进行查找,如果没有找到需要的信息,再到数据库中去查找,避免一些经常要使用到的信息每次都要去数据库中查找.
---整体使用起来其实就是三个步骤:
                ---使用类的加载器去读取配置文件
                ---从配置文件中获取对应的缓存区
                ---判断缓存区中是否有想要的信息
然后下面就是对以前知识的一个回顾和一些注意事项的整理:
--首先是,实体中如果有存在外键的,该字段可使用外键对应的主键的对象作为属性
--第二是,对分页工具条进行实现的时候,记住需要传过去三个参数:方法名,页数,cid(分类id)
--第三是,对商品浏览记录的一个实现,这个是部分自己有点模糊了,所以整理了一下这部分的一个思路:
                ---先获取所有的cookie       
                ---从cookie数组中去获取想要的cookie
                ---进行判断是否有找到cookie
                ---如果没有找到cookie,则说明还没有浏览过商品,没有浏览记录,直接new一个cookie,然后将浏览记录存到cookie中即可
                ---如果有找到cookie.就要在进行判断,是否cookie中有浏览过该商品的记录
                ---有浏览过,就将之前的记录删除,然后将新的记录addfirst
                ---如果没有浏览过商品.再进行判断cookie中的浏览记录是否超过显示的长度
                ---如果没有超过,直接addfirst
                ---如果超过了,就要将最后一条记录删除,然后再将该记录addfirst
                ---最后将新产生的浏览记录遍历,拼接成新的字符串,重新存到cookie中
回复 使用道具 举报
汪志阳:
首页展示分类案例:首页展示分类的案例是利用Ajax异步加载完成了.首先根据数据库category创建bean类,导包,创建对应的servlet,dao,service的接口以及实现类.
然后在menu.jsp中定义异步加载事件,跳转到新建的categoryServlet,调用业务层连接数据库查询信息,将返回的信息转换为json对象打印响应回调用的menu.jsp,绑定导航栏的id
遍历响应回的data,在导航栏上依次输出.但是每个页面上都有分类的信息,每次进行页面跳转的时候都需要去连接数据库进行查询:这样效率很低.后面我们又对程序进行了优化,引入了缓存技术,让程序优先从缓存中获取数据,
没有数据在连接数据库获取,并将信息保存在缓存中.
首页加载展示热门和最新商品:首先还是根据所需要求,根据数据库提供的表单信息,创建javaBean以及对应的servlet,dao,service的接口以及实现类.明确热门商品的显示是页面加载就实现的,所以我们在indexServlet进行后台数据的处理.
调用productservice业务层在后台查询数据库,主要关键字是limit,以及是否下架等信息进行数据库的查询,整体来说没有什么新的东西,将查询的数据保存在request中,然后在jsp中用js遍历所获取的商品信息.
登录功能完善:主要是登录的验证码以及自动登录,记住用户名.首先是检验验证码,主要是根据提供的验证码工具类和文本框输入的验证码的值进行判定,这一步需要在登录以前就完成校验.
自动登录的实现:首先判断自动登录文本框是否勾选了,将用户数据保存在cookie中,利用过滤器进行自动拦截,将session保存在session中意味着登录成功,过滤器中先进行session的判断再进行cookie数据的判断.
记住用户名案例:该案例也是在登录成功的基础上,首先勾选上复选框,然后保存在cookie中并且设置属性,在登录的jsp中请输入用户名中设置value="${cookie.username.value }完成记住用户名.

点评

发表于 2019-7-13 00:08
回复 使用道具 举报
谢洪彬:
商城实战项目(二)
功能一栏:
1.商品分类模块
2.分页显示商品
3.商品浏览记录
4.验证码,记住用户名,记住密码
1.商品分类模块
使用异步加载,当主页一加载就从数据库查询分类的数据,但是在实战中我们发现在进行注册,登录,首页的跳转时,都会对数据库进行操作来查询,这样频繁的操作数据库不好,这是我们就学习了一个新的技术缓存;
Ehcache缓存技术的使用:
1.导包
2.将ehcache.xml文件导入src下
3.在service中就可以判断,缓存中有就从缓存中取,缓存中没有我们就从数据库中取,在存入缓存,这样再次在访问时缓存中就有数据,这样我们就减少了对数据库的操作.
Service层代码实现:
//利用缓存技术优化对数据库的操作
                List<Category> list =null;
                //获取配置文件
                CacheManager cacheManager = CacheManager.create(CategoryServiceImpl.class.getClassLoader().getResourceAsStream("ehcache.xml"));
                //获取指定区域缓存
                Ehcache ehcache = cacheManager.getEhcache("categoryCache");
                Element element = ehcache.get("list");
                if (element==null) {
                        //缓存中没有数据
                        CategoryDao categoryDao= new CategoryDaoImpl();
                        list = categoryDao.findCategory();
                        element = new Element("list", list);
                        ehcache.put(element);
                        //System.out.println("数据库中拿数据");
                }else{
                        //缓存中存在数据
                        list = (List<Category>) element.getObjectValue();
                        //System.out.println("缓存中拿数据");
                }
                        return list;
        }

分页显示商品:
前台往后台传输的数据:
1.当前页(currPage)
2.该分类商品的分类id(cid)
3.要执行的方法(method=xxx)
后台往前台传输的数据:
封装pageBean 参数如下:
当前页
                private Integer currPage;
                每页显示记录
                private Integer PageSize;
                总记录数
                private Integer totalCount;
                总页数
                private Integer totalPage;
                Product数据
                private List<Product> list;
在Service层中需要获取到数据从什么位置开始查询:
公式:  (当前页数-1)*每页显示的记录数
SQL查询的关键字 limit ---参数一:开始查询的位置,参数二:查询几条记录
将pageBean对象返回
3商品浏览记录:
思路分析:
1.在点击商品链接或图片时会跳转到一个servlet中,我们就可以在这个Servlet中去实现这个功能;
2.在servlet中通过Cookie技术保存该商品的id,然后在jsp页面中在取出这个id查询商品对象来显示浏览记录
3.Servlet中Cookie的逻辑:
3.1.根据id取出cookie取出id,并判断是否为空
3.2为空则把id存到cookie中写浏览器,不为空则判断cookie的值转换为集合的长度满了没有,在判断包含没有,一系列的操作,最后再写回浏览器.
数组转LinkedList的方法
LinkedList<String> list = new LinkedList<String>(Arrays.asList(split));

点评

发表于 2019-7-13 00:09
回复 使用道具 举报
李思贤:商品模块
一:异步完成分类的加载.
1创建分类的表,插入数据
创建相关类
在menu.jsp找到分类标签 设好ID 设置一个页面加载事件,跳转到CategoryServlet中
        $(function(){
                $.post("${ pageContext.request.contextPath }/CateServlet",{"method":"findAll"},function(data){
                       
                });
        });
查询到所有分类List 要转为JSON,注意导包
JSONArray jsonArray = JSONArray.fromObject(list); 打印 输出
现在就可以JSP接收json了  添加json属性 遍历data,存入menuID中
$(function(){
                $.post("${ pageContext.request.contextPath }/CategoryServlet",{"method":"findAll"},function(data){
                        //alert(data);
                        $(data).each(function (i,n) {
                                $("#menuID").append("<li><a href='#'>"+n.cname+"</a></li>");
                        })
                },"json");
        });
分类完成了, 但因为我们每个页面都有导航条,所以每次跳转页面都要执行一次,这样会降低我们的效率,所以用 缓存 来做,我们把数据存入缓存中,从缓存获取,
这里我们用ehcache 缓存技术,  每次引入新技术,要导包.ehcache还有配置文件
缓存的代码一般加在业务层Service层
先拿到缓存,判断是否有list数据,没有的话,去数据库查,查完记得添加到缓存,如有有list数据,直接return.代码如下:
//使用缓存优化程序
                //获取到,直接返回,获取不到再去数据库查
                //用类的加载器读配置文件
                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;

Category实体类对象要实现序列号接口,这样才能序列化到硬盘.


二:首页上的最新商品,热门商品显示
我们一登录就可以看到这些商品,所以应该在IndexServlet中先查询了
这里是商品模块了,先建表...
完事再建各个类,外键的属性注意一下
// 外键
        private Category category;

在IndexServlet直接调用业务层找到两个List对象,存入request域中,
在Index.jsp中用JSTL和EL表达式来显示热门商品和最新商品.



三:显示某个分类下的商品.
点击某个分类,提交到Servlet,传递分类ID和当前页数1.
在异步加载连接处写路径:
${ pageContext.request.contextPath }/ProductServlet?cid="+n.cid+"&method=findByCid&currPag
e=1

编写PageBean类.

ProductServlet中接收cid 和 currpage
调用业务层,查询 返回一个pageBean对象存入域中 发送给Product_list.jsp
在业务层中要设置参数,有点麻烦:
PageBean<Product> pageBean = new PageBean<Product>();
                //设置参数
                //当前页数
                pageBean.setCurrPage(currPage);
                //每页记录数
                Integer pageSize = 12;
                pageBean.setPageSize(pageSize);
                //总记录数
                ProductDao productDao = new ProductDaoImpl();
                Integer totalCount = productDao.findCountByCid(cid);
                 pageBean.setTotalCount(totalCount);
                 //设置总页数
                 double tc = totalCount;
                 Double num = Math.ceil(tc/pageSize);
                pageBean.setTotalPage(num.intValue());
                //设置每页显示集合
                int begin = (currPage-1)*pageSize;
                List<Product> list = productDao.findPageByCid(cid,begin,pageSize);
                pageBean.setList(list);
return pageBean;       


分页工具条:几个代码逻辑实现
${param.cid}
<li <c:if test="${ pageBean.currPage == 1 }">class='disabled'</c:if>>



显示某个商品详情:
在商品列表页面上点击某个商品,提交Servlet 传递pid
调用业务层查找这个product信息,存入域中,再在product_info.jsp页面展示出
回复 使用道具 举报
黄进安:

商品分类模块:
1. 利用jsonarray将list转成json  注:对象或者map转成json用jsonobject

2. 使用缓存技术优化商品分类查询技术,一般应用在server业务层
        注:使用缓存数据保存的对象需要实现序列号接口,因为缓存技术在缓存到一定的数量后会序列化到硬盘
       
3. 在创建product实体类时,一对多的关系在表中是通过外键的方式来描述的,而在Java中是面向对象.即,用对象与对象的关系来约束
        eg.在product实体类中,把商品分类的实体对象也作为成员变量(替换表中的cid作为约束)
       
4. sql语句中限制查询个数的时候 limit= ?是错的 limit ? 是正确的
        limit 用法:  a. limit 5 查询5个数据
                                 b. limit 5,10 从第5个数据开始查询10个数据

5. 商品分类显示:
        a. 点击某一商品分类,提交servlet此分类商品的cid和当前页数(1)
        b. 分页查询servlet 后返回的为什么是javabeana?
                因为我们不只是返回此分类下的商品集合list,还有当前页数,每页显示个数,总记录数,总页数
        c. 在使用queryrunner查询个数的时候使用的是scalarhandler来接收,得到long类型参数
        d. 在jsp商品分类显示页面中,可以导入jstl的函数包,利用substring()方法对商品名进行切割显示
        e. 在商品分类页面想要获取cid可使用EL操作获取web参数 ${param.cid},相当于js中的 %request.getParameter("cid");% ,
                因为servlet使用的是请求转发,jsp和servlet使用的是同一个request请求,所以都含有页面表单提交的cid
        d. 对于bootstrap中的disabled样式,好像并没有对a标签的默认行为进行处理,这可能就是它虽然设置了disabled样式但仍然可触发的原因。
                (异常:就是分页<li class="disabled"> 任然可以触发标签下的超链接标签<a>)
                解决方法:
                1、添加Css阻止a标签的触发
                .disabled{
                        pointer-events:none;
                }
                2、JQ
                 $(".disabled").click(function (event) {
              event.preventDefault();        
         });
6. 商品自动登入利用的是cookie技术保存用户名和密码+过滤器技术在访问项目下的所有页面进行相关判断操作
7. 记住用户名也是利用cookie技术保存用户名
8. 商品浏览记录也是利用cookie技术,在点击某个商品,根据商品id,触发servlet中根据商品id查询商品详情的方法(findByPid()),对保存商品浏览记录的cookie进行更新
        业务逻辑:

回复 使用道具 举报
刘文峰
分类商品显示:商品分页的案例以前有做过,分类只是需要多传入一个商品分类编号,多增加一个查询商品的条件,其余并没有太大区别.
热门商品和最新商品显示:为了用户的浏览体验,商品显示可以用异步(ajax)来完成.在查询商品时需要对商品进行排序,然后用limit关键字取出部分商品,封装成集合,可以用json来传输数据.
登录功能完善:
验证码:后台生成的验证码保存到session域中,在登录器先对验证码进行校验,校验验证码时将数据取出并和前台传来的数据进行判断是否相同,不同则不进行登录操作.
自动登录:自动登录就是通过获得自动登录复选框的值来判断是否需要自动登录;如果需要则在登录成功时将数据添加到cookie中.
1.获得session,判断session里是否有登录信息: 有则说明登录了,直接放行,因为在servlet中,只有登陆成功时才将信息保存到session中;
2.如果没有则判断Cookie里有没有信息,如果没有说明不需要自动登录功能,直接放行,因为只有勾选了自动登录复选框才会加cookie;
3.Cookie里有信息说明需要自动登录,将里面的信息取出来到数据库里进行查询,如果没有相同记录则说明信息变更过,直接放行;
4.数据库里有相同记录则将信息保存到session中,然后放行,此时页面上就可以显示你的信息了.
回复 使用道具 举报
张裕
商城实战第二天
新的东西不多 都是之前老的东西套在了一起 代码量有点大 有点吃力
今天完成了 分类列表查询 缓存存储查询数据 首页商品显示 分类商品显示 单个商品查询 自动登录 记住用户名 浏览记录
新技术 缓存技术
        可以通过配置文件的方式获取自定义名称的缓冲区 从区域中存取数据

分类列表的查询可以使用缓存技术减少访问数据库的次数
自动登录功能勾选后 获取用户名和密码 存到持久性的cookie中 编写一个过滤器 在过滤器中进行二次校验
判断记住用户名的勾选状态 添加持久性cookie value为username 在jsp页面中使用EL表达式设置用户名的value值

浏览记录 点击一个商品后 在查询数据的同时添加到浏览记录中 记录存储到持久性的Cookie中
        编写一个过滤器 获取记录 存入session中 在jsp中获取遍历

清除浏览记录
        点击超链接 执行Servlet中的方法 清除指定的session和持久性的浏览记录cookie 重定向页面
回复 使用道具 举报
许剑鸿 webDay27商城实战二总结

分类模块:要求导航栏显示具体的商品分类
1、创建分类的表Category和 相关的类  javaBean中的Category要实现序列化,方便后面往硬盘上面写
2、首页上添加事件:使用异步的方式完成分类的加载。并完成数据的查询显示代码的实现
3、由于很多页面都要求一进页面就加载分类显示,查询数据库次数太多,所以使用一个缓存技术:EHCache。就可以实现每次更换页面的时候,优先查询缓存中是否存在,如果没有就从数据库查询。



商品模块:        首页上最新商品和热门商品的显示(9个就可以了,不用全部)      点击某个分类的时候,显示这个分类下的所有商品

1、创建商品表Product,并放一些数据。并建立Product的javaBean      javaBean中要有一个Category表的属性,作为外键使用
2、首页显示最新和热门
3、点击某个分类,显示具体的商品(分页显示)
        1、点击分类的时候,传递一个分类的cid和一个分页的currpage=1过去
        2、创建分页的JavaBean:       
        3、在ProductServlet中接收参数,并进行处理,并将结果存到request域中
        4、根据request域中的数据,在product_list.jsp中进行处理并显示。完成操作
4、修改一下bootstrap中的分页条
5、显示某个商品详情
        1、在商品列表页面上点击【某个商品】提交到Servlet:传递一个pid.
        2、在product_info.jsp中根据ProductServlet传递过来的数据进行显示
6、登录的验证码
7、自动登录(使用cookie完成自动登录)
8、记住用户名(使用cookie)
9、商品浏览记录的显示(使用cookie)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马