全栈项目iCCUT之服务器篇(二)

Posted by Maru on November 21, 2015

(一)序言

秉承着一个礼拜装一次*的原则,我又开始写这个LowB全栈系列的博文了。上一次博主已经通过Python获取到了20000+多条的数据,当然啦,最后还是要APP获取这些数据的,那么这个时候流弊的服务器就需要站出来了!由于我们专业学的是JSP,所以我也就用Tomcat+Servlet来进行服务器端的开发,其实博主特别想用PHP来写,但是奈何精力不够。

顺便提一嘴。之前博主一直在用的可视化数据库工具是Navicat for MySQL,但是很可惜到期了,后来用了一下MySQLWorkbench.我现在只想对Navicat for MySQL说一个字,滚~(谁用谁知道!)

(二)接口思路与规划

MySQL中我们已经存储了视频的名字、URL、分类等信息,那么在接口我们要做的就是根据指定的分类或者名字来获取视频的列表(其中只需要视频名字和URL地址)。

img

(三)框架选择和驱动准备

和上一篇一样,首先第一步我们还是需要用Java连接MySQL数据库,然后就是古老的“增、删、改、查”了。最后一步就是把从数据库里获取的数据以Json的格式返回给APP。OVER。

1.用到的东西:

2.导入相关的框架

首先,将把JSONArray直接拖入相应的包内,然后就可以使用了。

img

然后是MySQL Connectors,直接右键项目,Configure Build path然后将选择刚刚下载完毕热乎的驱动jar包添加进去,ok!就是这么简单。

img

(四)Coding

1.DBhelper.java

由于连接数据库的操作相对独立,我使用了一个单独的类来实现服务器的连接。

package com.Alloc;
import java.sql.*;

public class DBHelper {

	
	public static final String dataBaseURL = "jdbc:mysql://127.0.0.1/sy_video?characterEncoding=gb2312";
	public static final String name = "com.mysql.jdbc.Driver"; 
	public static final String user = "root";  
    public static final String password = ""; 
    
    public Connection conn = null;  
    public PreparedStatement pst = null;  
    
    public DBHelper (String sql) {
		
    	try {
			Class.forName(name);
			conn = DriverManager.getConnection(dataBaseURL, user, password);
			pst = conn.prepareStatement(sql);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
		}
	}
    
    public void close() {  
        try {  
            this.conn.close();  
            this.pst.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
    
}


 

这一部分值得一提的是,在连接MySQL的地址的时候,有的时候因为编码的问题还是需要加上characterEncoding,这就再一次提醒自己,编码的统一是多么的重要啊,具体的原因后面会讲。

2.MediaList.java

最后就是Servlet的编写了,由于MediaList是继承自HttpServlet,所以MyEclipse自动帮我们写好了doGet和doPost方法,不过我们默认使用doPost的方法。

由于我们返回的格式无论客户机传给我们的是什么,响应的格式都是严格按照之前的接口规范来的,因此我先写了一个返回JSON的基类。如下:

	private JSONObject getBaseJsonObject(Object object,String msg,Boolean success) {
		
		JSONObject baseObject = new JSONObject();
		baseObject.put("datas", object);
		baseObject.put("msg", msg);
		baseObject.put("success", success);
		return baseObject;
	}
 

OK,然后就是考虑当用户APP传入错误的参数或者必选的参数缺省的时候的响应内容。

	private JSONObject getErrorJSONObject() {
		JSONObject baseObject = getBaseJsonObject("", "访问失败", false);
		return baseObject;
	}

 

好吧,我承认我偷懒了,其实应该写的更加的细化一点,根据不同的操作响应不同的提示信息。不过对我这种懒货来说,已经可以了。

好,接下来就是真正的响应处理了,leve1和index参数为必传参数,而leve2为可选参数。首先是响应的检查处理,看传入的参数是否符合要求,如果没有通过那么就返回错误信息响应:

		Integer index = Integer.parseInt(request.getParameter("index"));
		String leve1 = request.getParameter("leve1");
		String leve2 = request.getParameter("leve2");
		
		if (index == null || leve1 == null) {
			JSONObject object = getErrorJSONObject();
			PrintWriter out = response.getWriter();
			out.print(object);
			return;
		}
		

 

检查通过以后就是根据不同的情况进行SQL语句的查询和响应的返回结果了。

		JSONArray resultList = new JSONArray();
		
		DBHelper dbHelper;
		String sql;
		if (leve2 == null) {
			sql ="select * from FreeVideo where leve1='"+leve1+"'" + " limit " + (pageCount * index) + "," + pageCount;
		}else {
			sql = "select * from FreeVideo where leve1 = '"+leve1+"'"+" leve2='"+leve2+"'" +" limit " + (pageCount * index) + "," + pageCount;
		}
		dbHelper = new DBHelper(sql);
		
		try {
			ResultSet resultSet = dbHelper.pst.executeQuery();
			while (resultSet.next()) {
				JSONObject object = new JSONObject();
				object.put("title", resultSet.getString("title"));
				object.put("url", resultSet.getString("url"));
				resultList.put(object);
			}
			resultSet.close();
			dbHelper.close();
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
		}
		
		JSONObject obect;
		if (resultList.length() == 0) {
			obect = this.getBaseJsonObject(resultList,"没有更多", true);
		}else {
			obect = this.getBaseJsonObject(resultList,"成功查询", true);
		}
		PrintWriter out = response.getWriter();
		out.print(obect);


 

这里需要注意的就是当SQL语句中出现中文查询的时候,字符集的统一就是特别重要了。否则你会发现明明什么都是对的,但是为什么就是查询不到结果呢?这就是那句characterEncoding的力量!

(五)结语

最后来看一下用Alamofire获取的结果:

img

赶紧为自己开脱一下,本来就不是专门搞服务器的,所以这么简单的功能和这么丑陋的代码就见谅了(虽然本职也不怎么样)。最后源代码敬上,周末愉快!iCCUT-Server