java web 接口笔记

一. 接口说明

    最近一直在学习物联网云平台的开发, 一知半解, 一头雾水. 现在理解一下大概如下: 不同的协议需要搭建不同类型的服务器, 比如MQTT服务器, 那么服务器就是一个代理, 转发消息. 我们的HTTP服务器则是实现GET和POST两个基本的操作. GET数据库的消息. 而GET的数据形式需要自己去编写. POST就是客户端目标向服务器发送数据, 服务器接收并存在数据库中. (PS: 这里未考虑加密验证).

    之前学习的误区在于不知道怎么搭建物联网云平台, 怎么搭?(基础薄弱! ). 现在明白其中最重要的是接口的开发. 即API.写出了接口给客户端调用以实现数据的读写, 后续要做的就是数据处理并好看的展示在前端页面上.

二. 程序框图

    下图是我学习总结的开发步骤, 不然关系多起来容易一头雾水.
    由com.niu包依次向下写, 大致的步骤及功能在图片中的注释里, 具体的在程序中说明.

三. 导入包说明

    开发需要导入图片中的这些包, JSon包的话Myeclipse中有可以直接导入, servlet包我也没有找到, 可以从Tomcat服务器的lib文件夹下面找赋值过来. 实在没有可以留言发邮箱. PS: 百度是万能的?

四. 开发步骤

Servlet3.0: 新建Dynamic web project时把 Target runtime选为javaEE 6.0 , 这样我们的servlet版本也就变成了3.0. 之所以这样, 是因为后面再写JSON基类的时候要用到servlet2.4版本以上的新特性.

(1) JSON基类

      

    这个类用于控制数据返回的格式, 样例如下:

(具体调用则实在servlet中)

{
    "code": "ok",
    "msg": "访问成功",
    "time": 1527237083877,
    "items": [
        {
            "id": 1,
            "name": "Temp",
            "value": 12
        },
        {
            "id": 2,
            "name": "location",
            "value": 12
        },
        {
            "id": 3,
            "name": "usage",
            "value": 99
        }
    ]
}

com.niu.json.core

        AbstractJsonObject.java  : JSON数据的基类

扫描二维码关注公众号,回复: 2726292 查看本文章

        ListObject.java : JSON数组类

        SignalObject.java : Json对象类

com.niu.json.core

        ResponseUtils.java : 将消息写入response

com.niu.json.core

        StatusCode,java : 状态返回码 e.g. 200OK

        StatusHouse.java :

        StatusObject.java : 状态对象, 封装了msg和code(具体请百度json格式)

com.niu.json.core

        JackJsonUtils.java : 生成json数据和解析json数据

上面的只是控制他返回的格式, 基本上是固定的.

(2) 模型层开发

       什么是模型层开发? 看了下面的程序大概就会明白了. 就是定义变量并给出get和set方法. 那get和set的是啥呢? 这就是关键了, 程序中定义的变量就是数据库中我们定义的字段, 那就是对数据库的读写 ! (数据库请看最后补充部分)

com.niu.model

package com.niu.model;
public class Datastreams {
	private int id;
	private String  name;
	private int value;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
}
(3) 业务层开发

      业务层开发主要是:

1. 控制数据库开关的DBHelper类

2. 调用model层get, set方法操作数据库的方法

com.niu.business

DBHelper类, 用来操作数据库的打开和关闭, 程序中需要说明几点: url为数据库路径(restful_api为数据库服务器名), user为数据库账号, password为数据库密码

DBHelper.java:

public class DBHelper {
    public static final String url = "jdbc:mysql://localhost:3306/restful_api";  
    public static final String name = "com.mysql.jdbc.Driver";  
    public static final String user = "root";  
    public static final String password = "root";  
  
    public Connection conn = null;  
    public PreparedStatement pst = null;  
  
    public DBHelper(String sql) {  
        try {  
            Class.forName(name);//
            conn = DriverManager.getConnection(url, user, password);//
            pst = conn.prepareStatement(sql);//
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    public void close() {  
        try {  
            this.conn.close();  
            this.pst.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  

}

DatastreamsBusiness.java: 特别关键的一个类

这里的方法是: sql = "select *from datastreams"; 获取datastreams表中的所有数据.

其它的对数据库操作就用别的sql语句, 文末会给出一些常用的语句提供借鉴, 建议菜鸟教程看一遍差不多就可以用得起来

本质上不同的方法也就是对应着不同的sql语句 ! !

public class DatastreamsBusiness {
	
	public static List<Datastreams> getAllDatastreams() {          //select *from datastreams
		List<Datastreams> list = new ArrayList<Datastreams>();
		String sql = null;
		DBHelper db1 = null;
		sql = "select *from datastreams";// SQL
		db1 = new DBHelper(sql);//
		ResultSet ret = null;
		try {
			ret = db1.pst.executeQuery();
			while (ret.next()) {
				int id = ret.getInt(1);
				String name = ret.getString(2);
				int value = ret.getInt(3);
				Datastreams datastreams = new Datastreams();
				datastreams.setId(id);
				datastreams.setName(name);
				datastreams.setValue(value);
				list.add(datastreams);
			} //
			ret.close();
			db1.close();//
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //

		return list;
	}

	/**
	 * @param _id
	 * @return
	 */
	public static Datastreams getDatastreamInfoById(String _id) {//select * from student where id =" + _id
		String sql = null;
		DBHelper db1 = null;
		sql = "select * from student where id =" + _id;// 
		db1 = new DBHelper(sql);// 
		ResultSet ret = null;
		Datastreams datastreams = new Datastreams();
		try {
			ret = db1.pst.executeQuery();
			while (ret.next()) {
				int id = ret.getInt(1);
				String name = ret.getString(2);
				int value = ret.getInt(3);
				datastreams.setId(id);
				datastreams.setName(name);
				datastreams.setValue(value);
			} // 
			ret.close();
			db1.close();// 
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} // 
		return datastreams;
	}

}
(4) Servlet开发

重点来了啊~~~~~~~~~~~~~~~~~

了解servlet :

servlet: (Server Applet),小服务程序或服务连接器

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

这里我们只写了两个方法doGet和doPost.

doGet用于从数据库获取数据, 用于计算处理展示等

doPost用于接收客户端发过来的消息, 并存储值数据库中

doGet方法很简单就不多说,

doPost方法: (简单粗暴多多指教), 这里未设置返回值.

/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//Step one
		System.out.println(new Date()+"\n");
		InputStream sin = new BufferedInputStream(request.getInputStream());
		ByteArrayOutputStream sout = new ByteArrayOutputStream();
		int b=0;
		while((b=sin.read())!=-1)
		{
		sout.write(b);
		}
		byte[] temp = sout.toByteArray();
		String s_ok = new String(temp,"UTF-8");
		String regex="[0123456789.]+";               //正则表达式分离s_ok
		Pattern p=Pattern.compile(regex);
		Matcher m=p.matcher(s_ok);
		int i=0;
		while(m.find())
		{
			String item=m.group();
			System.out.println(item);
			i++;
			if(i==2)
			{
					id=Integer.parseInt(item);
				System.out.println("这是第"+i+"个数字:"+item);
			}	
			if(i==4)
			{
				time=item;
				System.out.println("这是第"+i+"个数字:"+item);
			}
			if(i==6)
			{
					value=Integer.parseInt(item);
				System.out.println("这是第"+i+"个数字:"+item);
			}		
		}
		
		System.out.println(s_ok);
		String sql = null;
		//System.out.print("this is request: "+request+"this is response: "+response);
		System.out.println("id:"+id+",time: "+time+" ,value: "+value);
		sql = "insert into location"   //sql语句
				+"(id,time,value)"
				+"values(    "+" ' "+id+" ' "+",   "+" ' "+time+" ' "+", "+" ' "+value+" ' "+")";	
		DBHelper mysql = new DBHelper(sql);	
		try {
			mysql.insertMess(request, id, time, value);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("未成功插入数据!_API");
		}
		return;	
		//doGet(request, response);
	}

(5) Service层开发

这一层的开发就是接口及接口的实现, 在我的这个web开发中service层只是简单的return, 具体方法放在了业务层, 那么为什么要这个呢? 是因为开发起来层次更加清楚, 方便以后的增删改.








猜你喜欢

转载自blog.csdn.net/qq_37832932/article/details/80410320
今日推荐