分类数据展示
前台代码
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;
}
}