🍀 分析
🍀 后台代码
后台代码
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 返回有序集中,指定区间内的成员。
其中成员的位置按分数值递增(从小到大)来排序。