旅游网(4)--------------分类数据展示

分类数据展示

image-20210906184625311

前台代码

header.html

//查询分类数据
$.get("category/findAll",{},function (data){
    //{{cid:1,cname:国内游},{},{}}
    var lis = '<li class="nav-active"><a href="index.html">首页</a></li>';
    //遍历数组,拼接(所以li标签)字符串
    for (var i = 0; i < data.length; i++) {
        var li = '<li><a href="route_list.html">'+data[i].cname+'</a></li>';
        lis += li;
    }
    //拼接收藏排行榜的li
    lis += '<li><a href="favoriterank.html">收藏排行榜</a></li>'
    //将lis字符串,设置到ul的html内容中
    $("#category").html(lis);
});

后台代码

CategoryServlet
CategoryService
CategoryDao

CategoryServlet

@WebServlet("/category/*")
public class CategoryServlet extends BaseServlet {
    private CategoryService service = new CategoryServiceImpl();
    /**
     * 查询所有分类列表
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用service查询所有
        List<Category> cs = service.findAll();
        //序列化json返回
        writeValue(cs,response);
    }

}

CategoryService

public class CategoryServiceImpl implements CategoryService {
    private CategoryDao categoryDao = new CategoryDaoImpl();
    @Override
    public List<Category> findAll() {
        return categoryDao.findAll();
    }
}

CategoryDao

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>(Category.class));
    }
}

分类数据缓存优化

分类的数据在每一-次页面加载后都会重新请求数据库来加载,但是分类的数据不会经常产生变化,对数据库的压力比较大,所以可以使用redis来缓存这个数据。减小数据库压力

代码实现

Jedis工具类
/**
 * Jedis工具类
 */
public final class JedisUtil {
    private static JedisPool jedisPool;

    static {
        //读取配置文件
        InputStream is = JedisPool.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties pro = new Properties();
        //关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));


    }


    /**
     * 获取连接方法
     */
    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

    /**
     * 关闭Jedis
     */
    public static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }
}
具体代码

期望数据中存储的顺序就是将来展示的顺序

public class CategoryServiceImpl implements CategoryService {
    private CategoryDao categoryDao = new CategoryDaoImpl();
    @Override
    public List<Category> findAll() {
        //1.从redis中查询,需要获取Jedis客户端
        //获取Jedis客户端
        Jedis jedis = JedisUtil.getJedis();
        //因为想要获得的数据具有顺序,所以使用sortedset排序查询
        Set<String> category = jedis.zrange("category", 0, -1);

        //2.判断查询的集合是否为空
        List<Category> all = null;
        if (category == null || category.size() == 0){
            System.out.println("从数据库查询");
            //3.如果为空,需要从数据库查询,在将数据存入redis
            //从数据库查询
            all = categoryDao.findAll();
            //将集合数据存储到redis的名为category的key的sortedset里面去
            //sortedset里面的分数使用id
            for (int i = 0; i < all.size(); i++) {
                //cid分数,cname内容
                jedis.zadd("category",all.get(i).getCid(),all.get(i).getCname());
            }

        }else {
            System.out.println("从redis去查询");
            //访问的是category,而category又是set集合,但是序列化的时候拿到的是list集合
            //所以的把set集合里面的数据存储到list集合里面去,进行数据结构的统一
            all = new ArrayList<Category>();
            for(String name:category){
                Category c = new Category();
                c.setCname(name);
                all.add(c);
            }
        }

        //4.如果不为空,缓存有数据。
        return all;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值