前言
開發環境
- 系統環境: macOS Catalina 10.15
- java版本: JDK12
- 開發環境: eclipse 2019-06 (4.12.0)
- 繪圖工具: notebility\Procreate
Ps.界面設計全靠手繪…
github上可以看到源碼
(預計更新時間:2019年11月18日)
不過肯定是運行不了的啦,因爲涉及到一些需要保密的東西.
問題以及解決
數據庫連接問題
導入 java.sql.Connection 依賴包
請大家叫我小可愛鴨!
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/TCM_DICT","root","root");
目前網絡上主流的連接方式爲上述語句
不過在實際操作中發現,這種語句會出現一個紅色的warning. 因爲 mysql5.6 以上的版本要求進行ssl驗證,所以進行如下的改動.
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/TCM_DICT?useSSL=false","root","root");
加上 useSSL=false ,取消驗證即可.
遺留問題
在進行Java-SQL連接時,進行了一些嘗試,最終導致現在每次連接本地數據庫都會報錯(但是可以正常使用),因爲不影響開發,同時也無法找到類似問題的解決方案,所以暫時擱置了,以後會考慮解決.
Java包管理問題
開發過程中不可避免地要用到很多的網絡上的包,一開始我是一個一個下載的,體驗極差.
後來轉念一想,python有pip\conda,那麼Java是否有對應的包管理工具呢?
一查,還真就找到了這樣一個~~~
maven
注意:搜索排行第一頁,有幾篇文章(知乎\csdn)不要看,巨坑無比
maven其實不只是一個包管理工具啦.
具體的maven說明和安裝使用,可以查閱菜鳥教程的maven介紹
主要是以下幾點:
- maven安裝
- maven項目建立
- maven座標如何導入
最終,能夠通過幾行xml,完成jar包的導入
下述示例爲導入fastjson包,是否比自己下載要方便很多呢?
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
同時,推薦一個maven倉庫,大多數的依賴包的maven座標可以從中獲取.
多線程問題
實現一個類似於異步進度條的功能
課設涉及到一個本地和服務器端交互過程,所以想要設計一個進度條,不然交互的那段時間(5s-1min,視用戶分析的數據量決定)實在是煎熬.
預想的是類似bash交互,Waiting… -> success 這樣.
Demo的代碼比較少,所以就直接列出來了.
參照課本上的多線程一章(明明後面有很多很重要的章節,但是竟然不講,實在是一言難盡).
class labelControl1 extends Thread{
public JLabel matrixLoder;
public labelControl1(JLabel matrixLoder) {
this.matrixLoder = matrixLoder;
}
@Override
public void run() {
String str = "Waiting " ;
while(true) {
if(global_bool.laberFlag1) {
matrixLoder.setText("success");
break;
}
System.out.println("111111");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(str.equals("Waiting ......")) {
str = "Waiting ";
}
str += ".";
matrixLoder.setText(str);
}
}
}
csv轉json
本來是準備excel轉json的,POI都下載好了,後來發現只是csv轉json而已~再一次深刻體會到了csv與excel的差別.
核心代碼:
public static String json_str(String path) throws Exception {
File input = new File(path);
CsvSchema csvSchema = CsvSchema.builder().setUseHeader(true).build();
CsvMapper csvMapper = new CsvMapper();
List readAll = csvMapper.readerFor(Map.class).with(csvSchema).readValues(input).readAll();
ObjectMapper mapper = new ObjectMapper();
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(readAll);
}
返回的爲符合JSON格式要求的String類型,再將它轉換爲JSON即可.
網絡編程
中文亂碼
編碼問題是每一個非英文程序員都要經歷的的噩夢吧_
StringEntity entity = new StringEntity(js,Charset.forName("UTF-8"));
post請求
核心代碼如下
public static String sendPost(String js,String url) throws Exception {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("data",js);
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
String result = "";
// 創建httpClient實例
httpClient = HttpClients.createDefault();
// 創建httpPost遠程連接實例
HttpPost httpPost = new HttpPost(url);
// 配置請求參數實例
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(350000)// 設置連接主機服務超時時間
.setConnectionRequestTimeout(350000)// 設置連接請求超時時間
.setSocketTimeout(600000)// 設置讀取數據連接超時時間
.build();
// 爲httpPost實例設置配置
httpPost.setConfig(requestConfig);
// 設置請求頭
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
// 封裝post請求參數
if (null != paramMap && paramMap.size() > 0) {
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
// 通過map集成entrySet方法獲取entity
Set<Entry<String, Object>> entrySet = paramMap.entrySet();
// 循環遍歷,獲取迭代器
Iterator<Entry<String, Object>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Entry<String, Object> mapEntry = iterator.next();
nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
}
StringEntity entity = new StringEntity(js,Charset.forName("UTF-8"));
httpPost.setEntity(entity);
}
try {
// httpClient對象執行post請求,並返回響應參數對象
httpResponse = httpClient.execute(httpPost);
// 從響應對象中獲取響應內容
HttpEntity entity = httpResponse.getEntity();
result = EntityUtils.toString(entity);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關閉資源
if (null != httpResponse) {
try {
httpResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != httpClient) {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// System.out.println(result);
return result;
}
本次的開發中沒有用到get請求,不過掌握了post請求,那麼邏輯更加簡單的get還不是手到擒來.
關於全局變量
Java的全局變量機制與C#類似,都是訪問類的靜態成員變量.
所以我建立了一個Global_pool來維護基本全局變量.
示例:
package haru.utils;
public class global_bool {
public static boolean laberFlag1,labelFlag2,labelFlag3;
public static String url1 = "http://127.0.0.1:5000/admin/api/java_homework_01_matrix";
public static String url2 = "http://127.0.0.1:5000/admin/api/java_homework_content";
public static String url3 = "http://127.0.0.1:5000/admin/api/java_homework_pro";
public static String url4 = "http://127.0.0.1:5000/admin/get_excel_recipe_html_java";
public static String url5 = "http://127.0.0.1:5000/admin/get_truely_network_graph";
}
macOS如何打開網頁
對於Windows用戶來說,使用一個簡單的Desktop類就能簡單解決的問題,在Mac用戶這裏就成了問題.
找了很多的回答,所謂的萬能方案,emmmm,好吧已經老得跟不上版本了.
最終,我在stackoverFlow上找到了答案.
直接調用terminal執行命令.
啊,又打開了一扇新世界的大門(可以通過後臺實現更多的功能哦).
String Command="open "+"http://google.ca";
Process Child=Runtime.getRuntime().exec(Command);
Ps. runtime 是隸屬於 java.lang 的,不用下載~
Jtable列數太多,要實現橫向的滑動
去掉自動大小變換就行了
tb.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
同時,獻上自己寫的json2table的核心代碼
import java.awt.BorderLayout;
import java.awt.Container;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class json2table extends JFrame{
JTable tb;
Object a[][],b[];
public json2table(String s1,String name) {
JSONObject js = new JSONObject();
js = JSON.parseObject(s1);
HashSet<String> row =new HashSet<String>();
List<String> cols = new ArrayList<>(js.keySet());
List<String> rows = new ArrayList<>(js.getJSONObject(cols.get(0)).keySet());
a = new Object[rows.size()][cols.size()];
for (int i = 0; i < cols.size(); i++) {
JSONObject eachcol = js.getJSONObject(cols.get(i));
for (int j = 0; j < rows.size(); j++) {
// System.out.println(eachcol.getString(rows.get(j)));
a[j][i] = eachcol.getString(rows.get(j));
}
}
tb = new JTable(a,cols.toArray());
System.out.println(rows);
System.out.println(cols);
Container con = getContentPane();
getContentPane().add(new JScrollPane(tb),BorderLayout.CENTER);
tb.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
setTitle(name);
setSize(10000,10000);
setVisible(true);
validate();
setDefaultCloseOperation(HIDE_ON_CLOSE);
}
}
因爲也算是半個初學者,直覺告訴我泛型的運用上還有很大的改進餘地.
後記
- 肝疼,又是一次一個人的大作業,之所以一鼓作氣寫完,是因爲,老實說,隊友和心態問題,沒啥幹勁了.
- 現實是殘酷的,但是理想必須要是美好的.
- 最我們感到目盲的,往往不是徹夜的黑暗,而是黑暗過後的第一縷光.
- 最後,謝謝^_^