后台开发

Nepenthes的后台开发包括三部分:Schema对象、BL对象和Service对象。后台开发是Nepenthes开发的核心部分,Web应用、苹果应用和安卓应用都是以后台为核心进行开发的。参与Nepenthes后台开发的人员需要精通Java语言,SQL语言,熟悉PostgreSQL数据库,熟悉Tomcat,了解Servlet和JSP。Nepenthes后台开发者可以开发出Web应用和提供给苹果和安卓应用的后台服务。

在开发前请确保您的电脑已经安装好了JDK, Tomcat, PostgreSQL, NetBeans和Sublime Text,详情参阅开发环境


Schema对象

Schema对象是对应数据库表结构的Java对象,命名规则为:表名+Schema,例如,数据库表名为Userx,则Schema对象必须命名为:UserxSchema,存储的Java文件名为:UserxSchema.java,使用的开发工具为NetBeans

Schema对象与数据库表字段类型对照表

字段 Schema对象 初始值
INT int 0
SMALLINT int 0
DECIMAL double 0.00
CHAR String ""
VARCHAR String ""
TEXT String ""
DATE String "1970-01-01"
TIMESTAMP String "1970-01-01 00:00:00"

我们就从数据库表Userx开启Nepenthes的开发之旅,表Userx的结构如下所示:

字段 类型 说明
ID INT 自增长唯一识别ID
FirstName VARCHAR(20) 名,索引
LastName VARCHAR(20) 姓,索引
Gender SMALLINT 性别:0代表女,1代表男,2代表其它
Birthdate DATE 出生日期
Salary DECIMAL(10,2) 薪水
RegisteredTime TIMESTAMP 创建时间
Memo TEXT 备注

使用Java开发工具NetBeans按照以下的步骤操作:

  1. 新建Java Class Library工程Test

  2. 创建lib目录以存储需要的jar包

  3. 将nepenthes.jar,jackson-core-2.0.6.jar,jackson-databind-2.0.6.jar,commons-codec-1.10.jar,commons-io-1.2.jar(在下载页面中下载这些jar包)和servlet-api.jar(请从安装后的Tomcat的lib目录下找到servlet-api.jar)复制到lib目录
  4. 将这些jar包添至加工程的Libraries中


  5. 创建包org.everdow.nepenthes.test.schema

  6. 在上一步新建的包中创建Java Class文件UserxSchema

  7. 对应数据库表Userx的结构,UserxSchema.java的源代码如下:
    package org.everdow.nepenthes.test.schema;
    
    public class UserxSchema 
    {
        public int ID=0;
        public String FirstName="";
        public String LastName="";
        public int Gender=0;
        public String Birthdate="";
        public double Salary=0.00;
        public String RegisteredTime="";
        public String Memo="";
    }


BL对象

BL对象包含了对数据库的基本操作,所有操作以Schema对象为参数进行。BL对象的命名规则为:BL+数据库表名,继承包org.everdow.nepenthes.bl中的类BLGeneral,该类中包含了常用的操作。这些方法构成了数据库相关操作的所有场景,可以构造大型的复杂的商业应用。BL对象的实现并不需要重载以上方法,这些方法已经在父类BLGeneral中,在使用过程中只需调用即可。

  • insert(Object schema):数据库插入操作,入参为Schema对象,返回结果为boolean,true表示插入成功,false表示失败。
  • update(Object schema):数据库更新操作,入参为Schema对象,返回结果为boolean,true表示更新成功,false表示失败。
  • delete(int id):删除单条数据库记录,入参为记录id,返回结果为boolean,删除成功返回true,否则返回false。
  • delete(String whereClause):删除一组数据库记录,入参为SQL语句WHERE后的条件语句,返回结果为boolean,删除成功返回true,否则返回false。
  • getCount(String whereClause):获得符合条件的数据库记录数量,入参为SQL语句WHERE后的条件语句,返回结果为int。
  • select(String whereClause):查询符合条件的数据库记录,入参为SQL语句WHERE后的条件语句,返回结果为List,结果List中包含的元素为Schema对象。
  • select(String whereClause,int index,int step):查询指定起始位置的符合条件的数据库记录,入参whereClause为SQL语句WHERE后的条件语句,index为数据库游标,step为查询步长。该方法用于分页查询时间使用。
  • getSchema(int id):根据条件获得指定的Schema对象,入参为数据库记录id,返回结果为Schema对象。
  1. 创建包org.everdow.nepenthes.test.bl
  2. 在此包下创建类BLUserx.java
  3. BLUserx源代码如下:
    package org.everdow.nepenthes.test.bl;
    
    import java.sql.Connection;
    import org.everdow.nepenthes.bl.BLGeneral;
    
    public class BLUserx extends BLGeneral
    {
        private final String createSQL="FirstName VARCHAR(20) NOT NULL,"+  //名
                                       "LastName VARCHAR(20) NOT NULL,"+  //姓
                                       "Gender SMALLINT NOT NULL,"+  //性别
                                       "Birthdate DATE NOT NULL,"+  //出生日期
                                       "Salary DECIMAL(10,2) NOT NULL,"+  //薪水
                                       "RegisteredTime TIMESTAMP NOT NULL,"+  //注册时间
                                       "Memo TEXT";  //备注
        
        private final String indexSQL="RegisteredTime";
    
        public BLUserx(Connection con)
        {
            super(con);
            super.init(createSQL, indexSQL);
        }
    }
    可以看出,BLUserx扩展了父类BLGeneral,给变量createSQL赋值,内容为创建数据库表Userx的SQL语句,其中自增长的字段ID是系统自动加入的,不需要在这时显式列出。变量indexSQL是指写的建立索引的字段,如果有多个字段被索引,则用半角逗号分隔。BLUserx的最后一部分是在构造器中显式调用父类的init方法,该方法会检查数据库表是否已经存在,如果不存在则自动创建。这时BLUserx已经自动继承了BLGeneral中的八个常用方法,直接调用即可。


基础许可

创建的工程中需要在包的根位置加入Nepenthes基础许可,方可正常使用。请在许可页面下载基础许可Config.properties,请不要手动对基础许可做出任何修改。如下图所示:


构建

在Projects视图下,选中工程节点Test,右键从菜单中选择Clean and Build,之后切换至Files视图,从目录dist中选中Test.jar,右键从菜单中选择Tools->Show in Finder找至该文件的位置,Test.jar即称为项目核心库。 如下图所示:


Schema和BL对象的测试

我们已经成功的创建了Schema对象和BL对象,接下来我们就进行调用验证,并通过PostgreSQL数据库客户端psql进行验证。在进行验证测试前,需要进行以下的相关配置:

  1. 使用PostgreSQL的客户端psql创建数据库test,如下图所示:
  2. 在Tomcat的webapps下建立目录Test
  3. 在目录Test下创建目录WEB-INF
  4. 在目录WEB-INF下创建目录lib
  5. 将nepenthes.jar,commons-codec-1.10.jar,jackson-annotations-2.0.6.jar,jackson-core-2.0.6.jar,jackson-databind-2.0.6.jar,Test.jar复制到刚刚建立的目录lib下
  6. 在目录WEB-INF下建立文件web.xml,内容如下:
  7. 在Test目录下创建目录META-INF
  8. 在目录META-INF下建立文件context.xml,内容如下:
  9. 在目录Test下创建文件openCon.jspf,该文件用于jsp包含文件,打开数据库,内容如下:
  10. 在目录Test下创建文件closeCon.jspf,该文件用于jsp包含文件,关闭数据库,内容如下:
  11. 由于Tomcat有自动加载机制,Test应用应该已经生效并启动。为了确保生效,请手动重启Tomcat。如何重启Tomcat,请参阅Tomcat的相关文档
接下来我们在Test目录下,使用编辑器Sublime Text,创建一系列jsp文件以测试验证Schema对象和BL对象:
  • license.jsp:验证Nepenthes许可。

    验证Nepenthes许可返回值

    描述 备注
    800 License Passed 许可验证通过,可以正常使用。
    801 License User or License Password Wrong 许可用户名或密码错误。
    802 License Wrong 许可错误
    803 License Disabled 许可被禁用。
    804 License Expired 许可过期。
    805 License Type Unmatch 许可类型不匹配。
    806 License Verify Exception 许可验证异常。
    807 License Server Fail 许可服务器故障。
    808 License Package Error 许可包错误。
    809 License Auto Destroy 许可自动销毁。
    810 Config.properties doesn't contain LicenseUser Config.properties未包含许可用户。
    811 Config.properties doesn't contain LicensePassword Config.properties未包含许可密码。
    812 Config.properties doesn't contain LicenseType Config.properties未包含许可类型。
    813 Config.properties doesn't contain LicensePackage Config.properties未包含许可包。
    814 Config.properties doesn't contain License Config.properties未包含许可。
  • insert.jsp:演示BL对象的insert方法。

    为了支持多语言,须将jsp设置为utf-8编码。MiscTool为Nepenthes提供的工具集,内置了许多方便的方法以便调用。页面开始需要包含打开数据库连接的openCon.jspf,在页面最底部包含closeCon.jspf关闭数据库。BLUserx的insert方法入参为UserxSchema,如果插入数据库成功返回true,否则返回false。返回true后,打开PostgreSQL的客户端psql以验证确实插入数据库成功,看到如下的界面就表明刚才的insert操作是成功的。如何使用数据库PostgreSQL不在本培训课程之列,想了解关于PostgreSQL的更多信息,请访问其PostgreSQL官网
  • update.jsp:演示BL对象的getSchema方法和update方法。

    首先,根据ID使用BLUserx对象的getSchema方法获得UserxSchema对象,在获得对象后为Object,需强制造型为UserxSchema。然后,修改为出生日期,调用BLUserx的方法update,该方法入参为UserxSchema,返回boolean类型的值,true表示更新成功,false表示更新失败。更新成功后,同样使用PostgreSQL的psql检查数据库是否更新。
  • getCount.jsp:演示BL对象的getCount方法,入参为SQL语句WHERE后的条件,返回值为整数,代表符合条件的记录的数量,通常使用1=1条件语句来查询所有记录。此时执行时应该返回的数值为1

  • select.jsp:演示BL对象的select方法,select方法有两个实现,第一个select方法只有一个入参whereClause即SQL语句WHERE后的语句,第二个select方法有三个入参,第一个入参数也是whereClause,含义与第一个select方法一样,第二个入参是pos,代表数据库游标的位置,第三个入参是step,代表每次查询返回的最大记录数量。第二个select方法适用于分页显示。这两个select方法都返回List类型的集合,是UserxSchema的元素集合。

  • delete.jsp:演示BL对象的delete方法,delete方法也有两个实现,第一个delete方法的入参是记录ID,执行一次只删除一条记录;第二个delete方法的入参是whereClause,会删除所有符合条件的记录。返回值都是boolean,true表示删除成功,false表示删除失败。

    执行后,请从psql检查是否删除成功。


Service对象实现及配置

对于使用jsp来开发WEB应用的开发者来说,以上的培训已经全部完成并足够应付任何规模和级别的企业级应用。但Nepenthes的作用绝不是仅仅提供WEB应用的开发框架,Nepenthes可以向苹果和安卓应用提供服务。接下来我们便为iOS,macOS,tvOS和Android应用演示如何开发出后台服务来。请按照以下步骤的顺序严格操作:

  1. 回到NetBeans的项目Test中,创建包org.everdow.nepenthes.test.service,如下图所示:

  2. 创建类UserxService,如下图所示:

  3. UserxService的实现,需要扩展类ServiceServlet,覆盖init方法,在该方法中初始化schema变量和blGeneral变量,并捕捉相应的异常。如下图所示:

    UserxService源代码如下:没错,Service对象的实现就这么简单,所有相关的方法都已经在其父类ServiceServlet中实现。
    package org.everdow.nepenthes.test.service;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.naming.NamingException;
    import org.everdow.nepenthes.service.ServiceServlet;
    import org.everdow.nepenthes.test.bl.BLUserx;
    import org.everdow.nepenthes.test.schema.UserxSchema;
    
    public class UserxService extends ServiceServlet
    {
        @Override
        public void init()
        {
            try 
            {
                this.schema=new UserxSchema();
                this.blGeneral=new BLUserx(this.getConnection());
            } 
            catch (NamingException | SQLException ex) 
            {
                Logger.getLogger(UserxService.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
  4. Clean and Build后将新生成的Test.jar覆盖之前的同名文件。
  5. 打开web.xml文件,将UserxService注册成为Servlet,同时也需要设置访问服务所需的密码以保证服务的安全访问。如下图所示:

  6. 在浏览器地址栏输入http://localhost/Test/UserxService,如果出现:Service Available,则此时UserxService已经在后台准备好了向苹果和安卓应用提供服务了。开发苹果和安卓应用以调用该服务,请参阅苹果开发和安卓开发的章节。