案例需求:
1. 提供index.html页面,页面中有一个下拉列表,里面存储的是一些爱好选项
2. 当页面加载完成后,发送ajax请求,加载所有爱好到这个下拉列表里面
1. 创建数据库,并且创建表,在其中存储爱好的一些选项
CREATE DATABASE hobby; -- 创建数据库
USE hobby; -- 使用数据库
CREATE TABLE hobbys( -- 创建表
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL
);
-- 插入数据
INSERT INTO hobbys VALUES(NULL,'篮球');
INSERT INTO hobbys VALUES(NULL,'足球');
INSERT INTO hobbys VALUES(NULL,'乒乓球');
INSERT INTO hobbys VALUES(NULL,'电影');
2. 项目结构图如下
druid.properties是配置数据库方面的连接参数
jedis.properties是配置redis缓存的连接参数
没有使用redis缓存的方式,每次都得查数据库,用户体验不好
package zr.web.servlet;
import zr.service.HobbyService;
import zr.service.Impl.HobbyServiceImpl;
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;
@WebServlet("/findHobbyServlet")
public class FindHobbyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 调用service查询
HobbyService service=new HobbyServiceImpl();
List<Hobby> hobbyList = service.findAll();
// 将数据类型转化为json
ObjectMapper mapper=new ObjectMapper();
String hobbys = mapper.writeValueAsString(hobbyList);
System.out.println(hobbys);
// 将结果响应回原来页面
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(hobbys);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
在service层调用dao层的函数,在dao层调用JdbcTemplate对象,调用其查询方法,将查询结果的List集合返回,在FindHobbyServlet里面调用ObjectMapper对象的方法,将list转化为字符串,然后将返回的字符串写出到输出流中
使用redis缓存,只需要第一次查询数据库,将返回的list集合转化为String类型,然后将该字符串存入到redis数据库中,然后返回这个字符串,再次访问时直接从redis数据库获取即可
package zr.web.servlet;
import zr.service.HobbyService;
import zr.service.Impl.HobbyServiceImpl;
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;
@WebServlet("/findHobbyServlet")
public class FindHobbyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 调用service查询
HobbyService service=new HobbyServiceImpl();
String hobbys = service.findJson();
System.out.println(hobbys);
// 将结果响应回原来页面
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(hobbys);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
在service层
@Override
public String findJson() {
// 先从redis中查询数据
//获取redis连接
Jedis jedis = JedisPoolUtils.getJedis();
String hobby = jedis.get("hobby");
// 判断hobby数据是否为null
if (hobby==null||hobby.length()==0){
// redis没有数据,应该从数据库里面查询
List<Hobby> list = dao.findAll();
// 将list序列化为json
ObjectMapper mapper = new ObjectMapper();
try {
hobby = mapper.writeValueAsString(list);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//将json数据存入redis中
jedis.set("hobby",hobby);
jedis.close();
}
return hobby;
}
在test.jsp页面直接通过jquery获取json,将其每一个值追加到select选择框即可
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function () {
// 发送ajax请求,加载所有省份数据
$.get("findHobbyServlet",{},function (data) {
// 查询findHobbyServlet的输出json为
// [{"id":1,"name":"篮球"},{"id":2,"name":"足球"},{"id":3,"name":"乒乓球"},{"id":4,"name":"电影"}]
// 获取select
var hobbys=$("#hobbys");
// 遍历json
$(data).each(function () {
// 创建option
var option="<option name='"+this.id+"'>"+this.name+"</option>";
// 调用select的append追加option
hobbys.append(option);
});
});
});
</script>
</head>
<body>
<select id="hobbys">
<option>/选择</option>
</select>
</body>
</html>
注意:使用redis缓存一些不经常发生变化的数据
数据库的数据一旦发生改变,则需要更新缓存。
1. 数据库表如果执行增删该的相关操作,则需要将redis的缓存数据再次存入
2. 如果不注意这方面的问题的话,会出现数据库表数据发生变化,但是本地的缓存却没有发生变化,这样导致数据错误
3. 在service对应的增删改方法中,将redis数据删除