zoukankan      html  css  js  c++  java
  • Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)

     

    前言

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

    结束

    探索永无止境!

     

  • 相关阅读:
    css的选择器
    javaScript 的变量使用
    关于外键约束
    javaScript中运算符
    css介绍和三种引入方式
    关于盒子模型
    类和类的六种关系
    DQL和DML更多操作
    javaScript的特点
    关于 让页面中的按钮 响应回车
  • 原文地址:https://www.cnblogs.com/over140/p/2917231.html
Copyright © 2011-2022 走看看