五、分类数据展示功能

🍀 分析

🍀 后台代码

后台代码

BaseServlet增加抽取方法
    /**
     * 直接将传入的对象序列化为json 并且写回客户端
     *
     * @param obj
     */
    public void writeValue(Object obj, HttpServletResponse response) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        response.setContentType("application/json;charset=utf-8");
        mapper.writeValue(response.getOutputStream(), obj);
    }

    /**
     * 将传入的对象序列化为json 返回
     *
     * @param obj
     * @return
     */
    public String writeValueAsString(Object obj) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(obj);
    }

CategoryServlet

package cn.itcast.travel.web.servlet;

import cn.itcast.travel.domain.Category;
import cn.itcast.travel.service.CategoryService;
import cn.itcast.travel.service.impl.CategoryServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @Author wang
 * @Date 2022/5/24 20:46
 * @PackageName:${PACKAGE_NAME}
 * @ClassName: ${NAME}
 * @Description: TODO
 * @Version 1.0
 */
@WebServlet("/category/*")
public class CategoryServlet extends BaseServlet {

    private CategoryService service = new CategoryServiceImpl();

    /**
     * 查询所有
     *
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    public void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.调用service查询所有
        List<Category> list = service.findAll();

//        //2.序列化json 提取方法
//        ObjectMapper mapper = new ObjectMapper();
//        response.setContentType("application/json;charset=utf-8");
//        mapper.writeValue(response.getOutputStream(),list);
        writeValue(list, response);


    }
}

CategoryService

    //查询所有
    List<Category> findAll();

CategoryServiceImpl

public class CategoryServiceImpl implements CategoryService {

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

CategoryDao

public interface CategoryDao {
    //查询所有
    List<Category> findAll();
}

CategoryDaoImpl

public class CategoryDaoImpl implements CategoryDao {

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

    @Override
    public List<Category> findAll() {
        /**
         * 增
         * 删
         * 改update
         * 查 query
         * 查一条 queryForObject
         */


        //定义sql
        String sql = "select * from tab_category";
        //执行sql
        List<Category> list = template.query(sql, new BeanPropertyRowMapper<Category>(Category.class));

        return list;
    }
}

前台代码

🍀 前台代码

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

header.html

        //查询分类信息
        $.get("category/findAll", {}, function (data) {
            //[{cid:1,cname:国内游},{},{}]
            var lis = '<li class="nav-active"><a href="index.html">首页</a></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>';

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

        })
<ul id="category" class="nav">

测试效果图

🍀 缓存优化_分析

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

🍀 缓存优化_代码实现

//1.从redis中查询
    //获取jedis客户端
    //使用sortedset排序查询

//2. 判断查询的集合是否为空

//3. 如果为空 需要从数据库查询 再将数据存入redis
        //将数据存储到redis中的category的key

//4. 如果不为空 将set的数据存入list
list = new ArrayList<Category>();
for (String name : categorys) {
    Category category = new Category();
    category.setCname(name);
    list.add(category);
}

CategoryServiceImpl
public class CategoryServiceImpl implements CategoryService {

    private CategoryDao categoryDao = new CategoryDaoImpl();

    @Override
    public List<Category> findAll() {

        //1.从redis中查询
        //获取jedis客户端
        Jedis jedis = JedisUtil.getJedis();
        //可使用sortedset排序查询
        Set<String> categorys = jedis.zrange("category", 0, -1);

        List<Category> list = null;
        //2. 判断查询的集合是否为空
        if (categorys == null || categorys.size() == 0) {
            System.out.println("从数据库查询。。。。。");
            //3. 如果为空 需要从数据库查询 
            list = categoryDao.findAll();
            //将数据存储到redis中的category的key
            for (int i = 0; i < list.size(); i++) {
                jedis.zadd("category", list.get(i).getCid(), list.get(i).getCname());
            }


        } else {
            System.out.println("从缓存中查询。。。。。");
            //4. 如果不为空 将set的数据存入list
            list = new ArrayList<Category>();
            for (String name : categorys) {
                Category category = new Category();
                category.setCname(name);
                list.add(category);
            }
        }

        return list;
    }
}

期望数据中存储的顺序就是将来展示的顺序,使用redis的sortedset

测试效果图

细节注意

Redis Zrange 返回有序集中,指定区间内的成员。

其中成员的位置按分数值递增(从小到大)来排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个博客系统数据展示功能的测试用例表格: | 测试用例编号 | 测试场景描述 | 预期结果 | 实际结果 | 是否通过 | | --- | --- | --- | --- | --- | | TC001 | 点击博客列表页面,查看数据展示是否正常 | 页面展示所有博客的标题、作者、发布日期等信息 | 页面展示了所有博客的标题、作者、发布日期等信息 | 通过 | | TC002 | 点击博客详情页面,查看数据展示是否正常 | 页面展示博客的标题、作者、发布日期、正文等信息 | 页面展示了博客的标题、作者、发布日期、正文等信息 | 通过 | | TC003 | 点击作者页面,查看数据展示是否正常 | 页面展示该作者的所有博客的标题、发布日期等信息 | 页面展示了该作者的所有博客的标题、发布日期等信息 | 通过 | | TC004 | 点击标签页面,查看数据展示是否正常 | 页面展示该标签下的所有博客的标题、发布日期等信息 | 页面展示了该标签下的所有博客的标题、发布日期等信息 | 通过 | | TC005 | 点击分类页面,查看数据展示是否正常 | 页面展示分类下的所有博客的标题、发布日期等信息 | 页面展示了该分类下的所有博客的标题、发布日期等信息 | 通过 | | TC006 | 搜索博客并查看数据展示是否正常 | 页面展示符合搜索关键词的博客的标题、作者、发布日期等信息 | 页面展示了符合搜索关键词的博客的标题、作者、发布日期等信息 | 通过 |

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

妙趣生花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值