JavaWeb項(xiàng)目之多條件過(guò)濾

相信很多同學(xué)在學(xué)習(xí)java基礎(chǔ)之后,面對(duì)各種項(xiàng)目還是相當(dāng)頭疼,那今天我將手把手教你學(xué)會(huì)JavaWeb項(xiàng)目中的多條件過(guò)濾,希望你能在與我實(shí)戰(zhàn)的過(guò)程中積累經(jīng)驗(yàn),更進(jìn)一步。


分頁(yè)查詢

需求分析:在列表頁(yè)面中,顯示指定條數(shù)的數(shù)據(jù),通過(guò)翻頁(yè)按鈕完成首頁(yè)/上一頁(yè)/下一頁(yè)/尾頁(yè)的查詢

數(shù)據(jù)分析:

通過(guò)觀察,頁(yè)面上需要顯示下面的幾個(gè)數(shù)據(jù):當(dāng)前頁(yè):currentPage頁(yè)面大小:pageSize總頁(yè)數(shù):totalPage首頁(yè):1上一頁(yè):prevPage下一頁(yè):nextPage尾頁(yè):endPage總條數(shù):totalCount結(jié)果集:result

那么,我們應(yīng)該如何方便快速的將這多個(gè)數(shù)據(jù)共享到頁(yè)面上呢?答案是:封裝

我們應(yīng)該將這幾個(gè)參數(shù)封裝到一個(gè)對(duì)象中,然后共享這個(gè)對(duì)象即可,所以,我們有了下面這個(gè)類

@Getterpublic?class PageResult {

????public?static?final??PageResult EMPTY_RESULT = new?PageResult(Collections.EMPTY_LIST, 0, 1, 3);

????//1:兩傳

????private?int?currentPage;

????private?int?pageSize;


????//2:兩查

????private?List<?> result;

????private?int?totalCount;


????//3:三計(jì)算

????private?int?prevPage;

????private?int?nextPage;

????private?int?endPage;


????public PageResult(List<?> result, int totalCount, int currentPage, int pageSize){


????????this.result = result;

????????this.totalCount = totalCount;

????????this.pageSize = pageSize;

????????this.currentPage = currentPage;

????????//計(jì)算

????????this.endPage = totalCount % pageSize == 0??

????????????????????totalCount / pageSize : totalCount / pageSize ?+ 1;

????????this.prevPage = currentPage - 1?> 0?? currentPage - 1?: 1;

????????this.nextPage = currentPage + 1?> endPage ? endPage :currentPage + 1;

????}

}

在這個(gè)類中,我們提供了一個(gè)構(gòu)造器來(lái)快速封裝數(shù)據(jù)其中,endPage/prevPage/nextPage是通過(guò)上面的幾個(gè)參數(shù)計(jì)算得來(lái)的

在這些數(shù)據(jù)中,存在兩個(gè)需要從數(shù)據(jù)庫(kù)中查詢得到的數(shù)據(jù):總條數(shù)/結(jié)果集這兩個(gè)數(shù)據(jù)我們需要下面兩條SQL進(jìn)行查詢

查詢部門表中數(shù)據(jù)的總條數(shù)

SELECT count(id) FROM department

使用LIMIT關(guān)鍵字查詢指定頁(yè)面的數(shù)據(jù)

SELECT ?id, name, sn FROM department LIMIT #{start}, #{pageSize}

#{start}: ????????使用(currentPage-1)*pageSize表達(dá)式計(jì)算出來(lái)的開始索引#{pageSize}: 每次查詢的最大條數(shù)

要執(zhí)行這兩條SQL,需要用戶傳遞兩個(gè)參數(shù):currentPage和pageSize為了參數(shù)方便傳遞,我們將這兩個(gè)參數(shù)封裝到一個(gè)類中:QueryObject

@Setter@Getterpublic?class QueryObject {

????????// 默認(rèn)查詢第一頁(yè)的數(shù)據(jù)

????private?int?currentPage = 1;

????????// 頁(yè)面中默認(rèn)顯示10條數(shù)據(jù)

????private?int?pageSize = 5;

????public int getStart(){

????????return?(currentPage - 1)*pageSize;

????}

}

可以看出,查詢結(jié)果集中的#{start}表達(dá)式,是訪問(wèn)查詢對(duì)象中的getStart()方法來(lái)獲取到計(jì)算得到的開始索引

到此,我們都已經(jīng)封裝好了分頁(yè)查詢中最核心的兩個(gè)類:QueryObject:封裝用戶傳遞過(guò)來(lái)的currentPage/pageSizePageResult:封裝頁(yè)面上顯示需要的result/totalCount/currentPage/pageSize/totalPage/prevPage/pageSize

有了這兩個(gè)類,我們就可以在service中定義下面的方法,來(lái)處理分頁(yè)查詢的業(yè)務(wù)了:


????public PageResult query(QueryObject qo) {

????????//查詢表中數(shù)據(jù)的總條數(shù)

????????int?totalCount = dao.queryForCount(qo);

????????//當(dāng)查詢到的總條數(shù)為0時(shí),說(shuō)明沒有數(shù)據(jù),此時(shí)就不應(yīng)該再之后下面的查詢

????????//直接返回相應(yīng)的默認(rèn)值即可

????????if?(totalCount == 0) {

????????????return?PageResult.EMPTY_RESULT;

????????}

????????List<Department> data = dao.queryForList(qo);

????????PageResult result = new?PageResult(data, totalCount, qo.getCurrentPage(), qo.getPageSize());

????????return?result;

????}

該方法接收用戶傳遞的數(shù)據(jù)(QueryObject),返回用戶需要的數(shù)據(jù)(PageResult)通過(guò)調(diào)用dao中的兩個(gè)方法執(zhí)行兩條SQL查詢數(shù)據(jù)(總條數(shù)和結(jié)果集)

<!--查詢總條數(shù)--><select id="queryForCount" resultType="java.lang.Integer">

????????SELECT count(id)

????????FROM department

????</select><!--查詢結(jié)果集-->

????<select id="queryForList" resultType="Department">

????????SELECT

????????????id,

????????????name,

????????????sn

????????FROM department

????????LIMIT #{start}, #{pageSize}

????</select>

然后將數(shù)據(jù)封裝到PageResult對(duì)象中返回給表現(xiàn)層

表現(xiàn)層獲取到service中封裝的PageResult對(duì)象后,共享到request作用域中然后請(qǐng)求轉(zhuǎn)發(fā)到list.jsp頁(yè)面

protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

????????//接收用戶傳遞的currentPage和pageSize

????????String currentPage = req.getParameter("currentPage");

????????String pageSize = req.getParameter("pageSize");

????????//將數(shù)據(jù)封裝到QueryObject中,傳遞給service進(jìn)行處理

????????QueryObject qo = new?QueryObject();

????????if(!StringUtils.isNullOrEmpty(currentPage)){

????????????qo.setCurrentPage(Integer.valueOf(currentPage));

????????}

????????if(!StringUtils.isNullOrEmpty(pageSize)){

????????????qo.setPageSize(Integer.valueOf(pageSize));

????????}

????????PageResult result = service.query(qo);

????????//共享獲取到的PageResult對(duì)象

????????req.setAttribute("result", result);

????????req.setAttribute("qo", qo);

????????//請(qǐng)求轉(zhuǎn)發(fā)回到list.jsp頁(yè)面

????????req.getRequestDispatcher("/WEB-INF/views/department/list.jsp").forward(req, resp);

????}

在list.jsp頁(yè)面上,使用EL+JSTL獲取數(shù)據(jù)并顯示在對(duì)應(yīng)的位置部門列表

<c:forEach items="${result.data}" var="entity" varStatus="vs">

??<tr>

??????<td>${vs.count}</td>

??????<td>${entity.name}</td>

??????<td>${entity.sn}</td>

??????<td>

??????????<a class="btn btn-info btn-xs" href="/department?cmd=input&id=${entity.id}">

?????????????<span class="glyphicon glyphicon-pencil"></span>編輯

?????????</a>

?????????<a href="/department?cmd=delete&id=${entity.id}" class="btn btn-danger btn-xs">

???????????<span class="glyphicon glyphicon-trash"></span>刪除

?????????</a>

?????</td>

??</tr></c:forEach>

分頁(yè)條

<div style="text-align: center;">

?????<a href="javascript:;" onclick="goPage(1)">首頁(yè)</a>

?????<a href="javascript:;" onclick="goPage(${result.prevPage})">上一頁(yè)</a>

?????<a href="javascript:;" onclick="goPage(${result.nextPage})">下一頁(yè)</a>

?????<a href="javascript:;" onclick="goPage(${result.endPage})">尾頁(yè)</a>


當(dāng)前頁(yè): ${result.currentPage} / ${result.endPage}


跳轉(zhuǎn)到第:<input id="currentPage" name="currentPage" style="width: 80px; text-align: center;"

??????????????????type="number" min="1" max="${result.endPage}" value="${result.currentPage}"/>頁(yè)

?????<input type="submit" value="GO"/>

每頁(yè)顯示:

?????<select name="pageSize" onchange="goPage(1);">

?????????<option ${qo.pageSize==5?"selected='selected'":""}>5</option>

?????????<option ${qo.pageSize==10?"selected='selected'":""}>10</option>

?????????<option ${qo.pageSize==15?"selected='selected'":""}>15</option>

?????????<option ${qo.pageSize==20?"selected='selected'":""}>20</option>

?????</select>

條</div>

效果如下



說(shuō)明:在點(diǎn)擊翻頁(yè)的時(shí)候,通過(guò)執(zhí)行相應(yīng)的JS代碼提交表單來(lái)發(fā)起請(qǐng)求將需要查詢的當(dāng)前頁(yè)的值設(shè)值給表單中的id為currentPage的輸入框,然后提交表單目的主要是和后面的高級(jí)查詢進(jìn)行合并使用

做到這里,我們部門的分頁(yè)功能就完成了因?yàn)椴块T的字段比較少,所以,在這個(gè)模塊中,沒有設(shè)計(jì)高級(jí)查詢的功能,這個(gè)功能我們?cè)趩T工模塊中再去實(shí)現(xiàn)接下來(lái),我們來(lái)看看員工模塊相應(yīng)功能的實(shí)現(xiàn)


在完成部門的CRUD和分頁(yè)查詢后發(fā)現(xiàn),其他模塊的這些功能基本相似不同之處主要在于字段不同而已,所以,在這里,我們主要對(duì)這些不同點(diǎn)進(jìn)行說(shuō)明,其他的按照前面的實(shí)現(xiàn)即可

首先,來(lái)看看員工的表結(jié)構(gòu)




在該表中,前六個(gè)字段都是基本的字段,第七個(gè)(dept_id),這個(gè)字段是關(guān)聯(lián)部門的外鍵列所以,待會(huì)兒我們?cè)谕瓿蒀RUD的過(guò)程中,需要注意維護(hù)該字段的值

清楚表結(jié)構(gòu)之后,我們來(lái)對(duì)員工的CRUD做一個(gè)簡(jiǎn)單的分析

查詢功能:




可以看到,處理部門這一列顯示的數(shù)據(jù)比較特殊之外,其他的都是基本的數(shù)據(jù)展示而已什么是特殊?什么是不特殊?員工除了部門的信息外,其他的數(shù)據(jù)都是直接來(lái)自于數(shù)據(jù)庫(kù),而部門在表中只存儲(chǔ)了對(duì)應(yīng)的編號(hào),但是頁(yè)面上需要顯示部門的名稱,那么這個(gè)問(wèn)題我們是怎么解決的呢?

好,首先解釋一下,這個(gè)問(wèn)題的解決方案在目前我們的web階段還沒有涉及過(guò),所以,我在這只能點(diǎn)到為止

我們的解決方案是:在執(zhí)行該數(shù)據(jù)的查詢的時(shí)候,使用多表查詢,將員工及其所在部門的信息查詢出來(lái),SQL如下:

SELECT

????????????e.id,

????????????e.name,

????????????e.password,

????????????e.email,

????????????e.age,

????????????e.admin,

????????????e.dept_id,

????????????d.id ??d_id,

????????????d.name d_name,

????????????d.sn ??d_sn

FROM employee e LEFT JOIN department d on e.dept_id = d.idlimit?#{start}, #{pageSize}

這條SQL能夠查詢到如下的結(jié)果




然后在resultMap中如下的配置,完成數(shù)據(jù)的封裝,員工相關(guān)的數(shù)據(jù)封裝到Employee對(duì)象中,部門相關(guān)的數(shù)據(jù)封裝到Department對(duì)象中

<resultMap id="BaseResultMap" type="Employee">

????????<id column="id" jdbcType="BIGINT" property="id"/>

????????<result column="name" jdbcType="VARCHAR" property="name"/>

????????<result column="password" jdbcType="VARCHAR" property="password"/>

????????<result column="email" jdbcType="VARCHAR" property="email"/>

????????<result column="age" jdbcType="INTEGER" property="age"/>

????????<result column="admin" jdbcType="BIT" property="admin"/>

????????<!-- 一對(duì)多關(guān)系 -->

????????<association property="dept" javaType="Department">

????????????<id column="d_id" property="id"/>

????????????<result column="d_name" property="name"/>

????????????<result column="d_sn" property="sn"/>

????????</association>

????</resultMap>

最后,在select元素中使用resultMap來(lái)完成映射

<select id="queryForList"?resultMap="BaseResultMap">

完成這些操作之后,我們獲取到的每個(gè)員工及其所在的部門信息就封裝好了,那么,在JSP頁(yè)面中使用EL表達(dá)式,就能夠獲取到當(dāng)前員工所在部門的相關(guān)信息了

<td>${entity.dept.name}</td>

查詢功能分析到此結(jié)束,其他功能和部門的一致

新增功能:

需求分析:保存用戶的相關(guān)信息,包括用戶所在部門的信息通過(guò)對(duì)員工表的觀察發(fā)現(xiàn),表中關(guān)聯(lián)了部門的主鍵信息,來(lái)說(shuō)明當(dāng)前員工所在的部門所以,在保存員工的時(shí)候,需要為員工設(shè)置所在的部門.頁(yè)面設(shè)計(jì)如下





為員工設(shè)置所在的部門,用戶只需要進(jìn)行選擇即可,然后將選中部門的id傳遞到服務(wù)端那么問(wèn)題來(lái)了,如何將部門id通過(guò)下拉框傳遞到服務(wù)端呢?請(qǐng)看下面的分析

protected void input(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

????????List<Department> departments = departmentService.list();

????????req.setAttribute("departments", departments);

????????String id = req.getParameter("id");

????????if?(!StringUtils.isNullOrEmpty(id)) {

????????????Employee employee = service.get(Long.valueOf(id));

????????????req.setAttribute("employee", employee);

????????}

????????req.getRequestDispatcher("/WEB-INF/views/employee/input.jsp").forward(req, resp);

????}

<select class="form-control"?id="dept"?name="deptId">

?????<c:forEach var="d" items="${departments}">

?????????<option value="${d.id}" >${d.name}</option>

?????</c:forEach>

?</select>

首先,在跳轉(zhuǎn)到該頁(yè)面之間,我們先將所有的部門信息查詢到然后在頁(yè)面上循環(huán)遍歷,生成對(duì)應(yīng)的option元素,將部門的id作為option的value(提交的數(shù)據(jù)),將部門的name作為option的文本內(nèi)容(顯示的數(shù)據(jù))最后,在用戶選擇對(duì)應(yīng)選項(xiàng)后,提交表單,會(huì)將對(duì)應(yīng)option元素的value提交到后臺(tái),完整數(shù)據(jù)如下:




通過(guò)上圖,可以清晰的看到,我們已經(jīng)將完整的數(shù)據(jù)提交到后臺(tái)后臺(tái)獲取到這些數(shù)據(jù)之后,就能夠?qū)⑵浔4娴綌?shù)據(jù)庫(kù)中那么,我們的保存功能就算完成了

更新功能:

更新和保存只有一個(gè)地方不同,就是需要數(shù)據(jù)回顯而數(shù)據(jù)回顯中,我們只對(duì)部門(下拉框)和超級(jí)管理員(復(fù)選框)做一個(gè)說(shuō)明,其他的因?yàn)槎际瞧胀ǖ膇nput元素,使用value屬性顯示數(shù)據(jù)即可而下拉框和復(fù)選框需要單獨(dú)進(jìn)行處理,如下:

<select class="form-control"?id="dept"?name="deptId">

????<c:forEach var="d" items="${departments}">

????????<option value="${d.id}" ${employee.dept.id==d.id?"selected":""}>${d.name}</option>

????</c:forEach></select>


<input type="checkbox"?id="admin"?name="admin"?${employee.admin?'checked':''}>

這里,我們選擇使用EL表達(dá)式的三元運(yùn)算符進(jìn)行判斷,為下拉框添加selected屬性,為復(fù)選框添加checked屬性

編輯的時(shí)候,數(shù)據(jù)能回顯,接下來(lái)的操作和新增一致

刪除功能

和部門的刪除一致,這里就不再贅述

到此,員工的CRUD結(jié)束

高級(jí)查詢

功能需求:輸入關(guān)鍵字和部門信息進(jìn)去過(guò)濾查詢,關(guān)鍵字是根據(jù)姓名和郵箱兩個(gè)字段查詢

頁(yè)面設(shè)計(jì)



高級(jí)查詢效果圖

當(dāng)用戶輸入關(guān)鍵字"趙"和部門"總經(jīng)辦"后,在列表中顯示的查詢結(jié)果則為所有總經(jīng)辦姓趙的員工

那么此時(shí)應(yīng)該執(zhí)行下面的SQL來(lái)查詢相應(yīng)的數(shù)據(jù)

SELECT

??e.id, e.name, e.password, e.email, e.age, e.admin, e.dept_id, d.id d_id, d.name d_name, d.sn d_sn

from

??employee e

LEFT JOIN

??department d

ON

??e.dept_id = d.id

WHERE

??(e.name LIKE concat('%',? ,'%') OR?e.email LIKE concat('%',? ,'%')) AND?e.dept_id = ? LIMIT ?, ?

在該SQL中,WHERE后面的條件是根據(jù)用戶傳遞的高級(jí)查詢相關(guān)的參數(shù)拼接而來(lái)

這里,我們需要解決兩個(gè)問(wèn)題:1.這里的多個(gè)高級(jí)查詢的參數(shù)如何傳遞?對(duì)于這個(gè)問(wèn)題,我們應(yīng)該能夠比較快的想到解決方案---數(shù)據(jù)封裝,如下:

@Setter@Getterpublic?class EmployeeQueryObject extends QueryObject {

????private?String keyword; ?//按照員工名稱與郵箱模糊查詢

????private?Long deptId = -1L; ?//按照部門id查詢


????//當(dāng)keyword為null或者空字符串的時(shí)候,都視為null處理

????public String getKeyword(){

????????return?StringUtils.isEmpty(keyword) ? null?: keyword;

????}

}

2.參數(shù)拿到后,如何拼接到對(duì)應(yīng)的SQL中?使用mybatis中的動(dòng)態(tài)SQL中提供的標(biāo)簽,在mapper映射文件中進(jìn)行SQL的拼接

<sql id="base_where">

????<where>

????????<if?test="keyword != null">

????????????AND( e.name LIKE concat('%',#{keyword} ,'%') OR e.email LIKE concat('%',#{keyword} ,'%'))

????????</if>

????????<if?test="deptId > 0">

????????????AND e.dept_id = #{deptId}

????????</if>

????</where>

</sql>

以上兩個(gè)問(wèn)題解決后,我們就可以根據(jù)用戶傳遞過(guò)來(lái)的參數(shù),執(zhí)行對(duì)應(yīng)的過(guò)濾查詢的SQL最后,和分頁(yè)查詢的邏輯一樣,將數(shù)據(jù)封裝到PageResult中,和分頁(yè)相關(guān)的數(shù)據(jù)一同返回到頁(yè)面效果如[高級(jí)查詢效果圖]所示

好了,基本功能是完成了,我們?cè)賮?lái)看看下面的問(wèn)題:首先,在表單中輸入下面的參數(shù),然后查詢





然后點(diǎn)擊下一頁(yè)進(jìn)行翻頁(yè)




可以看到,在點(diǎn)擊翻頁(yè)之后,我們不是在上面的基礎(chǔ)上查詢下一頁(yè)的數(shù)據(jù),而是查詢到了所有的數(shù)據(jù),WHY?其實(shí)很簡(jiǎn)單,來(lái)看看我們的請(qǐng)求參數(shù),一切就清楚了在我們點(diǎn)擊翻頁(yè)的時(shí)候,傳遞的參數(shù)只有currentPage,并沒有將之前的高級(jí)查詢的參數(shù)一起傳遞到后臺(tái),所以執(zhí)行了下面的SQL查詢到上面的結(jié)果

SELECT

??e.id, e.name, e.password, e.email, e.age, e.admin, e.dept_id, d.id d_id, d.name d_name, d.sn d_sn

from

??employee e

LEFT JOIN

??department d

on

??e.dept_id = d.id limit??, ?

所以,要想在之前高級(jí)查詢的基礎(chǔ)上,繼續(xù)進(jìn)行分頁(yè)查詢,那么我們只有一個(gè)辦法,就是在翻頁(yè)的時(shí)候?qū)⒏呒?jí)查詢和分頁(yè)的參數(shù)一起提交到后臺(tái),拼接執(zhí)行相應(yīng)的SQL才行

解決方案:使用JS來(lái)完成數(shù)據(jù)的提交(JS在目前階段還未進(jìn)行系統(tǒng)學(xué)習(xí),所以,這里大家重點(diǎn)應(yīng)該是放在我們要做的事情上,而不是怎么做)

<script type="text/javascript">

????function?goPage(currentPage) {

//為表單中的currentPage輸入框設(shè)值

????????document.getElementById("currentPage").value = currentPage

//提交表單

????????document.forms[0].submit();

????}

</script>



翻頁(yè)條

<a href="javascript:;"?onclick="goPage(1)">首頁(yè)</a>

<a href="javascript:;"?onclick="goPage(${result.prevPage})">上一頁(yè)</a

<a href="javascript:;"?onclick="goPage(${result.nextPage})">下一頁(yè)</a

<a href="javascript:;"?onclick="goPage(${result.endPage})">尾頁(yè)</a>

在點(diǎn)擊翻頁(yè)按鈕時(shí),調(diào)用定義好的goPage函數(shù),完成其中的兩件事即可此時(shí),我們可以看到問(wèn)題已然解決

最后,頁(yè)面跳轉(zhuǎn)和頁(yè)面大小的設(shè)置功能,我們不做要求,如果要實(shí)現(xiàn)也很簡(jiǎn)單,我這里就直接把相關(guān)代碼貼出來(lái)

跳轉(zhuǎn)到第:<input id="currentPage" name="currentPage" style="width: 80px; text-align: center;"

?????????????type="number" min="1" max="${result.endPage}" value="${result.currentPage}"/>頁(yè)<input type="submit" value="GO"/>

每頁(yè)顯示:<select name="pageSize" onchange="goPage(1);">

????<option ${qo.pageSize==5?"selected='selected'":""}>5</option>

????<option ${qo.pageSize==10?"selected='selected'":""}>10</option>

????<option ${qo.pageSize==15?"selected='selected'":""}>15</option>

????<option ${qo.pageSize==20?"selected='selected'":""}>20</option></select>

好了,高級(jí)查詢的功能實(shí)現(xiàn)到此結(jié)束,我們來(lái)做一個(gè)小結(jié)高級(jí)查詢和分頁(yè)的功能,我們應(yīng)該重點(diǎn)分析兩個(gè)點(diǎn)1.用戶需要看到什么數(shù)據(jù)?2.這些數(shù)據(jù)應(yīng)該執(zhí)行什么樣的SQL才能查詢到?如果將這兩個(gè)問(wèn)題分析清楚了,那么大家就能夠知道這個(gè)過(guò)程中所封裝的幾個(gè)類的作用了QueryObject:封裝查詢對(duì)象中通用的屬性EmployeeQueryObject:封裝高級(jí)查詢相關(guān)的條件參數(shù)PageResult:封裝用戶需要使用到的數(shù)據(jù)

所以實(shí)現(xiàn)步驟大致如下:

1.獲取到用戶傳遞的高級(jí)查詢和分頁(yè)的參數(shù),封裝到對(duì)象的查詢對(duì)象中

2.從查詢對(duì)象中取出數(shù)據(jù),然后拼接SQL

3.將查詢之后得到的結(jié)果,封裝到PageResult對(duì)象中

4.頁(yè)面獲取到PageResult中的數(shù)據(jù)進(jìn)行顯示

看到這,想必你已經(jīng)清楚多條件過(guò)濾的相關(guān)內(nèi)容了,但是這只是眾多項(xiàng)目中小小的一環(huán),要想繼續(xù)提升自己的實(shí)戰(zhàn)能力,多了解相關(guān)信息是很有必要的,如果你對(duì)此感興趣的話,不妨關(guān)注我們,我們會(huì)發(fā)布更多的相關(guān)教程,希望能夠幫助你在java道路上越走越遠(yuǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容