需求分析
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)
打开服务器–客户端–查询