前言

结合之前所用的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

<?xml version="1.0" encoding="ISO-8859-1"?>
<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

public class StartupInit implements ServletContextListener {

@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

@DatabaseTable(tableName = "nmbb_users")
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)

public class UserActivity extends Activity {

@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

结束

探索永无止境!

转载:http://www.cnblogs.com/over140/archive/2013/03/05/2917231.html

Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)相关推荐

  1. android的快速开发框架集合

    android的快速开发框架集合 出自:http://blog.csdn.net/shulianghan/article/details/18046021 1.Afinal  (快速开发框架) 简介: ...

  2. android的快速开发框架,FastAndroid

    软件简介 这是一个封装了多方面开源库后基于MVP模式的一个Android快速开发框架,融入了MVP模式,将Activity或Fragment做为View层.抽象出Presenter用于处理业务逻辑.M ...

  3. android sqlite orm,ioc,Afinal 0.2 发布 Android的快速开发框架(ORM,IOC)

    Afinal是一个开源的Android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少. 在android应用开发中,通过afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动 ...

  4. java无框架开发,DON: java 小型web项目快速开发框架,实现无配置,直接关注业务开发.主要解决请求分发解析...

    #DON框架介绍 ##目标 启动零配置快速进入开发 开发时,请求controller路由零配置 配合windfly.jar工具包快速开发 最终实现加入jar包即可快速开发 ##主要特点 无需配置请求u ...

  5. MVPArch - Android MVP 快速开发框架

    MVPArch 一个可有效提高Android开发效率的MVP框架 封装Activity/Fragment基类-BaseActivity/BaseFragment(Fragment懒加载开关配置) 封装 ...

  6. Android的快速开发框架 afinal

    afinal 框架学习: http://www.oschina.net/p/afinal 转载于:https://www.cnblogs.com/qishuai/p/4422817.html

  7. github 开源android项目

    转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...

  8. afinal Android 快速开发框架

    Afinal简介 Afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少. 在android应用开发中,通过Afinal的ioc框架,诸如ui绑定,事件绑定 ...

  9. Android快速开发框架XUtils

    原文地址:http://blog.csdn.net/rain_butterfly/article/details/37812371 点击阅读原文 --------------------------- ...

最新文章

  1. linux查看msf安装目录,linux系统安装msf的过程详解
  2. R语言WVPlots包可视化克利夫兰点ClevelandDotPlot、并按照分类变量排序进行可视化克利夫兰点ClevelandDotPlot
  3. 华东师范计算机入门平时作业,计算机入门模拟卷A-华东师范大学.doc
  4. (转载)聊聊Git原理
  5. vivado SOC——hello word(上)建立SOC系统
  6. Grid布局和Flex布局
  7. HP DL388G5 安装64位linux虚拟系统出错!
  8. C语言应用笔记:C语言typedef关键字及其使用
  9. 面向对象编程的五大基本原则
  10. Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)
  11. kafka入门(一)简介
  12. 机器视觉LED光源的选择及其性能优势
  13. Atitit 软件的俩大要点 提升可读性 提升扩展性 目录 1. 命名可读性 1 2. 提升扩展性法 1 3. 项目常见扩展法 2 1.结构可读性 表驱动代替if else 减少层次 Dsl
  14. Java 后端MD5加密
  15. c语言编程创意表白,C语言和图形界面编程打造——浪漫的表白程序
  16. 【win10】win10值不值得升级?
  17. 企业微信邮箱可以移动办公吗?
  18. esb接口测试_ESB产品架构之愚见
  19. 以前给客户开发了一个本地同城小程序
  20. sql升序null排在顶部

热门文章

  1. php测试接口的小工具,PHP API接口测试小工具
  2. mysql binlog ignore db_MySQL binlog_ignore_db 参数最全解析
  3. vacode允许c_使用VS code编译运行C,C++,Java程序
  4. 多个浏览器同时访问mysql_48- 多线程启动多个不同浏览器
  5. 20200806:Java拓扑排序实现力扣210课程表Ⅱ
  6. linux 优盘分区,怎么在Linux系统下使用NTFS的U盘或者是分区以及移动硬盘-使用工具NTFS-3G...
  7. php如何防止重复提交表单,如何防止php重复提交表单方法
  8. datetime 索引_超全的数据库建表/SQL/索引规范,适合贴在工位上!
  9. linux怎么测试一个脚本,一个Linux中用于监控的简易shell脚本
  10. 报表通过url向数据集传参