赞
踩
前言:服务器无人更新维护,不得不从PHP转型为Java Web,而且是要在刚刚接触C不久的新成员学习Java基础后才能开始搭建新的服务器。唉,这个过程实在是有些漫长,必须的服务器端测试没法进行,无奈只能想办法自己搭建一个测试用的简易服务器了。。。
因此,作为一天半前才刚刚接触服务器概念的萌新,很多代码只是照葫芦画瓢,并不知其意,服务器也只求能用。博客仅描述搭建过程与解决所遇到的问题,不喜勿喷,大佬勿喷。
搭建工具:IDEA 2020.2.3、Tomcat 9.0.39、ngrok
数据库:MySQL 8.0
构建项目
首先使用IDEA创建一个SpringBoot框架的项目(选择Spring Initializr,在Dependencies页勾选Web --> Spring Web),在项目自动补充pom.xml配置并一番下载后,你就可能遇到第一个错误:
spring-boot-maven-plugin报红
一番搜索后大致找出原因在于maven远程库并不包含该jar文件,为避免下载时自动到maven远程库,需指定版本,具体添加版本可根据pom配置中以下代码确定(选择其它的版本可能不会解决问题)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
于是如此添加
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.5.RELEASE</version>
</plugin>
重新下载一下即可
项目代码
首先是代码结构,以最常见的User下手:
项目包名下:
包名controller(个人认为应该是做业务处理的)
类UserController(在此类中部分方法前有注解映射)
包名entity(其下为实体类)
类User
包名repository
包名impl
类UserRepository(类前要加@Repository注解)
接口UserRepository
具体的代码可由此参阅(其中也有项目的构建过程),个人只做了部分名字的更改以及不同电脑不同版本下错误的修正。
数据库环境
这里使用MySQL 8.0作为数据库服务,在IDEA的项目结构中,选中Modules,右侧 “+” 添加JAR文件,可在MySQL安装目录的 Connector J 8.0 文件夹下找到 mysql-connector-java-8.0.21.jar 文件,配置好后确定即可在项目中与MySQL做交互。
与数据库交互
可额外增建一个用于与数据库交互的工具类,如下:
public class SQLTools { private static final String URL = "jdbc:mysql://localhost:3306/Your_Database_Name?serverTimezone=Asia/Shanghai";// 若不设置时区,将会报错 private static final String USER = "root"; private static final String PASSWORD = "Your password"; private static Connection connection = null;// 数据库的连接对象 /** * 连接数据库test. * * @return true表示连接成功,false表示连接失败 */ public static boolean linkDatabase() { try { connection = DriverManager.getConnection(URL, USER, PASSWORD); } catch (SQLException e) { System.out.println("连接失败:" + e.getMessage()); return false; } return true; } /** * 查询数据表. * * @param tableName 被查询的数据表名 * @param key 查询数据表中指定列的列名 * @return 返回由Map构成的List集合,Map中的键与查询的key值一一对应 */ public static List<Map<String, String>> queryDBTable(String tableName, String... key) { if (connection == null) { System.out.println("未连接数据库或连接失败"); return null; } Map<String, String> map; List<Map<String, String>> list = new ArrayList<>(); try (Statement statement = connection.createStatement()) { ResultSet resultSet = statement.executeQuery("select * from " + tableName); while (resultSet.next()) { map = new HashMap<>(); for (String theKey : key) { map.put(theKey, resultSet.getString(theKey)); } list.add(map); } } catch (SQLException e) { System.out.println("查询异常"); return null; } return list; } /** * 关闭与数据库的连接. */ public static void closeLink() { if (connection != null) { try { connection.close(); } catch (SQLException e) { // ignore } } } }
该类中只进行了查询
题外话:在交互的设计中,亦考虑过密码暴露的问题,搜索后发现可能有些复杂,又考虑仅个人使用,便没有寻求解决办法
然后在业务处理的代码中调用即可
@RequestMapping(value = "/getUserDataFromSQL", method = RequestMethod.GET)
public String getUserDataFromSQL() {
if (SQLTools.linkDatabase()) {
List<Map<String, String>> queryResult = SQLTools.queryDBTable("some_users", "user_name", "user_password");
if (queryResult != null)
return queryResult.toString();
SQLTools.closeLink();
}
return "NULL";
}
外网访问
通过使用ngrok工具达成
运行项目后,然后使用
ngrok http 8080
命令即可,8080为Tomcat配置的端口号,执行成功后如下图。其中Session Expires表示本次可访问的剩余时间,Forwarding即为外网可访问的域名,免费版的ngrok工具每次使用时,域名都会随机变更
然后比如此次即可通过https://17ef194d1581.ngrok.io/getUserDataFromSQL访问( /getUserDataFromSQL 为方法中通过RequestMapping注解的映射)
访问截图如下
服务器请求测试
通过okhttp测试,代码如下
sendRequest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Callback callback = new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { Log.d(TAG, "请求失败"); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { Log.d(TAG, "请求成功"); ResponseBody body = response.body(); if (body == null) Log.d(TAG, "返回结果为空"); else { Log.d(TAG, "返回结果:" + body.string()); } } }; OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://17ef194d1581.ngrok.io/getUserDataFromSQL") .build(); client.newCall(request).enqueue(callback); } });
点击后请求结果如下图:
个人总结
虽然说,这个服务器破洞百出,太过寒碜,但这无疑是我编程生涯中一段难忘的经历,衷心希望各位同僚亦能有如此经历。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。