前言
結合之前所用的ormlite和hessian,再加上SAE已經支持JAVA,把服務端切換到JAVA,也就有了本文。使用hessian來做數據傳輸,ormlite來實現客戶端與服務端的數據存儲,極大的減少了CRUD工作。本文為探索貼,未正式用於大型項目,歡迎大家討論使用!
聲明
歡迎轉載,但請保留文章原始出處:)
博客園:http://www.cnblogs.com
農民伯伯: http://www.cnblogs.com/over140/
正文
一、簡介
1.1 ormlite
Ormlite[Object Relational Mapping Lite (ORM Lite)]對象關系映射精簡版(精簡版的ORM)提供了一些簡單的,輕量級持久化Java對象到SQL數據庫,同時也避免了復雜性和更多的標准的ORM包的開銷的功能。
支持數據庫的jdbc調用,當然,最重要的肯定是它支持android原生的數據庫api調用sqlite。
——轉載自這里。
1.2 hessian
使用方法參照本博兩篇文章:
[hessdroid]Android下使用Hessian與Java服務端通訊
[hessdroid]Android下使用Hessian與Java服務端通訊的傳值測試
1.3 Android快速開發框架說明
考慮如下幾個特點:
a). 客戶端(Android)和服務端均使用Java語言
b). 客戶端(Android)和服務端均支持Hessian和ormlite框架
c). 完整的支持面向對象開發:存儲和交互傳輸
二、准備
2.1 開發環境
為了便於同時開發Android和Java Web,這里下載的是Eclipse IDE for Java EE Developers版本,然后安裝最新的ADT插件和TOMCAT插件。
2.2 服務端
應用服務器使用Tomcat,采用Java(JSP/Servlet)來實現服務端的業務邏輯,數據庫使用Mysql。快速框架搭建推薦大家使用XAMPP(集成Apache、MySQL、PHP等,支持綠色安裝)。
2.3 客戶端
普通的Android環境
2.4 通信與存儲說明
服務端與客戶端通過Hessian進行數據交換,通過Ormlite保存數據庫(通過JDBC保存到服務端的MYSQL數據庫,也可以直接保存到客戶端的sqlite數據庫);
三、代碼
3.1 項目工程截圖(服務端)
HOLib共用於客戶端和服務端,保證接口和數據對象一致性。
3.2 重點代碼分析
3.2.1 服務端
web.xml
< web-app xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
version ="2.4" >
< servlet >
< servlet-name >user </ servlet-name >
< servlet-class >com.nmbb.ho.server.servlet.UserServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name >user </ servlet-name >
< url-pattern >/user.do </ url-pattern >
</ servlet-mapping >
< listener >
< listener-class >com.nmbb.ho.server.StartupInit </ listener-class >
</ listener >
</ web-app >
StartupInit.java
@Override
public void contextInitialized(ServletContextEvent arg0) {
try {
TableUtils.dropTable(OrmliteHelper.getConnection(), POUser. class,
true);
// 創建數據庫
TableUtils.createTable(OrmliteHelper.getConnection(), POUser. class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
}
代碼說明:
StartupInit可用於創建數據庫表結構,這里用於測試,真實環境注意數據丟失問題。
POUser.java
public class POUser implements Serializable {
/** 用戶編號,6位數字 */
@DatabaseField(generatedId = true)
public int suid;
/** 用戶名 */
@DatabaseField(width = 30)
public String username;
/** 密碼 */
@DatabaseField(width = 30)
public String password;
/** 昵稱 */
@DatabaseField(width = 60)
public String nickname;
/** 200 正常 201 數據校驗錯誤 202用戶已經存在 */
public int status = 200;
/** 用於放錯誤信息 */
public String msg;
public POUser() {
}
}
代碼說明:
注意需要一個空的構造函數,其他請參考ormlite資料。
UserServlet.java
* 用戶Servlet
*
* @author 農民伯伯
* @see http://www.cnblogs.com/over140/archive/2013/02/19/2917231.html
*
*/
public class UserServlet extends HessianServlet implements IUserService {
@Override
public POUser register(String username, String password) {
POUser result = new POUser();
System.out.println("[UserServlet.register]...");
// 檢測數據是否合法
if (isEmpty(username) || isEmpty(password)) {
result.status = 201;
result.msg = "用戶名或密碼不能為空";
} else {
// 檢測用戶是否存在
OrmliteHelper<POUser> db = new OrmliteHelper<POUser>();
if (db.exist(POUser. class, "username", username)) {
result.status = 202;
result.msg = "用戶名已經存在";
} else {
result.username = username;
result.password = password;
db.create(result); // 入庫
result.msg = "注冊成功";
System.out.println("create user suid:" + result.suid);
}
}
return result;
}
@Override
public List<POUser> query( int suid, int startIndex, int pageSize) {
return new OrmliteHelper<POUser>().query(POUser. class, "suid", suid, startIndex, pageSize) ;
}
/**
* 判斷字符串是否為空
*
* @param str
* @return
*/
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
}
3.2.2 客戶端(Android)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void OnClickRegiger(View view) {
new AsyncTask<Void, Void, POUser>() {
@Override
protected POUser doInBackground(Void... params) {
String url = "http://192.168.68.23:8081/HOServer/user.do";
HessianProxyFactory factory = new HessianProxyFactory();
try {
factory.setDebug( true);
factory.setReadTimeout(5000);
// 不設置會報 expected hessian reply at 0x48
factory.setHessian2Reply( false);
IUserService basic = (IUserService) factory.create(IUserService. class, url, getClassLoader());
return basic.register("admin", "123456");
} catch (MalformedURLException e) {
Log.e("UserActivity", "OnClickRegiger", e);
} catch (Exception e) {
Log.e("UserActivity", "OnClickRegiger", e);
}
return null;
}
@Override
protected void onPostExecute(POUser result) {
if (result != null) {
if (result.status == 200) {
// 保存入庫
new DbHelper<POUser>().create(result);
}
Toast.makeText(UserActivity. this, "" + result.msg, Toast.LENGTH_LONG).show();
}
};
}.execute();
}
}
代碼說明:
1、DbHelper在源碼里給出。
2、如果項目無法編譯通過,請注意設置項目的字符編碼、JDK版本、Android的版本。
三、總結
5.1 優點
a). 完全面向對象開發
b). 降低項目的復雜度,減少引入其他框架所帶來的復雜性
c). 非常適合一個開發服務端和客戶端
充分的利用的框架的特點,提交開發效率,適合中小型項目快速開發。
5.2 缺點
a). 注意服務端與客戶端共用id的問題
5.3 其他
a). ormlite支持標准的JPA助記符,這里。這樣服務端采用Hibernate應該也是可以的,有時間可以做一個整合例子看看。
b). 測試發現整個框架也適用於SAE,如果一個人負責客戶端和服務端,那就太幸福了!
四、下載
AndroidFramework2013-03-05.zip
結束
探索永無止境!