redis配合ajax实现显示下拉列表省份

需求分析

1. 提供:index.html页面,页面中有一个省份 下拉列表
2. 页面加载完成后 发送ajax请求,加载所有省份

搭建环境

新建数据库

导入jar和配置文件以及各种包

druid连接池配置文件

1
2
3
4
5
6
7
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day23
username=root
password=njdxrjgc7777777.
initialSize=5
maxActive=10
maxWait=3000

jedis.properties配置redis文件

1
2
3
4
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

dao层及daoImpl层实现

dao层

1
2
3
public interface ProvinceDao {
public List<Province> findAll();
}

daoimpl层

1
2
3
4
5
6
7
8
9
10
11
12
public class ProvinceDaoImpl implements ProvinceDao {
//1.获取数据库连接池对象
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Province> findAll() {
//1.定义sql
String sql="select * from province";
//2.执行sql
List<Province> list=template.query(sql,new BeanPropertyRowMapper<Province>(Province.class));
return list;
}
}

domain层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Province {
private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

service和servlet层

service层

1
2
3
4
5
6
public interface ProvinceService {
public List<Province> findAll();

public String findAllJson() throws JsonProcessingException;

}

service实现层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ProvinceServiceImpl implements ProvinceService {
//面向接口编程
private ProvinceDao dao=new ProvinceDaoImpl();

@Override
public List<Province> findAll() {
//调用dao实现
return dao.findAll();
}

//使用redis缓存
@Override
public String findAllJson() throws JsonProcessingException {
//1.先从redis中查询数据
//1.1先获取redis客户端连接
Jedis jedis = JedisPoolUtils.getJedis(); //调用写好的数据池工具类
String province_json = jedis.get("province"); //获取key值为province

//2.判断json数据是否为null
if(province_json==null||province_json.length()==0) //redis里面没有数据
{
//2.1从数据中查询
List<Province> ps = dao.findAll();
//2.将list序列化为json
ObjectMapper mapper=new ObjectMapper();
province_json=mapper.writeValueAsString(ps);
//2.3将json数据存入redis
jedis.set("province",province_json); //获取key值为province
//2.4归还连接
jedis.close();
}
return province_json;
}

}

servlet层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@WebServlet("/provinceServlet")   //配置路径 名字改为小写
public class ProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用service
ProvinceService service=new ProvinceServiceImpl();
String json=service.findAllJson();
System.out.println(json);

//3.响应结果
response.setContentType("application/json;charset=utf-8"); //json中文乱码
response.getWriter().write(json); //直接响应给客户端
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}

redis数据池工具类和前端页面

redis数据池工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
1.加载配置文件
2.配置连接池的参数
3.提供获取连接的方法
*/
public class JedisPoolUtils {
private static JedisPool jedisPool;
static{
//读取配置文件
InputStream is=JedisPoolUtils.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();
}

}

前端index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function(){
//发送ajax请求 加载所有省份数据
$.get("provinceServlet",{},function (data) {
//[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
//1.获取select
var province=$("#province");
//2.遍历json数组
$(data).each(function () {
//3.创建<option>
var option="<option name='"+this.id+"'>"+this.name+"</option>"; //相当于<option name=‘1’>北京<option>需要动态变化 ‘’拼接字符串
//4.使用select的append追加option
province.append(option);
});
});
});
</script>
</head>
<body>

<select id="province">
<option>--请选择省份--</option>
</select>

</body>
</html>

总结

###注意

1.使用redis缓存比较适合:一些不经常发生变化的数据。
2.数据库的数据一旦发生改变,则需要更新缓存。
3.数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
4.在service对应的增删改方法中,将redis数据删除。

###使用心得

发现redis就是在第一次还是需要查数据库,然后service要给redis缓存起来,但是第二次开始已经从缓存redis去取。这种就比较适合于数据变动不大的情况,如果增删改三种操作的话就不太适合了。而且这个小demo是把处理放在service层去做(redis在此)。

###ajax序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//1.先从redis中查询数据
//1.1先获取redis客户端连接
Jedis jedis = JedisPoolUtils.getJedis(); //调用写好的数据池工具类
String province_json = jedis.get("province"); //获取key值为province

//2.判断json数据是否为null
if(province_json==null||province_json.length()==0) //redis里面没有数据
{
//2.1从数据中查询
List<Province> ps = dao.findAll();
//2.将list序列化为json
ObjectMapper mapper=new ObjectMapper(); //调用jar里面的ObjectMapper类
province_json=mapper.writeValueAsString(ps); //调用方法直接转为json
//2.3将json数据存入redis
jedis.set("province",province_json); //获取key值为province
//2.4归还连接
jedis.close();
}

执行demo(我用的tomcat7.0版本一定要在web.xml里面改成2.5)

打开服务器–客户端–查询


×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 需求分析
  2. 2. 搭建环境
    1. 2.1. 新建数据库
    2. 2.2. 导入jar和配置文件以及各种包
    3. 2.3. druid连接池配置文件
    4. 2.4. jedis.properties配置redis文件
  3. 3. dao层及daoImpl层实现
    1. 3.1. dao层
    2. 3.2. daoimpl层
    3. 3.3. domain层
  4. 4. service和servlet层
    1. 4.1. service层
    2. 4.2. service实现层
    3. 4.3. servlet层
  5. 5. redis数据池工具类和前端页面
    1. 5.1. redis数据池工具类
    2. 5.2. 前端index.html
  6. 6. 总结
,