このブログの主な内容は、新しい機能、コンテンツ分類ドロップダウンメニューの実現を追加することです。
目次
1つ:Dao:分類のニーズを満たすために、オーバーロードされたメソッドを追加します
2:サービス:可変パラメーターを使用してコンテンツ分類要件に対応します。
3:コントローラー:コンテンツ分類要件に対応するために、取得要求の分類パラメーターを増やします。
ゼロ:概要:
タイプによるクエリの機能は、Daoレベルでデータをフィルタリングする必要があります。
1つ:Dao:分類のニーズを満たすために、オーバーロードされたメソッドを追加します
PaintingDaoクラス:(1)ページネーションメソッドをオーバーロードします。Daoクラスでは、データはカテゴリカテゴリに従って処理およびフィルタリングされます。(2)当然、リクエストにカテゴリパラメータがない場合、それらは個別に呼び出されます。
package com.imooc.mgallery.dao;
import java.util.ArrayList;
import java.util.List;
import com.imooc.mgallery.entity.Painting;
import com.imooc.mgallery.utils.PageModel;
import com.imooc.mgallery.utils.XmlDataSource;
/**
* Dao类;调用PageModel类和XmlDataSource这个两个工具类;
* 数据访问对象类,作用是获取最原始的xml数据,并且对其进行分页;
* @author dell
*
*/
public class PaintingDao {
/**
* 实现分页的方法
* @param page 查询第几页数据;
* @param rows 每一页显示几条
* @return
*/
public PageModel pagination(int page,int rows) {
List<Painting> xmlDataSourceList = XmlDataSource.getRawData(); // 先获取xml完整的数据;
PageModel pageModel = new PageModel(xmlDataSourceList,page,rows);
return pageModel;
}
/**
* 对pagination方法进行重载
* @param category 类别
* @param page 查询第几页数据
* @param rows 每一页显示几条数据
* @return
*/
public PageModel pagination(int category,int page,int rows) {
List<Painting> xmlDataSourceList = XmlDataSource.getRawData(); // 先获取xml完整的数据;
List<Painting> categoryList = new ArrayList<Painting>(); // 保存符合类别要求的数据
for(Painting p:xmlDataSourceList) {
if(p.getCategory() == category) {
categoryList.add(p);
}
}
PageModel pageModel = new PageModel(categoryList,page,rows);
return pageModel;
}
}
繰り返すには:PaintingDaoクラスは、完全なデータアクセスオブジェクトを提供し、ツールクラスを呼び出すことに加えて、ダオは、データの要件を満たすために、コードを処理して、いくつかのデータを追加し、戻ってそれを渡す前に取得したデータを、わずかに処理することができる。つまり、それをその文では、基礎となるツールクラスは特定のモジュール化された特定の機能のみを完了し、ビジネスロジックの記述には参加しません。Daoクラスは基礎となるツールクラスを呼び出し、結果を取得した後、ビジネスロジックコードを追加します(必要な場合) )スレーブツールへクラスによって取得されたデータが処理され、完全なデータアクセスオブジェクトが上向きに提供されます!!!
2:サービス:可変パラメーターを使用してコンテンツ分類要件に対応します。
(1)オプションのパラメーターを使用して処理します。オプションのパラメーター(基本的には配列)、オプションのパラメーターを表示するかどうか、1つ、または複数にすることができます。(参照:Javaメソッドの記事ブログ)
package com.imooc.mgallery.service;
import java.util.List;
import com.imooc.mgallery.dao.PaintingDao;
import com.imooc.mgallery.entity.Painting;
import com.imooc.mgallery.utils.PageModel;
/**
* 这个类主要职责:完成的程序业务逻辑;
* 涉及到与底层数据交互的工作,交给Dao类去实现
* @author dell
*
*/
public class PaintingService {
private PaintingDao paintingDao = new PaintingDao();
/**
* 调用PaintingDao类的pagination()方法,获得分页数据;
* 这个类的内容看似和PageModel类的内容雷同,但是这个类还是必须的,在实际的开发中,需要遵从MVC原
* 则的按层逐级调用的规范;;;所以,即便没有其他的业务逻辑,我们也要写一个Service,然后让这个Service去调用Dao;
* @param page 当前第几页
* @param rows 每页有几条数据
* @return 分页对象
*/
public PageModel pagination(int page,int rows,String...category) {
if(rows == 0) { // 可以看到,Service类中不但需要调用Dao来进行数据访问;
// Service类还包括:一些前置条件的检查,以及得到调用结果后的后置数据的处理,这些工作都是与底层数据无关的
// Service类中的方法用于处理完整的业务逻辑,Service类中方法需要尽量写的完整;
// 而Dao中的方法只与底层数据进行交互的;;;
// 所以,在这个例子中,即使Service类中的方法和Dao中的内容基本相同,也必须要要写这个Service类;
throw new RuntimeException("无效的rows参数");
}
if((category.length==0)||(category[0]==null)) { // 如果没有传递可选参数category的时候;
return paintingDao.pagination(page, rows);
}else {
return paintingDao.pagination(Integer.parseInt(category[0]),page, rows);
}
}
}
3:コントローラー:コンテンツ分類要件に対応するために、取得要求の分類パラメーターを増やします。
カテゴリパラメータを追加しました。
(1)カテゴリパラメータ「c」がリクエストアドレスに付加されている場合、カテゴリ変数は空ではありません。当然、Serviceメソッドを呼び出すと、[pagination(int page、int rows、String ... category)]は変数パラメータには値があり、nullにはなりません。サービスが処理された後、Daoのオーバーロードされたメソッド[pagination(int category、int page、int rows)]が呼び出されます。(2)にカテゴリパラメータがない場合リクエストアドレス「c」、サービスメソッドが自然に呼び出された場合、自然カテゴリ変数はnull、[pagination(int page、int rows、String ... category)]サービスが処理された後、この変数パラメータはnull、 DaoのDaoは[Pagination(int page、int rows)]と呼ばれます。このオーバーロードされたメソッド。
package com.imooc.mgallery.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.imooc.mgallery.service.PaintingService;
import com.imooc.mgallery.utils.PageModel;
/**
* Servlet implementation class PaintingController
*/
@WebServlet("/page")
public class PaintingController extends HttpServlet {
private static final long serialVersionUID = 1L;
// 因为在Controller中,需要调用Service,所以这儿先创建PaintingService类的对象;
private PaintingService paintingService = new PaintingService();
/**
* @see HttpServlet#HttpServlet()
*/
public PaintingController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 1.接受HTTP请求的参数
String page = request.getParameter("p");
String rows = request.getParameter("r");
String category = request.getParameter("c");
if(page == null) { // 如果前台请求的时候没有附带“p”和“r”两个参数,那么page和rows都会是空的,
page = "1"; // 这样下面的paintingService.pagination()会报空指针异常;所以这儿判断处理一下;
} // 如果page或者rows为空,就给其附一个默认值;
if(rows == null) {
rows = "6";
}
// 2.调用Service方法,得到处理结果;
PageModel pageModel = paintingService.pagination(Integer.parseInt(page), Integer.parseInt(rows),category);
// 3.将结果放在当前的请求属性中;
request.setAttribute("pageModel", pageModel); // 这儿的pageModel必须是一个标准的javaBean,这样才能被前台的JSP的el表达式等识别获取
// 4.请求转发至对应的JSP(view视图),进行数据展现;
// 使用请求转发,将当前的请求转发到inde.jsp上;这儿的视图放在了/WEB-INF/jsp目录下;
request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request, response);
}
}
4:index.jsp:
index.jspを次のように変更します。
<%@page contentType="text/html;charset=utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!-- 引入jstl的核心库包 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <!-- 引入jstl的格式化包;待会对价格进行 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" type="text/css" href="css\common.css">
<script type="text/javascript" src="js\js1.js"></script>
</head>
<body>
<c:if test="${param.c != null}">
<c:set var="categoryParam" value="&c=${param.c}"></c:set> <!-- set:在当前页面创建一个变量,保存具体的数据 -->
</c:if>
<c:if test="${param.c == null }">
<c:set var="categoryParam" value=""></c:set>
</c:if>
<div class="header">
<div class="logo">
<img src="image\logo.png">
</div>
<div class="menu" onclick="show_menu()" onmouseleave="show_menu1()">
<div class="menu_title" ><a href="###">内容分类</a></div>
<ul id="title">
<li><a href="/page?c=1">现实主义</a></li>
<li><a href="/page?c=2">抽象主义</a></li>
</ul>
</div>
<div class="auth">
<ul>
<li><a href="#">登录</a></li>
<li><a href="#">注册</a></li>
</ul>
</div>
</div>
<div class="content">
<div class="banner">
<img src="image/welcome.png" class="banner-img">
</div>
<div class="img-content">
<ul>
<c:forEach items="${pageModel.pageData}" var="painting">
<li>
<img src="${painting.preview}" class="img-li">
<div class="info">
<h3>"${painting.pname}"</h3>
<p>
"${painting.description}"
</p>
<div class="img-btn">
<!-- 价格格式化输出 --><!-- 0.00是因为,在实际正式开发,显示价格时必须要在后面增加两位小数.00 -->
<div class="price"><fmt:formatNumber pattern="¥0.00" value="${painting.price}"></fmt:formatNumber></div>
<a href="#" class="cart">
<div class="btn">
<img src="image/cart.svg">
</div>
</a>
</div>
</div>
</li>
</c:forEach>
</ul>
</div>
<div class="page-nav">
<ul>
<li><a href="/page?p=1${categoryParam}">首页</a></li>
<li><a href="/page?p=${pageModel.hasPreviousPage?pageModel.page-1:1 }${categoryParam}">上一页</a></li>
<!-- 步长设为1 -->
<c:forEach begin="1" end="${pageModel.totalPages}" var="pno" step="1">
<li><span ${pno== pageModel.page?"class='first-page'":""}> <!-- el表达式允许使用三目运算符 -->
<!-- 如果c不存在,则href="/page?p=1" -->
<!-- 如果c存在(假设c=2,即抽象主义),则href="/page?p=1&c=2" -->
<a href="/page?p=${pno}${categoryParam}">
${pno}
</a>
</span></li>
</c:forEach>
<li><a href="/page?p=${pageModel.hasNextPage?pageModel.page+1:pageModel.totalPages}${categoryParam}">下一页</a></li>
<li><a href="/page?p=${pageModel.totalPages}${categoryParam}">尾页</a></li>
</ul>
</div>
</div>
<div class="footer">
<p><span>M-GALLARY</span>©2020 POWERED BY IMOOC.INC</p>
</div>
</body>
</html>
いくつかのメモ
(1)「リアリズム」と「抽象主義」にハイパーリンクを追加します。
(2)リクエストの分類パラメータを取得します。
(3)ページングに関連するすべての場所のリクエストアドレスに分類パラメータを追加します。
追加:デフォルトのホームページを実装する
ホームページのアドレスは元々[localhost:8080 / page]でした。つまり、毎回アクセスするにはページを入力する必要があります。デフォルトで[localhost:8080 /]にアクセスしてホームページにアクセスするにはどうすればよいですか?
このように、/ pageを追加せずに[localhost:8080 /]にアクセスすると、ホームページにアクセスできます。
このアプローチは、実際の作業で一般的に使用される戦略でもあります。つまり、デフォルトのホームページを使用して、必要なアドレスにジャンプします。!!