Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)
相關(guān)閱讀:
Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(一)
本篇開(kāi)始正式與后臺(tái)(java語(yǔ)言)進(jìn)行數(shù)據(jù)交互,使用的平臺(tái)為
JDK:java 1.8.0_71
myEclisp 2015 Stable 2.0
Apache Tomcat-8.0.30
Mysql 5.7
Navicat for mysql 11.2.5(mysql數(shù)據(jù)庫(kù)管理工具)
一、數(shù)據(jù)庫(kù)部分
1、創(chuàng)建數(shù)據(jù)庫(kù)
使用Navicat for mysql創(chuàng)建數(shù)據(jù)庫(kù)(使用其他工具或直接使用命令行暫不介紹)
2、
2.創(chuàng)建表
雙擊打開(kāi)上步創(chuàng)建數(shù)據(jù)庫(kù)——右擊Tables——選擇New Table
建立如下字段 保存時(shí)會(huì)提示輸入表名
二、程序部分
1、新建項(xiàng)目
使用myEclipse新建——Web Project
輸入項(xiàng)目名稱(chēng) 選擇java和運(yùn)行該項(xiàng)目的Tomcat 一直點(diǎn)下一步 直到下圖頁(yè)面 點(diǎn)選下面自動(dòng)生成web.xml文件的復(fù)選框 后完成
創(chuàng)建如下包結(jié)構(gòu)并新建一個(gè)vo類(lèi)(屬性與數(shù)據(jù)庫(kù)字段一一對(duì)應(yīng))
demo.java
package com.xeonmic.vo; public class demo { private int id; private String name; private int type; private double pay; private String text; public demo() { // TODO Auto-generated constructor stub } public demo(int id, int type, Double pay,String name, String text) { this.id = id; this.name = name; this.type = type; this.pay = pay; this.text = text; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getType() { return type; } public void setType(int type) { this.type = type; } public double getPay() { return pay; } public void setPay(Double pay) { this.pay = pay; } public String getText() { return text; } public void setText(String text) { this.text = text; } @Override public String toString() { return "demo [id=" + id + ", name=" + name + ", type=" + type + ", pay=" + pay + ", text=" + text + "]"; } }
2、導(dǎo)入數(shù)據(jù)庫(kù)連接和JSON文件的jar包
數(shù)據(jù)庫(kù)連接jar包可以在mysql安裝目錄的如下目錄查找到
另外下載JSON所需jar包,已上傳百度云(http://pan.baidu.com/s/1dETGjRV)一起復(fù)制粘貼到WebRoot/WEB-INF/lib目錄下
然后全選右鍵添加到構(gòu)建路徑
3、DAO設(shè)計(jì)模式的基本分層實(shí)現(xiàn)
參考《Java Web開(kāi)發(fā)實(shí)戰(zhàn)經(jīng)典基礎(chǔ)篇》這里不在敘述直接貼源碼后續(xù)單獨(dú)開(kāi)一篇專(zhuān)門(mén)講這部分基礎(chǔ)知識(shí)
—3.1、DatabaseConnection.java
package com.xeonmic.dbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseConnection { private static final String DBDRIVER="org.gjt.mm.mysql.Driver"; private static final String DBURL="jdbc:mysql://localhost:3306/jqgriddemo"; private static final String DBUSER="root"; private static final String DBPASSWORD="1234"; private Connection conn =null; public DatabaseConnection(){ try { Class.forName(DBDRIVER); this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); } catch (ClassNotFoundException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } catch (SQLException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } //System.out.println("連接數(shù)據(jù)庫(kù)成功"); } public Connection getConnection(){ return this.conn; } public void close(){ if(this.conn != null){ try { this.conn.close(); } catch (SQLException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } } } }
—3.2、DemoDAO.java
package com.xeonmic.dao; import java.util.List; import com.xeonmic.vo.demo; public interface DemoDAO { //添加方法 public boolean doCreate(demo demo); //查詢方法 public List<demo> doSearch(String keys); //刪除方法 public boolean doDelete(int id); //修改方法 public boolean doChange(demo demo); }
—3.3、DemoDAOImpl.java
package com.xeonmic.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.xeonmic.dao.DemoDAO; import com.xeonmic.vo.demo; public class DemoDAOImpl implements DemoDAO { private Connection conn = null; private PreparedStatement pstmt = null; public DemoDAOImpl(Connection conn){ this.conn=conn; } @Override public boolean doCreate(demo demo) { boolean flag = false; String sql = "INSERT INTO t_demo(type,pay,name,text ) VALUES(?,?,?,?)"; try { this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, demo.getType()); this.pstmt.setDouble(2, demo.getPay()); this.pstmt.setString(3, demo.getName()); this.pstmt.setString(4, demo.getText()); if(this.pstmt.executeUpdate()>0){ flag = true; } this.pstmt.close(); } catch (SQLException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } return flag; } @Override public List<demo> doSearch(String keys) { // TODO Auto-generated method stub if (keys==null) { keys=""; } String sql = "SELECT id,name,type,pay,text FROM t_demo "+keys; List<demo> all = new ArrayList<demo>(); System.out.println(sql); try { this.pstmt = this.conn.prepareStatement(sql); ResultSet rs = this.pstmt.executeQuery(); demo demo = null; while(rs.next()){ demo = new demo(rs.getInt("id"),rs.getInt("type"),rs.getDouble("pay"),rs.getString("name"),rs.getString("text")); all.add(demo); } this.pstmt.close(); } catch (SQLException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } return all; } @Override public boolean doDelete(int id) { boolean flag = false; String sql = "DELETE FROM t_demo WHERE id = ?"; try { this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, id); if(this.pstmt.executeUpdate()>0){ flag = true; } this.pstmt.close(); } catch (SQLException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } return flag; } @Override public boolean doChange(demo demo) { boolean flag = false; String sql = "UPDATE t_demo SET type=?,pay=?,name=?,text=? WHERE id=?"; try { this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(5, demo.getId()); this.pstmt.setInt(1, demo.getType()); this.pstmt.setDouble(2, demo.getPay()); this.pstmt.setString(3, demo.getName()); this.pstmt.setString(4, demo.getText()); if(this.pstmt.executeUpdate()>0){ flag = true; } this.pstmt.close(); } catch (SQLException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } return flag; } }
—3.5、Factory.java
package com.xeonmic.factory; import com.xeonmic.dao.DemoDAO; import com.xeonmic.dao.proxy.DemoDAOProxy; public class Factory { public static DemoDAO getDemoDAOInstance(){ return new DemoDAOProxy(); } }
—3.6、Demotest.java(對(duì)前面的方法進(jìn)行一次簡(jiǎn)單測(cè)試)
package com.xeonmic.test; import java.util.LinkedList; import java.util.List; import com.xeonmic.factory.Factory; import com.xeonmic.vo.demo; public class Demotest { public static void main(String[] args) { demo demo1 = new demo(); demo1.setName("Name"); demo1.setPay(0.98); demo1.setType(1); demo1.setText("Text"); doCreate(demo1); doSearch(null); if (doSearch(null)!=null&&!doSearch(null).isEmpty()) { demo1 = doSearch("").get(0); demo1.setText("Change Text"); doChange(demo1); doSearch("WHERE id = "+demo1.getId()); doDelete(demo1.getId()); doSearch(null); } } public static List<demo> doSearch(String keys) { List<demo> allDemos = new LinkedList<demo>(); allDemos = Factory.getDemoDAOInstance().doSearch(keys); for (demo demo : allDemos) { System.out.println(demo.toString()); } return allDemos; } public static void doCreate(demo demo) { if (Factory.getDemoDAOInstance().doCreate(demo)) { System.out.println("添加成功"); }else { System.out.println("添加失敗"); } } public static void doChange(demo demo) { if (Factory.getDemoDAOInstance().doChange(demo)) { System.out.println("修改成功"); }else { System.out.println("修改失敗"); } } public static void doDelete(int id) { if (Factory.getDemoDAOInstance().doDelete(id)) { System.out.println("刪除成功"); }else { System.out.println("刪除失敗"); } } } /* * 輸出結(jié)果 添加成功 SELECT id,name,type,pay,text FROM t_demo demo [id=1, name=Name, type=1, pay=0.98, text=Text] SELECT id,name,type,pay,text FROM t_demo demo [id=1, name=Name, type=1, pay=0.98, text=Text] SELECT id,name,type,pay,text FROM t_demo demo [id=1, name=Name, type=1, pay=0.98, text=Text] SELECT id,name,type,pay,text FROM t_demo demo [id=1, name=Name, type=1, pay=0.98, text=Text] 修改成功 SELECT id,name,type,pay,text FROM t_demo WHERE id = 1 demo [id=1, name=Name, type=1, pay=0.98, text=Change Text] 刪除成功 SELECT id,name,type,pay,text FROM t_demo * */
4、JSP頁(yè)面和Servlet部分(重要)
—4.1、index.jsp(將index.html中html標(biāo)簽到html標(biāo)簽中的內(nèi)容替換index.jsp中html的內(nèi)容并對(duì)JS進(jìn)行如下修改)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>DEMO</title> <link rel="stylesheet" type="text/css" href="css/jquery-ui.min.css" /> <link rel="stylesheet" type="text/css" href="css/jquery-ui.theme.min.css" /> <link rel="stylesheet" type="text/css" href="css/ui.jqgrid-bootstrap-ui.css" /> <link rel="stylesheet" type="text/css" href="css/ui.jqgrid.css" /> </head> <body> <div class="main" id="main"> <!--jqGrid所在--> <table id="grid-table"></table> <!--jqGrid 瀏覽導(dǎo)航欄所在--> <div id="grid-pager"></div> </div> <script src="js/jquery-1.11.0.min.js" type="text/javascript" charset="utf-8"></script> <script src="js/i18n/grid.locale-cn.js" type="text/javascript" charset="utf-8"></script> <script src="js/jquery.jqGrid.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> //當(dāng) datatype 為"local" 時(shí)需填寫(xiě) var grid_selector = "#grid-table"; var pager_selector = "#grid-pager"; $(document).ready(function() { $("#grid-table").jqGrid({ //用于檢索的Servlet URL url:"<%=basePath%>"+"demoServlet", //用于添加、修改、刪除的Servlet URL editurl: "<%=basePath%>"+"demochangeServlet", //data: grid_data, //當(dāng) datatype 為"local" 時(shí)需填寫(xiě) datatype:"json", //數(shù)據(jù)來(lái)源,本地?cái)?shù)據(jù)(local,json,jsonp,xml等) height: 150, //高度,表格高度。可為數(shù)值、百分比或'auto' mtype:"GET",//提交方式 colNames: ['出庫(kù)單號(hào)', '出庫(kù)類(lèi)型', '總金額', '申請(qǐng)人(單位)', '備注'], colModel: [{ name: 'id', index: 'id', //索引。其和后臺(tái)交互的參數(shù)為sidx key: true, //當(dāng)從服務(wù)器端返回的數(shù)據(jù)中沒(méi)有id時(shí),將此作為唯一rowid使用只有一個(gè)列可以做這項(xiàng)設(shè)置。如果設(shè)置多于一個(gè),那么只選取第一個(gè),其他被忽略 width: 100, editable: false, editoptions: { size: "20", maxlength: "30" } }, { name: 'type', index: 'type', width: 200, //寬度 editable: true, //是否可編輯 edittype: "select", //可以編輯的類(lèi)型??蛇x值:text, textarea, select, checkbox, password, button, image and file.s editoptions: { value: "1:采購(gòu)入庫(kù);2:退用入庫(kù)" } }, { name: 'pay', index: 'pay', width: 60, sorttype: "double", editable: true }, { name: 'name', index: 'name', width: 150, editable: true, editoptions: { size: "20", maxlength: "30" } }, { name: 'text', index: 'text', width: 250, sortable: false, editable: true, edittype: "textarea", editoptions: { rows: "2", cols: "10" } }, ], viewrecords: true, //是否在瀏覽導(dǎo)航欄顯示記錄總數(shù) rowNum: 10, //每頁(yè)顯示記錄數(shù) rowList: [10, 20, 30], //用于改變顯示行數(shù)的下拉列表框的元素?cái)?shù)組。 pager: pager_selector, //分頁(yè)、按鈕所在的瀏覽導(dǎo)航欄 altRows: true, //設(shè)置為交替行表格,默認(rèn)為false //toppager: true,//是否在上面顯示瀏覽導(dǎo)航欄 multiselect: true, //是否多選 //multikey: "ctrlKey",//是否只能用Ctrl按鍵多選 multiboxonly: true, //是否只能點(diǎn)擊復(fù)選框多選 // subGrid : true, //sortname:'id',//默認(rèn)的排序列名 //sortorder:'asc',//默認(rèn)的排序方式(asc升序,desc降序) caption: "采購(gòu)?fù)素泦瘟斜?, //表名 autowidth: true //自動(dòng)寬 }); //瀏覽導(dǎo)航欄添加功能部分代碼 $(grid_selector).navGrid(pager_selector, { search: true, // 檢索 add: true, //添加 (只有editable為true時(shí)才能顯示屬性) edit: true, //修改(只有editable為true時(shí)才能顯示屬性) del: true, //刪除 refresh: true //刷新 }, {}, // edit options {}, // add options {}, // delete options { multipleSearch: true } // search options - define multiple search ); }); </script> </body> </html>
—4.2、demoServlet.java
package com.xeonmic.action; import java.io.IOException; import java.util.LinkedList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import com.xeonmic.factory.Factory; import com.xeonmic.vo.demo; /** * Servlet implementation class demoServlet */ public class demoServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //這里不設(shè)置編碼會(huì)有亂碼 response.setContentType("text/html;charset=utf-8"); response.setHeader("Cache-Control", "no-cache"); int rows = Integer.valueOf(request.getParameter("rows")); //每頁(yè)中顯示的記錄行數(shù) int page = Integer.valueOf(request.getParameter("page")); //當(dāng)前的頁(yè)碼 String sord = request.getParameter("sord");//排序方式 String sidx = request.getParameter("sidx");//排序列名 Boolean search =(request.getParameter("_search").equals("true"))?true:false;//是否用于查詢請(qǐng)求 List<demo> allList = new LinkedList<demo>();//返回結(jié)果集 String keys="";//查詢條件字符串 if(search){ keys=" WHERE "; String filters = request.getParameter("filters");//具體的條件 System.out.println(filters); //傳入數(shù)據(jù)的格式是類(lèi)似這樣的:"{"groupOp":"AND","rules":[{"field":"id","op":"eq","data":"1"},{"field":"type","op":"ew","data":"2"}]}" JSONObject jsonObject = JSONObject.fromObject(filters); String groupOp = "AND";//每個(gè)規(guī)則之間的關(guān)系(and/or) if (jsonObject.getString("groupOp")!=null&&!"".equals(jsonObject.getString("groupOp"))) { if (jsonObject.getString("groupOp").equals("OR")) { groupOp = "OR"; } } JSONArray rulesjson = jsonObject.getJSONArray("rules"); //遍歷每個(gè)條件 for (int z=0; z < rulesjson.size(); z++) { Object t = rulesjson.get(z); JSONObject rulejson = JSONObject.fromObject(t); String field = rulejson.getString("field"); String op = rulejson.getString("op"); String data = rulejson.getString("data"); String string = "";//用于存儲(chǔ)單個(gè)條件sql語(yǔ)句片段 //開(kāi)始轉(zhuǎn)化為sql語(yǔ)句 switch (op) { case "eq"://相等 string=" = '"+data+"' "; break; case "ne"://不相等 string=" <> '"+data+"' "; break; case "li"://小于 string=" < '"+data+"' "; break; case"le"://小于等于 string=" <= '"+data+"' "; break; case"gt"://大于 string=" > '"+data+"' "; break; case "ge"://大于等于 string=" >= '"+data+"' "; break; case "bw"://在...之間 { if (data.split(",").length==2) { string=" BETWEEN '"+data.split(",")[0]+"' AND '"+data.split(",")[1]+"' "; }else { string=" = '"+data+"' ";//數(shù)據(jù)錯(cuò)誤時(shí)處理 } } break; case"bn"://不在...之間 { if (data.split(",").length==2) { string=" NOT BETWEEN '"+data.split(",")[0]+"' AND '"+data.split(",")[1]+"' "; }else { string=" <> '"+data+"' ";//數(shù)據(jù)錯(cuò)誤時(shí)處理 } } break; case"ew"://以...結(jié)束 string=" LIKE '%"+data+"' "; break; case "en"://不以...結(jié)束 string=" NOT LIKE '%"+data+"' "; break; case "cn"://包含 string=" LIKE '%"+data+"%' "; break; case "nc"://不包含 string=" NOT LIKE '%"+data+"%' "; break; case "in"://在 { string=" IN ( "; String[] datas = data.split(","); for (int i = 0; i < datas.length; i++) { string+= " '"+datas[i]+"' "; if (i!=datas.length-1) { string += ","; }else { string += " ) "; } } } break; case "ni"://不在 { string=" NOT IN ( "; String[] datas = data.split(","); for (int i = 0; i < datas.length; i++) { string+= " '"+datas[i]+"' "; if (i!=datas.length-1) { string += ","; }else { string += " ) "; } } } break; default: op=null; System.out.println("OP符號(hào)錯(cuò)誤");//OP符號(hào)錯(cuò)誤 } if (op!=null) { if (z==rulesjson.size()-1) { keys+=" "+field+" "+string +" "; }else { keys+=" "+field+" "+string +" "+groupOp+" "; } } } } //升降序SQL語(yǔ)句轉(zhuǎn)換 if (sidx!=null&&!"".equals(sidx)) { System.out.println(sidx); keys += " ORDER BY " + sidx; System.out.println("sord="+sord); if (!sord.equals("asc")) { keys += " DESC "; } } allList = Factory.getDemoDAOInstance().doSearch(keys); //分頁(yè)部分 int total=0; total=(allList.size()%rows==0)?(allList.size()/rows):((allList.size()/rows)+1); int j = 0; int m = (page-1)*rows; int n = (page-1)*rows+rows; JSONArray jArray = new JSONArray(); for (j=m; j<allList.size()&&j<n; j++) { jArray.add(JSONObject.fromObject(allList.get(j))); } JSONObject jjson = new JSONObject(); //檢索結(jié)果及分頁(yè)信息封裝 返回 jjson.accumulate("page", page); jjson.accumulate("total", total); jjson.accumulate("records", allList.size()); jjson.accumulate("rows", jArray); System.out.println(jjson.toString()); response.getWriter().write(jjson.toString()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doGet(request, response); } }
—4.3、demochangeServlet.java
package com.xeonmic.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.xeonmic.factory.Factory; import com.xeonmic.vo.demo; public class demochangeServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean flag = false; String oper =request.getParameter("oper"); switch (oper) { case "del": { String[] ids = request.getParameter("id").split(","); for (int i = 0; i < ids.length; i++) { int id =Integer.valueOf(ids[i]); flag=Factory.getDemoDAOInstance().doDelete(id); } } break; case "add": { int type = Integer.valueOf(request.getParameter("type")); Double pay = Double.valueOf(request.getParameter("pay")); String name = request.getParameter("name"); String text = request.getParameter("text"); demo demo = new demo(-1,type,pay,name,text); flag = Factory.getDemoDAOInstance().doCreate(demo); } break; case "edit": { int id = Integer.valueOf(request.getParameter("id")); int type = Integer.valueOf(request.getParameter("type")); Double pay = Double.valueOf(request.getParameter("pay")); String name = request.getParameter("name"); String text = request.getParameter("text"); demo demo = new demo(id,type,pay,name,text); flag = Factory.getDemoDAOInstance().doChange(demo); } break; default: break; } System.out.println(flag); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
—4.4、web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>jqGrid</display-name> <servlet> <servlet-name>demoServlet</servlet-name> <servlet-class>com.xeonmic.action.demoServlet</servlet-class> </servlet> <servlet> <servlet-name>demochangeServlet</servlet-name> <servlet-class>com.xeonmic.action.demochangeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>demoServlet</servlet-name> <url-pattern>/demoServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>demochangeServlet</servlet-name> <url-pattern>/demochangeServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
至此,jqGrid單表功能已全部實(shí)現(xiàn),例子中有哪些設(shè)計(jì)有問(wèn)題請(qǐng)告知,下一篇將開(kāi)始解決 主從表 的設(shè)計(jì)實(shí)現(xiàn),敬請(qǐng)關(guān)注腳本直接網(wǎng)站!
- 零基礎(chǔ)寫(xiě)Java知乎爬蟲(chóng)之進(jìn)階篇
- Java進(jìn)階學(xué)習(xí):jar打包詳解
- Java 正則表達(dá)式入門(mén)詳解(基礎(chǔ)進(jìn)階)
- Java異常處理之try...catch...語(yǔ)句的使用進(jìn)階
- Java進(jìn)階:JNI使用技巧點(diǎn)滴
- Java進(jìn)階教程之IO基礎(chǔ)
- Java進(jìn)階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程
- 深入學(xué)習(xí)Java編程中的字符串的進(jìn)階使用
- 老生常談Java字符串進(jìn)階(必看篇)
- 開(kāi)發(fā)10年,全記在這本Java進(jìn)階寶典里了
相關(guān)文章
Redis有效時(shí)間設(shè)置以及時(shí)間過(guò)期處理操作
這篇文章主要介紹了Redis有效時(shí)間設(shè)置以及時(shí)間過(guò)期處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11java中的類(lèi)URL與URLConnection使用介紹
這篇文章主要為大家介紹了java中的類(lèi)URL與URLConnection使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Spring Cloud EureKa Ribbon 服務(wù)注冊(cè)發(fā)現(xiàn)與調(diào)用
這篇文章主要介紹了Spring Cloud EureKa Ribbon 服務(wù)注冊(cè)發(fā)現(xiàn)與調(diào)用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02springboot實(shí)現(xiàn)jar運(yùn)行復(fù)制resources文件到指定的目錄(思路詳解)
這篇文章主要介紹了springboot實(shí)現(xiàn)jar運(yùn)行復(fù)制resources文件到指定的目錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Spring?Boot實(shí)現(xiàn)熱部署的五種方式
這篇文章主要介紹了Spring?Boot?五種熱部署方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01Java并發(fā)統(tǒng)計(jì)變量值偏差原因及解決方案
這篇文章主要介紹了Java并發(fā)統(tǒng)計(jì)變量值偏差原因及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06關(guān)于Jsoup將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑的方法
這篇文章主要介紹了關(guān)于Jsoup將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑的方法,jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容,需要的朋友可以參考下2023-04-04