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用户这里就
20000
成了问题.
找了很多的回答,所谓的万能方案,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); } }
因为也算是半个初学者,直觉告诉我泛型的运用上还有很大的改进余地.
后记
- 肝疼,又是一次一个人的大作业,之所以一鼓作气写完,是因为,老实说,队友和心态问题,没啥干劲了.
- 现实是残酷的,但是理想必须要是美好的.
- 最我们感到目盲的,往往不是彻夜的黑暗,而是黑暗过后的第一缕光.
- 最后,谢谢^_^
- 点赞 1
- 收藏
- 分享
- 文章举报
- Java课设中的问题以及解决方案(二)
- Java课设中的问题以及解决方案(三)
- macos java开发环境配置
- Java多线程
- Java基础——Java入门与环境搭建
- java获取行政区划获取到街道
- SpringBoot学习之路
- 在SpringJPA中的pojo类的格式
- 初识Spring
- ssm-crud(spring+springmvc+mybatis)
- java中的Lang包(1)——java基础(6)
- java中的异常——java基础(7)
- java中的lang包(2)——java基础(8)
- io包——java基础(12)
- sql数据库基础——java(14)
- SpringBoot 打包
- 001、第一个Spring Boot程序
- 005、简单的spring jdbc操作
- 006、spring的事务抽象
- 007、spring boot jpa