许久没更新博客了。但最近好在有些事情忙完了。今天针对我在做的个人项目后台技术进行详细的记录。希望可以帮助一些想自己搭建简易接口开发的同学,更好的了解客户端的网络请求机制。
首先我们需要的开发工具和环境(这里不区分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.Driver
url=jdbc:mysql://localhost:3306/testdatabase?useUnicode=true&characterEncoding=UTF-8
username=root
password=12345
- 1
- 2
- 3
- 4
这里就是加载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 {
// 关闭 ctrl+shift+F format
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 {
//加载配置dbconfig.properties
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
继承自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谢谢!