Java課設中的問題以及解決方案(一)

前言

開發環境

  • 系統環境: 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);
		
	}
	
}

因爲也算是半個初學者,直覺告訴我泛型的運用上還有很大的改進餘地.

後記

  • 肝疼,又是一次一個人的大作業,之所以一鼓作氣寫完,是因爲,老實說,隊友和心態問題,沒啥幹勁了.

  • 現實是殘酷的,但是理想必須要是美好的.
  • 最我們感到目盲的,往往不是徹夜的黑暗,而是黑暗過後的第一縷光.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章