Java Web 网络商城案例演示八(首页分类查询)

获取首页分类信息

首页分类版本一

原理分析;

在这里插入图片描述

步骤实现;

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;
	}
}
原创文章 76 获赞 151 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/104967263