获取首页分类信息
首页分类版本一
原理分析;
步骤实现;
1、准备工作
访问首页webContent/index.jsp的时候跳转到IndexServlet
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:forward page="/IndexServlet"></jsp:forward>
2、创建分类模块的相关的程序
分别创建CategoryServlet,CategoryService,CategoryServiceImpl,CategoryDao,CategoryDaoImpl,在domain创建Category
Category当中:
package cn.itzheng.store.domain;
public class Category {
private String cid;
private String cname;
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Category() {
// TODO Auto-generated constructor stub
}
public Category(String cid, String cname) {
super();
this.cid = cid;
this.cname = cname;
}
@Override
public String toString() {
return "Category [cid=" + cid + ", cname=" + cname + "]";
}
}
3、创建IndexServlet
调用业务层的一个功能,获取全部的分类信息,返回集合
将返回的集合放入request内
转发到真实的首页
public class IndexServlet extends BaseServlet {
@Override
public String execute(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
// 调用业务层的一个功能,获取全部的分类信息,返回集合
CategoryService categoryService = new CategoryServiceImpl();
List<Category> list = categoryService.getAllCats();
// 将返回的集合放入request内
request.setAttribute("allCats", list);
// 转发到真实的首页
return "/jsp/index.jsp";
}
}
分别创建CategoryServlet,CategoryService,CategoryServiceImpl,CategoryDao,CategoryDaoImpl
public interface CategoryService {
List<Category> getAllCats() throws Exception;
}
public class CategoryServiceImpl implements CategoryService {
@Override
public List<Category> getAllCats() throws Exception {
CategoryDao categoryDao = new CategoryDaoImpl();
return categoryDao.getAllCats();
}
}
import cn.itzheng.store.domain.Category;
public interface CategoryDao {
List<Category> getAllCats() throws Exception;
}
public class CategoryDaoImpl implements CategoryDao {
@Override
public List<Category> getAllCats() throws Exception {
String sql = "select * from category";
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
return qr.query(sql, new BeanListHandler<Category>(Category.class));
}
}
在header.jsp页面当中获取IndexServlet发送的List集合
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<c:forEach items="${allCats}" var="c">
<li><a href="#">${c.cname }</a></li>
</c:forEach>
</ul>
弊端:当访问首页是可以看到全部的分类信息,但是如果访问其它登录页面,看不到分类信息
JSON 相关知识
https://www.runoob.com/json/json-tutorial.html
首页分类版本二(使用json)
步骤实现:
1、/jsp/header.jsp
在页面底部
$.post(url,{},function(data){},“json”){}
<script>
$(function (){
//页面加载完向服务端CategoryServlet---> getAllCats发起ajax请求,服务端经过处理,
//将所有分类信息以JSON的格式返回,获取到返回的所有分类绑定在页面的显示分类区域
var url = "/store_v5/CategoryServlet";
var obj={"method":"findAllCats"};//数据的形式是键为methid其值为findAllCats
$.post(url,obj,function(data){//用ajax向服务器发送请求(其数据的形式是json)
//alert(data);
//获取到服务端响应回的数据,经过观察data存放的是一个JSON格式的数组,遍历数组,动态的显示分类区域的代码
//遍历obj当中的对象
$.each(data,function(i,obj){
var li = "<li><a href='#'>"+obj.cname+"</a></li>";
$("#myUL").append(li);
});
},"json");
})
</script>
2、在CategoryServlet当中创建findAllCats方法
调用业务层的获取全部分类
将全部分类转换为JSON格式的数据
导入json相关的架包(web下的lib当中)
将全部的分类信息响应到客户端
public class CategoryServlet extends BaseServlet {
// findAllCats
public String findAllCats(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 调用业务层的获取全部分类
CategoryService categoryService = new CategoryServiceImpl();
List<Category> list = categoryService.getAllCats();
// 将全部分类的List数据转换为JSON格式的数据(转换之前要引入json相关的架包)
String jsonStr = JSONArray.fromObject(list).toString();
System.out.println(jsonStr);
// 将全部的分类信息响应到客户端
//告诉浏览器本次响应的数据是JSON格式的字符串
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(jsonStr);//将json格式的字符串响应到客户端
return null;
}
}
3、调试
观察本次的请求和响应网络传输的情况,
目的:排除两端错误
[{“cid”:“1”,“cname”:“手机数码”},
{“cid”:“172934bd636d485c98fd2d3d9cccd409”,“cname”:“运动户外”},
{“cid”:“2”,“cname”:“电脑办公”},
{“cid”:“3”,“cname”:“家具家居”},
{“cid”:“4”,“cname”:“鞋靴箱包”},
{“cid”:“5”,“cname”:“图书音像”},
{“cid”:“59f56ba6ccb84cb591c66298766b83b5”,“cname”:“aaaa”},
{“cid”:“6”,“cname”:“母婴孕婴”},
{“cid”:“afdba41a139b4320a74904485bdb7719”,“cname”:“汽车用品”}]
版本二的弊端:如果用户频繁的访问包含分类信息的页面,每次都要去DB中去获取分类信息,影响性能。
首页分类版本三(使用Redis)
原理分析
步骤实现:
1、导入Redis,jar包
2、及其工具类(修改参数127.0.01)
public class JedisUtils {
//创建连接池
private static JedisPoolConfig config;
private static JedisPool pool;
static{
config=new JedisPoolConfig();
config.setMaxTotal(30);
config.setMaxIdle(2);
pool=new JedisPool(config, "127.0.0.1", 6379);//链接本地的redis
}
//获取连接的方法
public static Jedis getJedis(){
return pool.getResource();
}
//释放连接
public static void closeJedis(Jedis j){
j.close();
}
}
3、启动window版本本地演示版本的Redis
Redis官网下载
http://www.redis.cn/download.html
将从数据获取的数据放入到json,当第一访问的时候,将json的数据直接响应到前端,通过将json的数据放入到Redis,当地二次访问该方法的时候,直接从Redis当中获取对应的数据响应到前端
判断是否是第一次访问的依据是判断其Redis当中有没有对应的数据,然后再放入,或者取出
public class CategoryServlet extends BaseServlet {
// findAllCats
public String findAllCats(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 在redis当中获取全部分类信息
Jedis jedis = JedisUtils.getJedis();
String jsonStr = jedis.get("allCats");
if (null == jsonStr || "".equals(jsonStr)) {
// 调用业务层的获取全部分类
CategoryService categoryService = new CategoryServiceImpl();
List<Category> list = categoryService.getAllCats();
// 将全部分类的List数据转换为JSON格式的数据(转换之前要引入json相关的架包)
jsonStr = JSONArray.fromObject(list).toString();
System.out.println(jsonStr);
//将JSON格式的字符串放入到redis当中
jedis.set("allCats", jsonStr);
System.out.println("Redis缓存当中没有数据");
// 将全部的分类信息响应到客户端
// 告诉浏览器本次响应的数据是JSON格式的字符串
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().print(jsonStr);// 将json格式的字符串响应到客户端
} else {
System.out.println("Redis缓存当中有数据");
// 将全部的分类信息响应到客户端
// 告诉浏览器本次响应的数据是JSON格式的字符串
resp.setContentType("application/json;charset=utf-8");
// 将json格式的字符串响应到客户端
resp.getWriter().print(jedis.get("allCats"));//将redis当中的数据发送到前端
System.out.println(jedis.get("allCats"));
}
// 释放redis当中的资源
JedisUtils.closeJedis(jedis);
return null;
}
}