分类数据展示功能分析与实现

分析:

 

代码实现

后台代码实现:

BaseServlet类

将对象序列化为json方法进行抽取

复制代码
/**
     * 直接将传入的对象序列化json,并且写回客户端
     * @param obj
     */
    public void writeValue(Object obj,HttpServletResponse response) throws IOException {
        //2.序列化json返回
        ObjectMapper mapper = new ObjectMapper();
        //设置编码 response
        response.setContentType("application/json;charset=utf-8");
        mapper.writeValue(response.getOutputStream(),obj);//序列化json
    }

    /**
     *将传入的对象序列化为json,返回调用者
     * @param obj
     * @return
     */
    public String writeValueAsString(Object obj) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(obj);
    }
复制代码

CategoryDao

复制代码
package cn.itcast.travel.dao;

import cn.itcast.travel.domain.Category;

import java.util.List;

public interface CategoryDao {

    /**
     * 查询所有
     * @return
     */
    public List<Category> findAll();
}
复制代码

CategoryDaoImpl

复制代码
package cn.itcast.travel.dao.impl;

import cn.itcast.travel.dao.CategoryDao;
import cn.itcast.travel.domain.Category;
import cn.itcast.travel.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class CategoryDaoImpl implements CategoryDao {

    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public List<Category> findAll() {
        String sql = "select * from tab_category";
        return template.query(sql, new BeanPropertyRowMapper<>(Category.class));
    }
}
复制代码

CategoryService

复制代码
package cn.itcast.travel.service;

import cn.itcast.travel.domain.Category;

import java.util.List;

public interface CategoryService {

    //查询所有
    public List<Category> findAll();
}
复制代码

CategoryServiceImpl

复制代码
package cn.itcast.travel.service.impl;

import cn.itcast.travel.dao.CategoryDao;
import cn.itcast.travel.dao.impl.CategoryDaoImpl;
import cn.itcast.travel.domain.Category;
import cn.itcast.travel.service.CategoryService;

import java.util.List;

public class CategoryServiceImpl implements CategoryService {

    private CategoryDao categoryDao = new CategoryDaoImpl();

    @Override
    public List<Category> findAll() {
        return categoryDao.findAll();
    }


}
复制代码

前台代码

hader.html加载后,发送ajax请求,。请求category/fondAin

复制代码
<div class="navitem">
        <ul id="category"  class="nav">
<!--            <li class="nav-active"><a href="index.html">首页</a></li>-->
<!--            <li><a href="route_list.html">门票</a></li>-->
<!--            <li><a href="route_list.html">酒店</a></li>-->
<!--            <li><a href="route_list.html">香港车票</a></li>-->
<!--            <li><a href="route_list.html">出境游</a></li>-->
<!--            <li><a href="route_list.html">国内游</a></li>-->
<!--            <li><a href="route_list.html">港澳游</a></li>-->
<!--            <li><a href="route_list.html">抱团定制</a></li>-->
<!--            <li><a href="route_list.html">全球自由行</a></li>-->
<!--            <li><a href="favoriterank.html">收藏排行榜</a></li>-->
        </ul>
    </div>
复制代码
复制代码
<script>
    $(function () {
        //查询用户登录名字信息
       $.get("user/findOne",{},function (data) {
           //{uid:1,name:'李四'}
           var msg = "欢迎回来,"+data.name;
           $("#span_username").html(msg);
       });

        //查询分页数据
        $.get("category/findAll",{},function (data) {
            // [{cid,1},{cname,国内游},{}] 数组
            var lis = '<li class="nav-active"><a href="index.html">首页</a></li>';
            //遍历数组,拼接字符串(<li>)
            for (let i = 0; i < data.length; i++) {
                var li = '<li><a href="route_list.html">'+data[i].cname+'</a></li>';

                lis += li;
            }
            // 拼接收藏排行榜的li,<li><a href="favoriterank.html">收藏排行榜</a></li>
            lis+= '<li><a href="favoriterank.html">收藏排行榜</a></li>';

            //将list字符串,设置到ul的html内容中
            $("#category").html(lis);
        });
    });

</script>
复制代码

分类数据进行缓存优化-分析

分析发现,分类的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力

比较大,而且分类的数据不会经常产生变化,所有可以使用redis来缓存这个数据

 

 

 

代码实现

CategoryServiceImpl实现类:

复制代码
package cn.itcast.travel.service.impl;

import cn.itcast.travel.dao.CategoryDao;
import cn.itcast.travel.dao.impl.CategoryDaoImpl;
import cn.itcast.travel.domain.Category;
import cn.itcast.travel.service.CategoryService;
import cn.itcast.travel.util.JDBCUtils;
import cn.itcast.travel.util.JedisUtil;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class CategoryServiceImpl implements CategoryService {

    private CategoryDao categoryDao = new CategoryDaoImpl();

    @Override
    public List<Category> findAll() {
        //1. 从redis中查询
        //1.1获取jedis客户端
        Jedis jedis = JedisUtil.getJedis();//工具类
        //1.2可使用sortedset排序查询
        Set<String> categorys = jedis.zrange("category", 0, -1);//范围查询


        //2.判断查询的集合是否为空
        List<Category> cs = null;
        if (categorys == null || categorys.size() ==0){

            System.out.println("从数据库查询...");
            //3. 如果为空,需要从数据库查询,在将数据存入redis
            //3.1 从数据库查询
             cs = categoryDao.findAll();
             //3.2 将集合数据存储到redis中的 category的key
            for (int i = 0; i < cs.size(); i++) {

                jedis.zadd("category",cs.get(i).getCid(),cs.get(i).getCname());
            }
        }else {// 进行数据结构的统一 set集合中的缓存数据存储到list集合当中 (转换代码)
            System.out.println("从redis中查询...");
            //4.如果不为空,将set数据存入list
            cs = new ArrayList<Category>();
            for (String name : categorys) {
                Category category = new Category();
                category.setCname(name);
                cs.add(category);
            }

        }

        return cs;
    }
}
复制代码

 

posted @   夫君  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示