国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > web前端 > htmlcss > 【JAVAEE】用最快最酸爽最简单的方式开发Android接口

【JAVAEE】用最快最酸爽最简单的方式开发Android接口

来源:程序员人生   发布时间:2016-12-08 16:45:14 阅读次数:3673次

之前有个哥们给我1个SSM(Spring+SpringMVC+MyBatis)框架的工程,让我研究研究android接口的快速开发,得知这个很爽的SSM框架后,我开始研究这个工程,后来实验了半天,作为1个EE小白得到的感受是:

  • SSM里面的配置很多;
  • 虽然已是很简单很快速的几个方法几个接口就KO接口了,但是配置还是很复杂

因而,放弃了.....但是个人认为,对1些比较大型的项目,可以试用SSM框架来实现接口。好了,下面我来介绍1种10分酸爽的EE框架,对EE小白来讲真的是不错的东西,配置上面最少很少,几近到达0配置,实现上面也很简单,对数据库的连接上也已进行了封装,这个框架就是JFinal,不能不说这框架太牛逼了。

 

本文合适的对象:

l 对Java EE有1定了解的小白

l 熟习tomcat服务器

l 熟习mysql数据库和sql语句的

 

 

 

甚么是Jfinal框架?

援用下官方的介绍:

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩大、Restful。在具有Java语言所有优势的同时再具有ruby、python、php等动态语言的开发效力!为您节俭更多时间,去陪恋人、家人和朋友 :)

 

Jfinal的特点有甚么?

l MVC架构,设计精致,使用简单

l 遵守COC原则,零配置,无xml

l 独创Db + Record模式,灵活便利

l ActiveRecord支持,使数据库开发极致快速

l 自动加载修改后的java文件,开发进程中无需重启web server

l AOP支持,拦截器配置灵活,功能强大

l Plugin体系结构,扩大性强

l 多视图支持,支持FreeMarker、JSP、Velocity

l 强大的Validator后端校验功能

l 功能齐全,具有struts2的绝大部份功能

l 体积小仅339K,且无第3方依赖

 

Jfinal的官方网站:

http://www.jfinal.com/

 

开始实践

说了那末多,我们开始实践下这个框架,来验证下是有多爽,下面会以用户登录这个简单的例子来展现如何试用Jfinal框架,使用的要求方式为GET

 

准备工作:

1.编写数据库,来支持后台

这里我使用的是MySql数据库,可视化工具用的是Navicat

这里我创建了1个叫做coderbase的数据库,创建时候注意编码格式1律设置为UFT⑻

创建1个用户表tb_user

字段以下:

 

字段

类型

含义

id

int

id自动递增

username

varchar

用户名

password

varchar

密码

nickname

varchar

昵称

sex

int

性别

usertype

int

用户权限类型

email

varchar

邮箱

mobile

char

手机号

score

int

用户积分

token

varchar

Token验证

base

varchar

备用字段

base

varchar

备用字段

base

varchar

备用字段

贴下我的sql

DROP TABLE IF EXISTS `tb_user`; CREATE TABLE `tb_user` ( `id` int(40) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '用户名', `password` varchar(100) CHARACTER SET utf8 DEFAULT NULL, `nickname` varchar(100) CHARACTER SET utf8 DEFAULT NULL COMMENT '昵称', `sex` int(2) DEFAULT NULL, `usertype` int(10) DEFAULT NULL COMMENT '用户类型', `email` varchar(50) CHARACTER SET utf8 DEFAULT NULL, `mobile` char(11) CHARACTER SET utf8 DEFAULT NULL, `score` int(255) DEFAULT NULL, `base` varchar(100) CHARACTER SET utf8 DEFAULT NULL, `base2` varchar(100) CHARACTER SET utf8 DEFAULT NULL, `base3` varchar(100) CHARACTER SET utf8 DEFAULT NULL, `base4` varchar(100) CHARACTER SET utf8 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

 

插入测试数据

<span style="font-family:SimSun;">INSERT INTO `tb_user` VALUES ('1', '张3', '123', '3', '1', '1', '1028940102@qq.com', '1812345678', '12', null, null, null, null); INSERT INTO `tb_user` VALUES ('2', '2', '2', '2', '2', '2', '2', '2', '2', null, null, null, null);</span>


2.设置tomcat编码

编辑下你的tomcat目录下conf/server.xml,添加编码如果没有,注意自己添加下

 

<!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" <strong>URIEncoding="UTF⑻"</strong> redirectPort="8443" />

3.创建新工程,并添加需要的JAR包

新建web工程(Dynamic Web project)

所需的jar包以下,注意粘贴到WebContent/WEB-INF/lib下:

  • commons-beanutils⑴.7.0.jar
  • commons-collections⑶.1.jar
  • commons-lang⑵.3.jar
  • commons-logging.jar
  • druid⑴.0.5.jar
  • ezmorph⑴.0.6.jar
  • fastjson⑴.1.25.jar
  • jfinal⑵.2-bin-with-src.jar
  • json-lib⑵.1.jar
  • mchange-commons-java-0.2.3.4.jar
  • mysql-connector-java⑸.1.6-bin.jar
  • servlet-api.jar

上述jar下载地址:

http://download.csdn.net/detail/u011539882/9632973

 

有了这些就能够开始敲代码了。

1.建立入口类MyAppConfig


新建config包,并新建MyAppConfig类且继承JFinalConfig

<span style="font-family:SimSun;">import com.jfinal.config.Constants; import com.jfinal.config.Handlers; import com.jfinal.config.Interceptors; import com.jfinal.config.JFinalConfig; import com.jfinal.config.Plugins; import com.jfinal.config.Routes; public class MyAppConfig extends JFinalConfig{ @Override public void configConstant(Constants me) { // TODO Auto-generated method stub } @Override public void configRoute(Routes me) { // TODO Auto-generated method stub } @Override public void configPlugin(Plugins me) { // TODO Auto-generated method stub } @Override public void configInterceptor(Interceptors me) { // TODO Auto-generated method stub } @Override public void configHandler(Handlers me) { // TODO Auto-generated method stub } } </span>


其中:

public void configConstant(Constants me)

用于设置全局的设置如编码等

public void configRoute(Routes me)

用于设置路由地址,访问地址

public void configPlugin(Plugins plugins)

用于配置1些插件,如连接数据的插件

public void configInterceptor(Interceptors me)

用于配置拦截器

public void configHandler(Handlers me)

用于配置全局拦截器

 

基本配置以下:


<span style="font-family:SimSun;">import com.jfinal.config.Constants; import com.jfinal.config.Handlers; import com.jfinal.config.Interceptors; import com.jfinal.config.JFinalConfig; import com.jfinal.config.Plugins; import com.jfinal.config.Routes; import com.jfinal.ext.handler.ContextPathHandler; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.render.ViewType; import com.myapp.controller.LoginController; import com.myapp.controller.RegisterController; import com.myapp.module.User; /** * 配置类 * * @author zhang * */ public class MyAppConfig extends JFinalConfig { @Override public void configConstant(Constants me) { // 设置为开发模式 me.setDevMode(true); // 设置编码为UTF⑻ me.setEncoding("utf⑻"); // 设置View类型为JSP me.setViewType(ViewType.JSP); } @Override public void configRoute(Routes me) { } @Override public void configPlugin(Plugins plugins) { } @Override public void configInterceptor(Interceptors me) { } @Override public void configHandler(Handlers me) { me.add(new ContextPathHandler("basePath")); } }</span>


配置web.xml文件,路径在WebContent/WEB-INF/,注意如果没有web.xml新建1个,配置以下:

<span style="font-family:SimSun;"><?xml version="1.0" encoding="UTF⑻"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 配置项目名称 --> <display-name>API</display-name> <!-- 配置默许首页 --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 过滤器 --> <filter> <filter-name>jfinal</filter-name> <filter-class>com.jfinal.core.JFinalFilter</filter-class> <init-param> <param-name>configClass</param-name> <param-value>com.myapp.config.MyAppConfig</param-value> </init-param> </filter> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 过滤器配置终了 --> </web-app></span>


配置log4j日志系统,新建log4j.properties:

<span style="font-family:SimSun;">log4j.rootLogger=INFO, stdout, file log4j.appender.stdout.Target=System.out log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n # Output to the File log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=./web.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n # Druid log4j.logger.druid.sql=warn,stdout log4j.logger.druid.sql.DataSource=warn,stdout log4j.logger.druid.sql.Connection=warn,stdout log4j.logger.druid.sql.Statement=debug,stdout log4j.logger.druid.sql.ResultSet=warn,stdout </span>


配置JDBC,新建Config.properties,并加入以下内容,注意修改:

<span style="font-family:SimSun;">driver =com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://你的数据库地址:3306/数据库名字?characterEncoding=utf⑻ user=root //用户名 password=123456 //密码 initialSize=1 minIdle=1 maxActivee=20</span>

除此以外,还需要在MyAppConfig.java文件中对JDBC进行配置,配置的代码需要放在configPlugin方法中,有两个插件可以快速连接数据库,分别为C3P0,还有Druid个人比较偏向于使用DruidDruid为例来进行JDBC连接配置,配置的代码以下:

// 配置JDBC连接 PropKit.use("Config.properties"); final String URL = PropKit.get("jdbcUrl"); final String USERNAME = PropKit.get("user"); final String PASSWORD = PropKit.get("password"); final Integer INITIALSIZE = PropKit.getInt("initialSize"); final Integer MIDIDLE = PropKit.getInt("minIdle"); final Integer MAXACTIVEE = PropKit.getInt("maxActivee"); // Druid插件 DruidPlugin druidPlugin = new DruidPlugin(URL, USERNAME, PASSWORD); druidPlugin.set(INITIALSIZE, MIDIDLE, MAXACTIVEE); druidPlugin.setFilters("stat,wall"); plugins.add(druidPlugin); ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(druidPlugin); plugins.add(activeRecordPlugin);



下1步进行分包

l 新建1个controller包,用于寄存主要逻辑

l 新建1个module包,用于寄存实体类

l 新建1个service包,用于寄存数据库的操作

l 新建1个utils包,用于寄存工具类

 

2.编写接口

 

以登录为例子来展现如何编写接口:

1.加入路由配置

l 首先新建LoginController.java文件在Controller包中,并实现com.jfinal.core.Controller类;

在MyAppConfig中的configRoute方法中加入路由配置,me.add("/", LoginController.class);第1个参 数制定的值访问时候的1个分类1样的东西,例如你写成/login和/时候访问时候就会变成以下情势:

http://localhost:8080/项目名称/login/......(/login)

http://localhost:8080/项目名称/......(/)

第2个参数指的是哪一个类来实现这个逻辑。


3.实现LoginController类


例如你要实现登录的动作,可以新建1个方法,访问时候直接访问该方法便可,例如我新建的方法名字叫 LoginAction所以我在访问时候就能够这样来调用这个登录动作:

http://localhost:8080/项目名称/LoginAction

所以这是方法名称的含义;其次就是获得get要求参数的方法为

this.getPara(String param)方法,里面的参数就是get要求时候的参数,当用户登录成功或失败时候,需 要使用this.renderJson(Object obj)方法来实现json数据的反馈,其中User userModule = LoginService.getUserInfo(user, pwd);这1句的意思我们拿到后面来讲,LoginController的具体代码以下:

package com.myapp.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.jfinal.core.Controller; import com.myapp.module.User; import com.myapp.service.LoginService; /** * 登录动作 * http://localhost:8080/API/login/LoginAction?username=zhangsan&password=123 * * @author zhang * */ public class LoginController extends Controller { /** * 登录动作 */ public void LoginAction() { String user = this.getPara("username"); String pwd = this.getPara("password"); User userModule = LoginService.getUserInfo(user, pwd); JSONObject object = new JSONObject();// 外层json JSONObject infos = new JSONObject();// 成功以后的用户信息 JSONArray data = new JSONArray();// 承载用户信息的array if (userModule == null) {// 用户名或密码毛病 object.put("errorCode", 0); object.put("msg", "用户名或密码毛病"); object.put("data", data); this.renderJson(object); } else if (userModule != null && !userModule.get("password").equals(pwd)) {// 密码毛病,请核对 object.put("errorCode", 0); object.put("msg", "密码毛病,请核对"); object.put("data", data); this.renderJson(object); } else {// 登录成功,返回成功登录信息 object.put("errorCode", 1); object.put("msg", "登录成功"); // 用户信息 infos.put("username", userModule.get("username")); infos.put("nickname", userModule.get("nickname")); infos.put("sex", userModule.getInt("sex")); infos.put("usertype", userModule.getInt("usertype")); infos.put("nickname", userModule.get("nickname")); infos.put("mobile", userModule.get("mobile")); infos.put("score", userModule.getInt("score")); infos.put("token", LoginService.insertTOKEN(user)); // 添加值data数组中 data.add(infos); object.put("data", data); this.renderJson(object); } } }


4.实现实体类

Jfinal在实体类上面我觉得应当是最爽的了,首先在module类中新建1个User.java类,并继承Model,在泛型中加入User类本身,这样1个实体类就写好了,至于为何要继承Model这个类,应当做过开发的同学很清楚,实体类中1般会有数据库表对应的字段或getset方法,但是在Jfinal中完全可以不写这些东西,在MyAppConfig类中设置表映照关系便可实现getset方法,而且这个进程是自动实现的!下面给出User类的实现代码:

package com.myapp.module; import com.jfinal.plugin.activerecord.Model; /** * 用户表 * @author zhang * */ @SuppressWarnings("serial") public class User extends Model<User>{ }


编写好User以后来实现下映照关系,到MyAppconfig的configPlugin方法中在添加插件之前的这句话上面(plugins.add(activeRecordPlugin);),添加映照关系

activeRecordPlugin.addMapping("tb_user","id", User.class);

这3个参数分别是,表名,主键,和对应的实体类是哪个,这样实体类就配置好了。


5.实现LoginService逻辑

在上面说到

User userModule = LoginService.getUserInfo(user, pwd)

这句话,这句话的意思是需要获得到指定用户名密码的用户的用户信息,如果存在的话,就会返回数据库表中的信息;如果不存在的话就会返回空null给User,所以后面的判断都是根据的这个实体类来实现的,首先需要判断数据库中这个用户信息是不是存在,存在的话再返回给User来使用,所以来看下LoginService.getUserInfo该类下的该方法是如何实现的;

首先新建1个LoginService在service包下,并创建getUserInfo方法,具体代码和说明以下:

package com.myapp.service; import com.jfinal.plugin.activerecord.Db; import com.myapp.module.User; import com.myapp.utils.TokenUtil; /** * 登录的动作 * */ public class LoginService { /** * 获得用户信息 * * @return */ public static User getUserInfo(String username, String pwd) { String sql = "SELECT * FROM tb_user WHERE username=?";// sql语句中?可以避免sql注入,多参数多? User user = new User().findFirst(sql, username);// 使用findFirst来实现指定查找,并且查找到的数据会以反射的情势来给User实体类 return user;// 返回User实体类 } /** * 插入token验证 * * @return */ public static String insertTOKEN(String username) { String key = TokenUtil.generalKey(); String sql = " UPDATE tb_user SET token=? WHERE username=?"; Db.update(sql, key, username);//不关联任何实体类的方法,其中有增删改查方法,可以自己来实现下看看 return key; } }


 

到次,就编写终了了,可以运行下试试看了,运行结果以下:



项目Demo下载地址:

http://download.csdn.net/detail/u011539882/9633407



推荐的文章,可以1起深入学习:

http://www.open-open.com/lib/view/open1429844976073.html

http://www.zuidaima.com/share/2307668580043776.htm

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生