一、案例需求
-
一个页面,页面中有一个省份 下拉列表 当 页面加载完成后 发送ajax请求,加载所有省份
-
注意:使用redis缓存一些不经常发生变化的数据。
- 数据库的数据一旦发生改变,则需要更新缓存。
- 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
- 在service层对应的增删改方法中,将redis数据删除。
- 数据库的数据一旦发生改变,则需要更新缓存。
二、架构
MVC三层架构
三、代码实现
- 需要的添加依赖/技术:
Jquery框架(Ajax)+Jackson的fastjson+测试junit+Redis缓存+Servlet+Spring的JdbcTemplate相关+druid数据库连接池+mysql数据库
<dependency>
<!--Jquery 相关包-->
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1</version>
</dependency>
<!--添加fastjson包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
<!--日志管理-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--Spring 相关的jar包 用于 JdbcTemplate-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--阿里的druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
- 前端显示页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="webjars/jquery/3.3.1/jquery.min.js"> </script>
<script>
$(function () {
$("#hello").css("backgroundColor","red");
$.get("findProvinceServlet",{},function (data) {
//1.获取到select标签
var $province = $("#province");
//2.遍历data传来的json数据
$(data).each(function () {
//3.设置option
var option = " <option id='"+this.id+"'>"+this.name+"</option> "
//4.append添加到select
$province.append(option);
})
});
});
</script>
</head>
<body>
<input type="button" value="hello" id="hello" ><br>
<select id="province">
<option>--请选择省份--</option>
</select>
</body>
</html>
- FindProvinceServlet 前端和后端的交互
package service.Impl;
import Dao.Impl.ProvinceDao;
import Dao.ProvinceDaoImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import domain.Province;
import itcase.JedisPoolUtils;
import redis.clients.jedis.Jedis;
import service.ProvinceService;
import java.util.List;
public class ProvinceServiceImpl implements ProvinceService {
ProvinceDao dao = new ProvinceDaoImpl();
@Override
public List<Province> findAll() {
return dao.FindAll();
}
/**
* Redis缓存
* @return 返回json数据
*/
@Override
public String findAllJson() {
//1.使用Jackson工具类得到Jedis
Jedis jedis = JedisPoolUtils.getJedis();
//2.查询key province
String province_json = jedis.get("province");
if (province_json == null || province_json.length()==0){
//3.province 为空说明第一次此访问,所以设置province并存储
List<Province> list = dao.FindAll();
//4.将list转为Json
ObjectMapper mapper = new ObjectMapper();
try {
province_json= mapper.writeValueAsString(list);
System.out.println("第一次缓存:"+province_json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//5.将json存储到Redis
jedis.set("province",province_json);
//6.归还连接
jedis.close();
}else{
System.out.println("从缓存中取出数据");
}
return province_json;
}
}
- Service层方法进行判断缓存和调用Dao层方法进行数据存储
/**
* Redis缓存
* @return 返回json数据
*/
@Override
public String findAllJson() {
//1.使用Jackson工具类得到Jedis
Jedis jedis = JedisPoolUtils.getJedis();
//2.查询key province
String province_json = jedis.get("province");
if (province_json == null || province_json.length()==0){
//3.province 为空说明第一次此访问,所以设置province并存储
List<Province> list = dao.FindAll();
//4.将list转为Json
ObjectMapper mapper = new ObjectMapper();
try {
province_json= mapper.writeValueAsString(list);
System.out.println("第一次缓存:"+province_json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//5.将json存储到Redis
jedis.set("province",province_json);
//6.归还连接
jedis.close();
}else{
System.out.println("从缓存中取出数据");
}
return province_json;
}
- Dao层进行数据查询返回
@Override
public List<Province> FindAll() {
String sql = "select * from province";
List<Province> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
return query;
}