目录
1-1-3.调用CategoryService.findAll() 返回值是:list
1-2-3.在head.jsp加载成功之后发送一个ajax请求
1-4-2.编写配置文件-src下的ehcache(项目运行时在 classes 目录下)
1-4-3.在service中动态从缓存中获取数据-使用api-service需要序列化
2-1-1.在indexServlet的index方法中实现
4-1-3.在productSerivce需要封装成pagebean
-
一.案例1-分类展示
最初的设计
点击首页的时候,查询分类信息
-
1-1.步骤分析
-
1-1-1.创建分类表
CREATE TABLE `category` (
`cid` varchar(32) NOT NULL,
`cname` varchar(20) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `category` VALUES ('1','手机数码'),('172934bd636d485c98fd2d3d9cccd409','运动户外'),('2','电脑办公'),('3','家具家居'),('4','鞋靴箱包'),('5','图书音像'),('59f56ba6ccb84cb591c66298766b83b5','aaaa'),('6','母婴孕婴'),('afdba41a139b4320a74904485bdb7719','汽车用品');import java.io.Serializable; /** * 分类实体 * @author Administrator * */ public class Category implements Serializable { 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; } }
-
1-1-2.在indexservlet上查询分类信息
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 和首页相关的servlet
*/
public class IndexServlet extends BaseServlet {
public String index(HttpServletRequest request, HttpServletResponse response) {
//去数据库中查询最新商品和热门商品 将他们放入request域中 请求转发
ProductService ps=(ProductService) BeanFactory.getBean("ProductService");
//最新商品
List<Product> newList=null;
List<Product> hotList=null;
try {
newList = ps.findNew();
hotList=ps.findHot();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//热门商品
//将俩个list放入域中
request.setAttribute("nList", newList);
request.setAttribute("hList", hotList);
return "/jsp/index.jsp";
}
}
-
1-1-3.调用CategoryService.findAll() 返回值是:list
public class CategoryServiceImpl implements CategoryService {
/**
* 查询所有的分类
*/
@Override
public List<Category> findAll() throws Exception {
//从数据库中获取
CategoryDao cd=new CategoryDaoImpl();
return cd.findAll();
}
}
-
1-2.信息分类展示--通过发送异步请求
完成之后 ,我们发现只有在访问首页的时候才能把分类列表展示出来,怎么办?????
要想让所有的页面上都有分类,只需要将 页面上 logo和菜单部分包含进来.怎么去查询分类信息呢????
只需要在页面加载成功之后 发送一个ajax请求 异步查询所有的分类信息即可
技术:
json
包含
ajax
步骤分析:
-
1-2-0.将jsp头部分开,其他页面包含页面
- 静态包含
<!-- 静态包含 --> <%@include file="/jsp/head.jsp" %>
- 动态包含
<!-- 动态包含 --> <jsp:include page="/jsp/head.jsp"></jsp:include>
-
1-2-1.编写一个单独的 CategorySerlvet
- 导入jar包
- 添加 JsonUtils
import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.util.CycleDetectionStrategy; import net.sf.json.xml.XMLSerializer; /** * 处理json数据格式的工具类 * * @Date 2013-3-31 * @version 1.0 */ public class JsonUtil { /** * 将数组转换成String类型的JSON数据格式 * * @param objects * @return */ public static String array2json(Object[] objects){ JSONArray jsonArray = JSONArray.fromObject(objects); return jsonArray.toString(); } /** * 将list集合转换成String类型的JSON数据格式 * * @param list * @return */ public static String list2json(List list){ JSONArray jsonArray = JSONArray.fromObject(list); return jsonArray.toString(); } /** * 将map集合转换成String类型的JSON数据格式 * * @param map * @return */ public static String map2json(Map map){ JSONObject jsonObject = JSONObject.fromObject(map); return jsonObject.toString(); } /** * 将Object对象转换成String类型的JSON数据格式 * * @param object * @return */ public static String object2json(Object object){ JSONObject jsonObject = JSONObject.fromObject(object); return jsonObject.toString(); } /** * 将XML数据格式转换成String类型的JSON数据格式 * * @param xml * @return */ public static String xml2json(String xml){ JSONArray jsonArray = (JSONArray) new XMLSerializer().read(xml); return jsonArray.toString(); } /** * 除去不想生成的字段(特别适合去掉级联的对象) * * @param excludes * @return */ public static JsonConfig configJson(String[] excludes) { JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(excludes); jsonConfig.setIgnoreDefaultExcludes(true); jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); return jsonConfig; } }
import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class CategoryServlet */ public class CategoryServlet extends BaseServlet { /** * 查询所有的分类 */ public String findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.调用categoryservice 查询所有的分类 返回值list CategoryService cs = CategoryServicImpl(); List<Category> clist = null; try { clist = cs.findAll(); } catch (Exception e) { e.printStackTrace(); } // 2.将返回值转成json格式 返回到页面上 //request.setAttribute("clist", clist);//放入request域中 String json = JsonUtil.list2json(clist); //3.写回去 response.setContentType("text/html;charset=utf-8"); response.getWriter().println(json); return null; } }
-
1-2-2.findAll方法用来查询所有
list通过json返回到页面上
-
1-2-3.在head.jsp加载成功之后发送一个ajax请求
$.get(url,params,function(data){},"json");
- 为ul标签添加id值
<ul id="menuId" class="nav navbar-nav"> <%-- <c:forEach items="${clist }" var="c"> <li><a href="#">${c.cname }</a></li> </c:forEach> --%> </ul>
- 遍历数组,写内容
<script> $(function(){ //发送ajax请求 $.get("${pageContext.request.contextPath}/category?method=findAll",function(data){ //获取menu的ul标签-----为其添加id值 var $ul=$("#menuId"); //遍历数组 $(data).each(function(){ $ul.append($("<li><a href='${pageContext.request.contextPath}/product?method=findByPage&cid="+this.cid+"&currPage=1'>"+this.cname+"</a></li>")); }); },"json"); }); </script>
上面的操作我们已经可以在每个页面上查看到分类信息了,但是只要换一次页面就会查询一下数据库,增加服务器的压力,
对于数据不常变化的情况,我们可以使用缓存技术
-
1-3.常见的缓存技术
ehcache:今天用,hibernate中底层使用了ehcache
memcache
redis
-
1-4.ehcache使用步骤
-
1-4-1.导入jar包