主頁 > 後端開發 > Javaweb07-三層架構(BaseDao)

Javaweb07-三層架構(BaseDao)

2022-08-16 07:52:30 後端開發

1、BaseDao

持久層業務介面實作類的公共父類,定義了jdbc操作資料庫的所有公共方法,方便子類繼承;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

/**
 * 持久層業務介面實作類的公共父類,定義了jdbc操作資料庫的所有公共方法,方便子類繼承
 * @author zhukang
 *
 */
public class BaseDao {
	
	// 資料庫操作物件
	protected Connection conn = null;
	protected PreparedStatement pstmt = null;
	protected ResultSet rs = null;
	
	/**
	 * 獲取資料庫連接,回傳獲取連接成功還是失敗
	 */
	public boolean getConnection(){
		try {
			// 創建Properties屬性物件
			Properties properties = new Properties();
			
			// 使用反射機制,讀取外部組態檔
			InputStream inputStream = BaseDao.class.getClassLoader().getResourceAsStream("jdbc.properties");
			
			// 加載輸入流物件,獲取組態檔內容
			properties.load(inputStream);
			
			// 讀取資料庫連接資訊
			String driverClass = properties.getProperty("driverClass");
			String jdbcUrl = properties.getProperty("jdbcUrl");
			String user = properties.getProperty("user");
			String password = properties.getProperty("password");
			
			// 加載驅動
			Class.forName(driverClass);
			
			// 獲取資料庫連接物件
			conn = DriverManager.getConnection(jdbcUrl, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			// 獲取連接失敗
			return false;
		}
		
		// 獲取連接成功
		return true;
	}
	
	/**
	 * 增刪改的通用方法:只需要提供執行的SQL陳述句和SQL陳述句需要的引數,使用預處理物件
	 */
	public int executeUpdate(String executeSql, Object ... params){
		
		// 定義SQL陳述句執行的影響行數
		int row = 0;
		
		// 獲取資料庫連接,如果獲取失敗,不執行操作
		if(getConnection()){
			// 公共執行增刪改的處理代碼
			try {
				
				// 創建預處理操作物件
				pstmt = conn.prepareStatement(executeSql);
				
				// 實作動態傳參,注意: 傳入的預編譯SQL的?和傳入的引數個數和順序要一致,即:要保證一一對應
				for (int i = 0; i < params.length; i++) {
					pstmt.setObject(i + 1, params[i]);
				}
				
				// 執行增刪改操作,并獲取影響行數
				row = pstmt.executeUpdate();
				
				System.out.println("BaseDao增刪改的SQL=>"+pstmt);
				
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				releaseResource(conn, pstmt, null);
			}
		}
		
		// 回傳影響行數
		return row;
		
	}
	
	/**
	 * 查詢的通用方法:只需要提供執行的SQL陳述句和SQL陳述句需要的引數,使用預處理物件
	 */
	public void executeSelect(String executeSql, Object ... params){
		
		// 獲取資料庫連接,如果獲取成功,執行查詢,否則不執行
		if(getConnection()){
			// 公共執行查詢的處理代碼
			try {
				// 創建預處理操作物件
				pstmt = conn.prepareStatement(executeSql);
				
				// 實作動態傳參,注意: 傳入的預編譯SQL的?和傳入的引數個數和順序要一致,即:要保證一一對應
				for (int i = 0; i < params.length; i++) {
					pstmt.setObject(i + 1, params[i]);
				}
				
				// 執行查詢操作,并獲取結果集
				rs = pstmt.executeQuery();
				
				System.out.println("BaseDao查詢的SQL=>"+pstmt);
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				// 不釋放資源,因為rs要回傳,關閉后,直接外層不可以使用
			}
		}
	}
	
	/**
	 * 釋放資料庫操作物件資源
	 */
	public void releaseResource(Connection conn, Statement stmt, ResultSet rs){
		try {
			// 手動釋放
			if (null != rs) {
				rs.close();
			}
			
			if (null != stmt) {
				stmt.close();
			}

			if (null != conn) {
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

2、一個 Servlet 多請求 引數 mothed

使用反射實作;

(全部查詢當作條件查詢的沒有條件來查詢會比較方便后面的操作);

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    //根據請求攜帶的方法引數名引數,呼叫不同業務的處理方法

    String mothedName = req.getParameter("mothed") == null ? "animes" : req.getParameter("mothed");

    //利用反射,根據方法名呼叫指定方法
    try {
        Method method = getClass().getDeclaredMethod(mothedName,HttpServletRequest.class,HttpServletResponse.class);
        method.setAccessible(true);
        method.invoke(this, req,resp);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

//查詢所有的動漫串列
protected void animes(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("======= AnimesServlet查詢所有的動漫串列==========");
    String aname = req.getParameter("aname");
    String author = req.getParameter("author");
    String cid = req.getParameter("cid");

    List<Anime> animes = animeService.animeList(aname, author, cid);

    String animesJson = JSON.toJSONStringWithDateFormat(animes,"yyyy-MM-dd");

    System.out.println(animesJson);
    System.out.println("=============================================");
    resp.getWriter().print(animesJson);

}

//洗掉動漫
protected void delAnime(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("==============洗掉動漫=====================");

}

//添加動漫
protected void addAnime(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("==============添加動漫=====================");

}

//修改動漫
protected void modAnime(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("==============修改動漫=====================");

}

3、搜索 點擊搜索按鈕,$("form").serialize()獲取引數,并條件查詢

$(function(){
    
    //頁面初始化加載,主動查詢串列
    //查詢所有的資料,就是條件查詢的沒有條件
	showAnimeList();
    
	//動態獲取動漫資料,動態顯示
    function showAnimeList(){
        $.getJSON("animes",$("form").serialize() ,function(data){
            // 確定資料要動態顯示的位置
            var $tbody = $("tbody");

            //如果沒有資料,不能顯示分頁和提示暫無資料
            if(data =https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/= null || data ==""){
                //先清空再,顯示提示資訊
                $tbody.empty().append("<tr align='center'><td colspan='8'>暫無資料</td></tr>");
                //隱藏 tfoot
                $("tfoot").hide();
                //直接回傳,因為沒有資料,不需要拼接頁面
                return;
            }

            // 隔行變色
            var count = 1;

            //定義動態展示內容,如果不定義為空字符的話,一直拼接新資料
            var animeCountent = "";

            // 資料決議
            $(data).each(function(){
                // 定義顏色
                var bgColor = count % 2 == 0 ? "style='background-color:#ddd;'" : "";
                animeCountent +=
                    "<tr align='center' " + bgColor + ">"
                    + "<td>" + this.id + "</td>"
                    + "<td>" + this.cname + "</td>"
                    + "<td>" + this.name + "</td>"
                    + "<td>" + this.author + "</td>"
                    + "<td>" + this.actor + "</td>"
                    + "<td>" + this.produce + "</td>"
                    + "<td>" + this.create_date + "</td>"
                    + "<td><a href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/#'>修改</a>&nbsp;&nbsp;<a href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/#'>洗掉</a></td>"
                    + "</tr>";

                count++;
            });
            $tbody.empty().append(animeCountent);
            //有資料就要展示tfoot
            $("tfoot").show();
        });
    }

    //點擊搜索按鈕,根據條件篩選資料
    $("#searchAnimes").click(function(){
        showAnimeList();
    });
    
 });

4、分頁查詢sql 動態拼接(apramsList)

public class AnimeDaoImpl extends BaseDao implements AnimeDao{

	@Override
	public List<Anime> selectAnimeList(String aname, String author, String cid) {
		//查詢動漫詳情的SQL陳述句
		String executeSql = "select a.id, a.cid, a.name, a.author, a.actor, a.produce, a.create_date, c.name from animes a, category c where a.cid = c.id ";
		
		//執行查詢的引數集合
		//此寫法弊端,如果兩個或者多個引數同時有,必須不停的增加判斷,添加引數
		//Object[] params = new Object[]{};
		
		//動態引數,推薦使用
		List<Object> paramList = new ArrayList<Object>();
		
		//根據不同的查詢條件,拼接SQL陳述句和引數
		//條件中有動漫名
		if(null != aname && !"".equals(aname)) {
			//模糊匹配
			executeSql += " and a.name like concat('%',?,'%')";
			
			paramList.add(aname);
		}
		
		//條件中有作者
		if(null != author && !"".equals(author)) {
			//模糊匹配
			executeSql += " and a.author like concat('%',?,'%')";
			
			paramList.add(author);
		}
		
		//條件中有型別
		if(null != cid && !"0".equals(cid)) {
			executeSql += " and a.cid = ?";
			paramList.add(cid);
		}
		
		//定義回傳動漫串列的資料集合
		List<Anime> animes = new ArrayList<Anime>();
		
		try {
			// 執行查詢
			this.executeSelect(executeSql, paramList.toArray());
			
			// 決議查詢結果
			while(rs.next()){
				// 每條資料,創建一個動漫物件,存盤資料
				Anime anime = new Anime();
				anime.setId(rs.getInt(1));
				anime.setCid(rs.getInt(2));
				
				//對動漫name結構處理
				if(null != aname && !"".equals(aname)) {
					//標記name
					String markname = rs.getString(3).replace(aname, "<span style='color:red'>"+aname+"</span>");
					anime.setName(markname);
				}else {
					anime.setName(rs.getString(3));
				}
				
				anime.setAuthor(rs.getString(4));
				anime.setActor(rs.getString(5));
				anime.setProduce(rs.getString(6));
				anime.setCreate_date(rs.getDate(7));
				anime.setCname(rs.getString(8));
				
				// 將每條動漫資料物件放入集合
				animes.add(anime);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//關閉資源
			this.releaseResource(conn, pstmt, rs);
		}
		
		//回傳動漫集合
		return animes;
	}

}

5、作業總結技巧(BaseDao 頁面不跳轉 Ajax)

5.1 Ajax動態拼接元素及資料

5.1.1 Ajax動態添加分類資料

//$(function() jQuery標志
$(function(){
    //定位z展示分類的下拉元素
    var $cidSelect = $("#cid");

    //獲取動漫分類,動態展示
    $.getJSON("categories",function(data){
        //遍歷回傳的分類集合json集合數,動態加載分類選項
        $(data).each(function(){
            //alert(this.id+this.name);
            $cidSelect.append("<option value='"+this.id+"'>"+this.name+"</option>");
        });
    });
});

5.1.2Ajax動態添加動漫資料

加載動漫資料的時候,直接考慮到模糊匹配查詢,全部查詢就是不帶條件查詢;

(這里的代碼又展示了一遍,主要是提示后面的操作是基于這些代碼操作的);

//$(function() jQuery標志
$(function(){
	//頁面初始化加載,主動查詢串列
		showAnimeList();
				
		//動態獲取動漫資料,動態顯示
		function showAnimeList(){
			$.getJSON("animes",$("form").serialize() ,function(data){
				// 確定資料要動態顯示的位置
				var $tbody = $("tbody");
				
				//如果沒有資料,不能顯示分頁和提示暫無資料
				if(data =https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/= null || data ==""){
					//先清空再,顯示提示資訊
					$tbody.empty().append("<tr align='center'><td colspan='8'>暫無資料</td></tr>");
					//隱藏 tfoot
					$("tfoot").hide();
					//直接回傳,因為沒有資料,不需要拼接頁面
					return;
				}
				
				// 隔行變色
				var count = 1;
				
				//定義動態展示內容,如果不定義為空字符的話,一直拼接新資料
				var animeCountent = "";
				
				// 資料決議
				$(data).each(function(){
					// 定義顏色
					var bgColor = count % 2 == 0 ? "style='background-color:#ddd;'" : "";
					animeCountent +=
						"<tr align='center' " + bgColor + ">"
						+ "<td>" + this.id + "</td>"
						+ "<td>" + this.cname + "</td>"
						+ "<td>" + this.name + "</td>"
						+ "<td>" + this.author + "</td>"
						+ "<td>" + this.actor + "</td>"
						+ "<td>" + this.produce + "</td>"
						+ "<td>" + this.create_date + "</td>"
						+ "<td><a href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/modAnime.jsp?id="+this.id
												  +"&cid="+this.cid
												  +"&cname="+this.cname
												  +"&name="+this.name
												  +"&author="+this.author
												  +"&actor="+this.actor
												  +"&produce="+this.produce
												  +"&create_date="+this.create_date+"'>修改</a>&nbsp;&nbsp;"
						+ "<a class='delAnime' href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/animes?mothed=delAnime&id="+this.id+"'>洗掉</a>"
						+"</td>"
						+ "</tr>";
						
					count++;
				});
				$tbody.empty().append(animeCountent);
				//有資料就要展示tfoot
				$("tfoot").show();
			});
		}
		
		//點擊搜索按鈕,根據條件篩選資料
		$("#searchAnimes").click(function(){
			showAnimeList();
		});
});

5.1 標記搜索詞

5.1 .2 通過SQl 的 replace 標記

沒有同名欄位時可以使用;

//條件中有作者
if(null != author && !"".equals(author)) {
    //標記關鍵字 author
    String markAuthor = "replace(`author`,'"+author +"',\"<span style='color:red'>"+author+"</span>\") as 'a.author'";

    //標記
    executeSql  = executeSql.replace("a.author", markAuthor);

    //模糊匹配
    executeSql += " and a.author like concat('%',?,'%')";
    
    paramList.add(author); //添加引數
}

5.1.4 通過 replace 對結果進行 標記

//對動漫name結構處理
if(null != aname && !"".equals(aname)) {
    //如果有這個條件 標記name
    String markname = rs.getString(3).replace(aname, "<span style='color:red'>"+aname+"</span>");
    anime.setName(markname);
}else {
    //沒有這個條件則不需要標記
    anime.setName(rs.getString(3));
}

5.2 修改 型別 選擇 select

先將修改傳過來的型別引數隱藏到一個input標簽中,在動態獲取型別的時候,JQuery獲取原來的型別引數,并選擇性的給option標簽添加selected引數

<%
//獲取前端引數,封裝到物體類,并添加到request域中,方便獲取
//注意日期不要放進物體類
//直接value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/<%=request.getParameter("create_date") %>" 要不然會型別不匹配
request.setAttribute("upAnimes", anime);
%>
<!-- 隱藏動漫型別 cid -->
<input type="hidden" id="mycid"  value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/${upAnimes.cid }" required>


<script type="text/javascript">
 //異步獲取并遍歷動漫型別
$(function(){
	//獲取動漫分類,動態展示
	$.getJSON("categories",function(data){
		//定位z展示分類的下拉元素
		var $cidSelect = $("#cid");
		
		//遍歷回傳的分類集合json集合數,動態加載分類選項
		var cid =  $("#mycid").val();
		$(data).each(function(){
			//alert(this.id+this.name);
			if(cid == this.id){
				$cidSelect.append("<option value='"+this.id+"' selected>"+this.name+"</option>");
			}else{
				$cidSelect.append("<option value='"+this.id+"'>"+this.name+"</option>");
			}
		});
	});	
});

5.3 Ajax 拼接確認洗掉(動態系結事件)

5.3.1 給動態添加的元素,添加cilck事件(無法系結事件)

cilck無法直接給動態的元素添加事件;

//確認洗掉提示  錯誤,click事件不能動態系結事件
$(".delAnime").click(function(){
    if(!confirm("是否確認洗掉 ${anime.name } ")){
    	return false;
    }
});

5.3.2 添加動態元素時直接動態添加 onClick=”return confirm(\"確認洗掉\")“

 "<a class='delAnime' href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/animes?mothed=delAnime&id="+this.id+"' onClick='return confirm(\"確認洗掉《"+this.name+"》?\")'>洗掉</a></td>"

5.3.3 $(document).on 系結動態加載元素的事件

//動態系結事件(當前和以后添加的元素都可以系結)
//$(document).on 系結動態加載子元素的事件   document是父級元素即可
$(document).on('click', '.delAnime', function(){
    if(!confirm("是否確認洗掉 ${anime.name }")){
        return false;
    }
});

on 系結動態加載元素的事件參考博客

5.6 分頁條件查詢 (不需要pageSupper類)

分頁條件查詢,包括了一般查詢,所以一個分頁條件查詢就夠了;

前端處理分頁引數;

5.6.1 引數

引數 說明 提交
aname 條件查詢引數 表單提交
author 條件查詢引數 表單提交
cid 條件查詢引數 表單提交
pageNo 當前頁面頁碼 獲取tfoot的pageNum,Ajax提交的時候拼接引數
pageSize 頁面大小 獲取tfoot的pageSize,Ajax提交的時候拼接引數
totalCount 資料總條數 Ajax獲取,然后填入 totalCount 中,分頁請求時直接獲取
<!-- 條件查詢引數 aname author cid -->
<form action="#">
    <p style="text-align: center">
        名稱:<input type="text" name="aname" size="15"/>
        作者:<input type="text" name="author" size="15"/>
        分類:<select name="cid" id="cid">
        <option value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/0">全部</option>
        </select>
        <input type="button" value = "https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/搜索" id = "searchAnimes" />
    </p>
</form>

<!-- totalCount -->
共&nbsp;<span id="totalCount">5</span>&nbsp;條&nbsp;&nbsp;

<!-- pageSize 和 pageNum -->
每頁&nbsp;
<!--  <span id = "pageSize">5</span>&nbsp;  -->
<select name="pageSize" id="pageSize">
    <option value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/3" selected>3</option>
    <option value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/5">5</option>
    <option value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/10">10</option>
</select>
條&nbsp;
當前第&nbsp;<span id = "pageNum">1</span>&nbsp;頁&nbsp;/&nbsp;

5.6.2 分頁標簽

<tfoot>
    <tr>
        <td colspan="8" style="height: 40px; text-align: center">
            <input type="button" value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/添加" id="addAnime"/>&nbsp;&nbsp;
            <a href="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/#">首頁</a>&nbsp;|&nbsp;
            <a href="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/#">&lt;&lt;上一頁</a>&nbsp;|&nbsp;
            <a href="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/#">下一頁&gt;&gt;</a>&nbsp;|&nbsp;
            <a href="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/#">尾頁</a>&nbsp;|&nbsp;
            共&nbsp;<span id="totalCount">5</span>&nbsp;條&nbsp;&nbsp;
            每頁&nbsp;
            <!--  <span id = "pageSize">5</span>&nbsp;  -->
            <select name="pageSize" id="pageSize">
                <option value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/3" selected>3</option>
                <option value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/5">5</option>
                <option value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/10">10</option>
            </select>
            條&nbsp;
            當前第&nbsp;<span id = "pageNum">1</span>&nbsp;頁&nbsp;/&nbsp;
            共&nbsp;<span id="totalPage">1</span>&nbsp;頁
        </td>
    </tr>
</tfoot>

5.6.3 資料總量函式

Ajax請求 分頁查詢的資料總量,并填寫到頁面上,方便后面分頁處理

//設定資料總量 函式
function totalCount(){
    //通過 不分頁 的條件查詢,查詢出總資料量
    $.getJSON("animes?mothed=animesCount",$("form").serialize() ,function(data){
        //定義資料總量
        var totalCount = data;

        //alert(" totalCount 資料總量:"+totalCount);
        //獲取資料總量元素
        var $totalCount = $("#totalCount");	
        //重置資料總量
        $totalCount.text(totalCount);	
    });
}

5.6.4 分頁處理函式 (作用類似PageSupport)

包括 上一頁,下一頁的隱藏處理

//分頁處理函式
function pageSearch(pageSize,pageNum,totalPage){
    //后去分頁資料
    //頁面容量 (頁面容量可以不操作,我是為了可以手動改變頁面容量)
    var $pageSize = $("#pageSize");
    //當前頁碼
    var $pageNum = $("#pageNum");
    //頁面總數
    var $totalPage = $("#totalPage");


    //重置分頁資料
    //頁面容量 (頁面容量可以不處理,因為Ajax異步的,頁面不會重繪)
    //$pageSize.text(pageSize);
    $pageSize.val(pageSize);
    //當前頁碼
    $pageNum.text(pageNum);
    //頁面總數
    $totalPage.text(totalPage);

    //處理上一頁和下一頁
    //上一頁
    if(pageNum <= 1){
        $("tfoot a:eq(1)").hide();
    }else{
        $("tfoot a:eq(1)").show();
    }

    //下一頁
    if(pageNum >= totalPage){
        $("tfoot a:eq(2)").hide();
    }else{
        $("tfoot a:eq(2)").show();
    }
}

5.6.5 分頁條件查詢 動態顯示資料

  • 獲取處理總頁數
  • 分頁引數獲取 pageNum,pageSize
  • 動態拼接資料
  • 處理pageSize,pageNum,totalPage
//===頁面初始化加載,主動分頁條件查詢處理===
//分頁條件查詢處理
pageAnimeList();

//動態 分頁 條件 獲取動漫資料,動態顯示
function pageAnimeList(){
    //處理總頁數
    totalCount();

    //獲取分頁查詢的資料
    //頁面容量
    var $pageSize = $("#pageSize");
    //pageSize 用 <span> 標簽
    //var pageSize = $pageSize.text();
    //pageSize 用 <select> 標簽
    var pageSize = $pageSize.val();
    //當前頁碼
    var $pageNum = $("#pageNum");
    var pageNum = $pageNum.text();

    //資料總數
    //$.getJSON("animes",$("form").serialize() ,function(data){
    //分頁查詢
    $.getJSON("animes?mothed=pageAnimes&pageNum="+pageNum+"&pageSize="+pageSize,$("form").serialize() ,function(data){
        // 確定資料要動態顯示的位置
        var $tbody = $("tbody");

        //如果沒有資料,不能顯示分頁和提示暫無資料
        if(data =https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/= null || data ==""){
            //先清空再,顯示提示資訊
            $tbody.empty().append("<tr align='center'><td colspan='8'>暫無資料</td></tr>");
            //隱藏 tfoot
            $("tfoot").hide();
            //直接回傳,因為沒有資料,不需要拼接頁面
            return;
        }

        // 隔行變色
        var count = 0;

        //定義動態展示內容,如果不定義為空字符的話,一直拼接新資料
        var animeCountent = "";

        // 資料決議
        $(data).each(function(){
            // 定義顏色
            var bgColor = count % 2 == 1 ? "style='background-color:#ddd;'" : "";
            animeCountent +=
                "<tr align='center' " + bgColor + ">"
                + "<td>" + this.id + "</td>"
                + "<td>" + this.cname + "</td>"
                + "<td>" + this.name + "</td>"
                + "<td>" + this.author + "</td>"
                + "<td>" + this.actor + "</td>"
                + "<td>" + this.produce + "</td>"
                + "<td>" + this.create_date + "</td>"
                + "<td><a href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/modAnime.jsp?id="+this.id
                +"&cid="+this.cid
                +"&cname="+this.cname
                +"&name="+this.name
                +"&author="+this.author
                +"&actor="+this.actor
                +"&produce="+this.produce
                +"&create_date="+this.create_date+"'>修改</a>&nbsp;&nbsp;"
                + "<a class='delAnime' href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/animes?mothed=delAnime&id="+this.id+"'>洗掉</a>"
                +"</td>"
                + "</tr>";

            count++;
        });
        //清空原來的tbody,添加新的資料
        $tbody.empty().append(animeCountent);
        //有資料就要展示tfoot
        $("tfoot").show();

        //分頁處理
        //獲取總資料量  處理 頁面數量
        //資料總量
        var $totalCount = $("#totalCount");	
        var totalCount = $totalCount.text();
        //處理總頁數
        var totalPage = 1;

        if((totalCount%pageSize) == 0){
            //alert("totalCount="+totalCount+"pageSize"+pageSize);
            totalPage = totalCount/pageSize;
        }else{
            //alert("totalCount="+totalCount+"pageSize"+pageSize);
            totalPage = ((parseInt(totalCount/pageSize))+1);
        }

        //alert("處理總頁數==>>totalPage==>"+totalPage);
        pageSearch(pageSize,pageNum,totalPage);

    });
}

//點擊搜索按鈕,根據條件篩選資料
$("#searchAnimes").click(function(){
    //分頁條件查詢
    pageAnimeList();
});

5.6.6 分頁跳轉處理

//分頁跳轉
//首頁
$("tfoot a:eq(0)").click(function(){
    $("#pageNum").text(1);
    //分頁條件查詢
    pageAnimeList();
    return false;
});


// 上一頁
$("tfoot a:eq(1)").click(function(){
    var pageNum = parseInt($("#pageNum").text()) - 1;
    $("#pageNum").text(pageNum);
    //分頁條件查詢
    pageAnimeList();
    return false;
});


// 下一頁
$("tfoot a:eq(2)").click(function(){
    //alert("下一頁");			
    //alert(parseInt($("#pageNum").text()) + 1);
    $("#pageNum").text(parseInt($("#pageNum").text()) + 1);
    //分頁條件查詢
    pageAnimeList();
    return false;
});

// 尾頁
$("tfoot a:eq(3)").click(function(){
    $("#pageNum").text(parseInt($("#totalPage").text()));
    //分頁條件查詢
    pageAnimeList();
    return false;
});

5.6.7 修改pageSize

//修改pageSize
//select標簽的change()事件, 切換選項時觸發
$("#pageSize").change(function(){
    //獲取修改后的 currentPageSize
    var pageSize = $(this).children('option:selected').val();
    //修改頁面大小后,再主動查詢一次動漫資料
    pageAnimeList();
});

5.6.8 資料總數 和 條件分頁查詢的 servlet

5.6.8.1 資料總數
//條件查詢所有的動漫串列條數
protected void animesCount(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("======= AnimesServlet查詢所有的動漫的總數量==========");
    String aname = req.getParameter("aname");
    String author = req.getParameter("author");
    String cid = req.getParameter("cid");

    int totalCount = animeService.animeListCount(aname, author, cid);

    String totalCountJson = JSON.toJSONString(totalCount);

    System.out.println("AnimesServlet == >animesCount=動漫總條數==>>"+totalCountJson);
    System.out.println("=============================================");
    resp.getWriter().print(totalCountJson);

}
5.6.8.2 分頁條件查詢
//分頁條件查詢所有的動漫
protected void pageAnimes(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("======= 分頁條件查詢  AnimesServlet查詢所有的動漫串列==========");
    //條件查詢引數
    String aname = req.getParameter("aname");
    String author = req.getParameter("author");
    String cid = req.getParameter("cid");

    //分頁引數
    Integer pageNum = new Integer(req.getParameter("pageNum"));
    Integer pageSize = new Integer(req.getParameter("pageSize"));

    System.out.println("pageAnimes==> pageNum==>"+pageNum);
    System.out.println("pageAnimes==> pageSize==>"+pageSize);

    List<Anime> animes = animeService.PageSelectAnimeList(aname, author, cid, pageNum, pageSize);

    String animesJson = JSON.toJSONStringWithDateFormat(animes,"yyyy-MM-dd");

    System.out.println(animesJson);
    System.out.println("=============================================");
    resp.getWriter().print(animesJson);

}
5.6.8.3 多個Ajax請求注意點

多個Ajax請求,javaScript無法控制其執行順序,有時候會出錯;

一個請求拿到另外一個請求的rs中資料;(這里資料總條數取到了某條資料的id)

或第二個請求還沒有從rs中取出資料rs就被關閉(No operations allowed after statement closed.);

(另外這里還有一個特殊點,我的setvlet請求是同一個類的多個方法通過反射執行的);

這里需要將用來反射呼叫方法的公共 **dopost方法上鎖 synchronized **;

//doPost  方法上鎖,保證一次只有一個請求,就保證 一次只有一個SQL執行,一次只有一個rs,就不會資料錯亂;
@Override
protected synchronized void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    //根據請求攜帶的方法引數名引數,呼叫不同業務的處理方法

    String mothedName = req.getParameter("mothed") == null ? "animes" : req.getParameter("mothed");

    //利用反射,根據方法名呼叫指定方法
    try {
        Method method = getClass().getDeclaredMethod(mothedName,HttpServletRequest.class,HttpServletResponse.class);
        method.setAccessible(true);
        method.invoke(this, req,resp);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

5.7 洗掉

5.7.1 動態添加的a標簽 系結事件

直接帶著id到后臺洗掉;

+ "<a class='delAnime' href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/animes?mothed=delAnime&id="+this.id+"'>洗掉</a>"


//動態系結事件(當前和以后添加的元素都可以系結)
//$(document).on 系結動態加載子元素的事件
$(document).on('click', '.delAnime', function(){
    if(!confirm("是否確認洗掉 ${anime.name }")){
        return false;
    }
});

5.7.2 洗掉成功后 提示

resp.getWriter().print("<script type='text/javascript'>alert('洗掉成功!!!'); location.href = 'https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/animeList.jsp'</script>");

5.8 修改

這種方式比較的麻煩,攜帶的引數太多,不過也是一個方法,可以擴張一下思維;

+ "<td><a href='https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/modAnime.jsp?id="+this.id
    +"&cid="+this.cid
    +"&cname="+this.cname
    +"&name="+this.name
    +"&author="+this.author
    +"&actor="+this.actor
    +"&produce="+this.produce				      		                                     +"&create_date="+this.create_date+"'>修改</a>&nbsp;&nbsp;"          

5.9 添加

<input type="button" value="https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/添加" id="addAnime"/>&nbsp;&nbsp;


//添加按鈕處理 跳轉到添加頁面
$("#addAnime").click(function(){
    location.href = "https://www.cnblogs.com/xiaoqigui/archive/2022/08/15/addAnime.jsp";
});

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501894.html

標籤:其他

上一篇:清晰梳理最全日志框架關系與日志配置-SpringBoot 2.7.2 實戰基礎

下一篇:Python獲取虎牙平臺主播照片, 實作顏值檢測, 進行排名

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more