又是许久没更新博客了。但最近好在有些事情忙完了。今天针对我在做的个人项目后台技术进行详细的记录。希望可以帮助一些想自己搭建简易接口开发的同学,更好的了解客户端的网络请求机制。
首先我们需要的开发工具和环境(这里不区分mac和windows,区别不大)
由于我们的接口开发语言是java,那么当然还是以eclipse为主。这里我使用的是带有web插件的eclipse。我们俗称javaEE。(当然很多人会使用myeclipse这也不错)
想要搭建服务器,tomcat当然必不可少。这里使用的是7.0,而且是以插件的形式存在于eclipse中。
做服务器开发的同学当然知道数据库也是必不可少的,咱不能做一个没有真实数据的接口。数据库用的mysql。
这些工具网上都是可以百度进行下载的。这里不赘述了。
数据库创建以及java中jdbc驱动加载数据库
不熟悉数据库的小伙伴可以下载一个可视化的数据库操作界面。比如sqlGUI、navicat for mysql 等等都是不错的操作界面,也很简单。我们可以通过这些可视化工具来建表,增加数据等等。当然有些同学可能数据库语句很熟悉了,可以通过shell指令来操作。
以mac为例:安装好mysql后可点击系统偏好设置能看到mysql服务,如图:
然后点击图标可以看到服务是否启动,没有启动就点击启动就可以了。如图这个是启动了:
接下来打开终端:首先输入mysql所在目录PATH=”$PATH”:/usr/local/mysql/bin
回车后输入如下:mysql -u root -p ,回车会提示输入密码。输入密码后回车就成功链接mysql 服务了。如图:
这时候我们可以创建数据库,创建表格等等。
- 接下来就是我们重点的接口工程的创建了
我们打开下载好的带插件的javaEE 右击创建动态web项目。新建好的目录工程如图:
我们需要关心的目录主要在src 目录,里面存放正常的java代码。然后是WebContent目录下的Web—INF目录。这里我们看到已经存在lib目录了,其实就是存放第三方jar包的。我们还需要手动创建config文件夹,其中创建一个config.properties文件用于存放链接数据库驱动的配置文件。具体的内容如下:
driverclass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testdatabase?useUnicode=true&characterEncoding=UTF-8username=rootpassword=12345
这里就是加载mysqljdbc驱动的关键代码,其中数据库名称,用户名密码等都必须正确不然是无法连接的。如图:
当然我们还得知道webContent目录下可以存放我们web工程的html、jsp、js、css等页面。
接下来有个重点的关于servlet接口的配置文件,结构如图:
其中具体配置如下:
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> //静态配置文件,整个项目的入口 <listener> <listener-class>com.szh.utils.ListenerLoadConfig</listener-class> </listener> <servlet> //别名 最终客户端访问的接口的名称后缀 <servlet-name>Test</servlet-name> //接口的具体类名,路径必须正确 <servlet-class>com.szh.servlets.Test</servlet-class> </servlet> <servlet-mapping> //别名须统一 <servlet-name>Test</servlet-name> <url-pattern>/Test</url-pattern> </servlet-mapping></web-app>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
代码中注释已经很详细了。其实接口的名称就是别名挂钩的,所以一定要注意。当然很多小伙伴可能不明包listener配置。接下来会详细解释。
配置代码结构如图:
DBUtil代码:
package com.szh.utils;import static com.szh.utils.LoadDBconfig.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/** 数据库操类 */public class DBUtil { /** * 连接数据库 * @return */ public static Connection getConn(){ Connection conn=null; try { Class.forName(getDBValue("driverclass")); String url=(getDBValue("url")); String user=(getDBValue("username")); String password=(getDBValue("password")); conn=DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 关闭连接 * @param rs * @param stat * @param conn */ public static void closeConn(ResultSet rs,Statement stat,Connection conn){ try { if (rs != null) { rs.close(); } if (stat != null) { stat.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void closeConn(Statement stat,Connection conn){ try { if (stat != null) { stat.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
ListenerLoadConfig代码如下:
package com.szh.utils;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;/** 监听上下文加载配置 */public class ListenerLoadConfig implements ServletContextListener { public static final long TOKEN_CHECKED_TIME=24*60*60*1000; @Override public void contextDestroyed(ServletContextEvent sce) { } @Override public void contextInitialized(ServletContextEvent event) { String path=event.getServletContext().getRealPath("/WEB-INF/config/dbconfig.properties"); LoadDBconfig.load(path); System.out.println(DBUtil.getConn()); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
LoadDBconfig代码如下:
package com.szh.utils;import java.io.FileInputStream;import java.util.HashMap;import java.util.Properties;/** 加载配置 @author quanmin */public class LoadDBconfig { private static HashMap<String,String> dbMap=new HashMap<String,String>(); public static String getDBValue(String name){ return dbMap.get(name); } public static void load(String path){ try { Properties pro=new Properties(); pro.load(new FileInputStream(path)); String driverclass=pro.getProperty("driverclass"); dbMap.put("driverclass", driverclass); String url=pro.getProperty("url"); dbMap.put("url", url); String username=pro.getProperty("username"); dbMap.put("username", username); String password=pro.getProperty("password"); dbMap.put("password", password); } catch (Exception e) { e.printStackTrace(); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
代码就不详细解释了。其实ListenerLoadConfig这里就在刚才的web。xml中用到了。这个就是入口,因为其实现了ServletContextListener这个接口那么程序启动的时候就会从这开始。而这里面做的也就是读取配置文件的路径然后通过LoadDBconfig来加载驱动。然后通过DBUtil来创建链接。
- 接下来就是接口介绍了。
我们之前已经说到了,我们接口使用的servlet技术,servlet技术其实是java接口的最核心的技术,spring框架其实也就是对servlet的封装。
首先我们需要继承自servlet:代码如下:
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
继承自HttpServlet之后会自动实现get和post方法。这就是我们常说的http请求中的方法。客户端做网络请求就会到这两个方法中。我们可以看到有两个参数HttpServletRequest,和HttpServletResponse。这两个就分别对应http请求中的请求参数,和返回接口,也就是客户端请求的参数都在HttpServletRequest中我们可以拿到,而服务器返回的接口都可以存放在HttpServletResponse,中这样客户端就能拿到想要的数据了。是不是觉得很简单。那么接下来我们来一个简单的例子。
2. 注册接口的demo测试:
代码如下:
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username=req.getParameter("username"); String password=req.getParameter("password"); RegistDao daoModel=new RegistDao(); boolean result=daoModel.insertData(username, password); PrintWriter pw = resp.getWriter(); String prtStr=""; if(result){ prtStr="注册成功啦!"; }else{ prtStr="注册失败啦!"; } pw.print(prtStr); System.out.println(prtStr); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
数据库RegistDao 代码:
package com.szh.daos;import java.sql.Connection;import java.sql.PreparedStatement;import com.szh.utils.DBUtil;public class RegistDao extends DBUtil{ public boolean insertData(String username,String password ) { Connection conn=null; PreparedStatement stat=null; int rowCount=0; try { conn=getConn(); String sql="insert into t_user(userphone, userpasss) value(?,?)"; stat=conn.prepareStatement(sql); stat.setString(1, username); stat.setString(2, password); rowCount=stat.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally{ closeConn(stat, conn); } if(rowCount>0){ return true; } return false; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
需要实战练习的同学可以看我的github,其中有详细的项目源码。
这个是后台的项目地址:https://github.com/MrHangVIP/ZSXBiSHe
这个是配合后台的对应客户端源码,客户端是安卓的项目。整个客户端都是开源的需要的童鞋自己下载https://github.com/MrHangVIP/AiYaMaYa
当然,如果觉得写得好的话可以star谢谢!