【JAVAEE】用最快最酸爽最簡單的方式開發(fā)Android接口
來源:程序員人生 發(fā)布時間:2016-12-08 16:45:14 閱讀次數(shù):4065次
之前有個哥們給我1個SSM(Spring+SpringMVC+MyBatis)框架的工程,讓我研究研究android接口的快速開發(fā),得知這個很爽的SSM框架后,我開始研究這個工程,后來實驗了半天,作為1個EE小白得到的感受是:
- SSM里面的配置很多;
- 雖然已是很簡單很快速的幾個方法幾個接口就KO接口了,但是配置還是很復(fù)雜
因而,放棄了.....但是個人認為,對1些比較大型的項目,可以試用SSM框架來實現(xiàn)接口。好了,下面我來介紹1種10分酸爽的EE框架,對EE小白來講真的是不錯的東西,配置上面最少很少,幾近到達0配置,實現(xiàn)上面也很簡單,對數(shù)據(jù)庫的連接上也已進行了封裝,這個框架就是JFinal,不能不說這框架太牛逼了。
本文合適的對象:
l 對Java EE有1定了解的小白
l 熟習(xí)tomcat服務(wù)器的
l 熟習(xí)mysql數(shù)據(jù)庫和sql語句的
甚么是Jfinal框架?
援用下官方的介紹:
JFinal 是基于 Java 語言的極速 WEB + ORM 框架,其核心設(shè)計目標(biāo)是開發(fā)迅速、代碼量少、學(xué)習(xí)簡單、功能強大、輕量級、易擴大、Restful。在具有Java語言所有優(yōu)勢的同時再具有ruby、python、php等動態(tài)語言的開發(fā)效力!為您節(jié)儉更多時間,去陪戀人、家人和朋友 :)
Jfinal的特點有甚么?
l MVC架構(gòu),設(shè)計精致,使用簡單
l 遵守COC原則,零配置,無xml
l 獨創(chuàng)Db + Record模式,靈活便利
l ActiveRecord支持,使數(shù)據(jù)庫開發(fā)極致快速
l 自動加載修改后的java文件,開發(fā)進程中無需重啟web server
l AOP支持,攔截器配置靈活,功能強大
l Plugin體系結(jié)構(gòu),擴大性強
l 多視圖支持,支持FreeMarker、JSP、Velocity
l 強大的Validator后端校驗功能
l 功能齊全,具有struts2的絕大部份功能
l 體積小僅339K,且無第3方依賴
Jfinal的官方網(wǎng)站:
http://www.jfinal.com/
開始實踐
說了那末多,我們開始實踐下這個框架,來驗證下是有多爽,下面會以用戶登錄這個簡單的例子來展現(xiàn)如何試用Jfinal框架,使用的要求方式為GET。
準(zhǔn)備工作:
1.編寫數(shù)據(jù)庫,來支持后臺
這里我使用的是MySql數(shù)據(jù)庫,可視化工具用的是Navicat
這里我創(chuàng)建了1個叫做coderbase的數(shù)據(jù)庫,創(chuàng)建時候注意編碼格式1律設(shè)置為UFT⑻
創(chuàng)建1個用戶表tb_user
字段以下:
字段
|
類型
|
含義
|
id
|
int
|
id自動遞增
|
username
|
varchar
|
用戶名
|
password
|
varchar
|
密碼
|
nickname
|
varchar
|
昵稱
|
sex
|
int
|
性別
|
usertype
|
int
|
用戶權(quán)限類型
|
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;
插入測試數(shù)據(jù)
<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.設(shè)置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.創(chuàng)建新工程,并添加需要的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)
用于設(shè)置全局的設(shè)置如編碼等
public void configRoute(Routes
me)
用于設(shè)置路由地址,訪問地址
public void configPlugin(Plugins
plugins)
用于配置1些插件,如連接數(shù)據(jù)的插件
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) {
// 設(shè)置為開發(fā)模式
me.setDevMode(true);
// 設(shè)置編碼為UTF⑻
me.setEncoding("utf⑻");
// 設(shè)置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日志系統(tǒng),新建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,并加入以下內(nèi)容,注意修改:
<span style="font-family:SimSun;">driver =com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://你的
數(shù)據(jù)庫地址:3306/
數(shù)據(jù)庫名字?characterEncoding=utf⑻
user=root //用戶名
password=123456 //密碼
initialSize=1
minIdle=1
maxActivee=20</span>
除此以外,還需要在MyAppConfig.java文件中對JDBC進行配置,配置的代碼需要放在configPlugin方法中,有兩個插件可以快速連接數(shù)據(jù)庫,分別為C3P0,還有Druid,個人比較偏向于使用Druid,以Druid為例來進行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包,用于寄存數(shù)據(jù)庫的操作
l 新建1個utils包,用于寄存工具類
2.編寫接口
以登錄為例子來展現(xiàn)如何編寫接口:
1.加入路由配置
l 首先新建LoginController.java文件在Controller包中,并實現(xiàn)com.jfinal.core.Controller類;
l 在MyAppConfig中的configRoute方法中加入路由配置,me.add("/",
LoginController.class);第1個參
數(shù)制定的值訪問時候的1個分類1樣的東西,例如你寫成/login和/時候訪問時候就會變成以下情勢:
http://localhost:8080/項目名稱/login/......(/login)
http://localhost:8080/項目名稱/......(/)
第2個參數(shù)指的是哪一個類來實現(xiàn)這個邏輯。
3.實現(xiàn)LoginController類
例如你要實現(xiàn)登錄的動作,可以新建1個方法,訪問時候直接訪問該方法便可,例如我新建的方法名字叫
做LoginAction,所以我在訪問時候就能夠這樣來調(diào)用這個登錄動作:
http://localhost:8080/項目名稱/LoginAction
所以這是方法名稱的含義;其次就是獲得get要求參數(shù)的方法為
this.getPara(String param)方法,里面的參數(shù)就是get要求時候的參數(shù),當(dāng)用戶登錄成功或失敗時候,需
要使用this.renderJson(Object obj)方法來實現(xiàn)json數(shù)據(jù)的反饋,其中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數(shù)組中
data.add(infos);
object.put("data", data);
this.renderJson(object);
}
}
}
4.實現(xiàn)實體類
Jfinal在實體類上面我覺得應(yīng)當(dāng)是最爽的了,首先在module類中新建1個User.java類,并繼承Model,在泛型中加入User類本身,這樣1個實體類就寫好了,至于為何要繼承Model這個類,應(yīng)當(dāng)做過開發(fā)的同學(xué)很清楚,實體類中1般會有數(shù)據(jù)庫表對應(yīng)的字段或getset方法,但是在Jfinal中完全可以不寫這些東西,在MyAppConfig類中設(shè)置表映照關(guān)系便可實現(xiàn)getset方法,而且這個進程是自動實現(xiàn)的!下面給出User類的實現(xiàn)代碼:
package com.myapp.module;
import com.jfinal.plugin.activerecord.Model;
/**
* 用戶表
* @author zhang
*
*/
@SuppressWarnings("serial")
public class User extends Model<User>{
}
編寫好User以后來實現(xiàn)下映照關(guān)系,到MyAppconfig的configPlugin方法中在添加插件之前的這句話上面(plugins.add(activeRecordPlugin);),添加映照關(guān)系
activeRecordPlugin.addMapping("tb_user","id", User.class);
這3個參數(shù)分別是,表名,主鍵,和對應(yīng)的實體類是哪個,這樣實體類就配置好了。
5.實現(xiàn)LoginService邏輯
在上面說到
User userModule = LoginService.getUserInfo(user, pwd)
這句話,這句話的意思是需要獲得到指定用戶名密碼的用戶的用戶信息,如果存在的話,就會返回數(shù)據(jù)庫表中的信息;如果不存在的話就會返回空null給User,所以后面的判斷都是根據(jù)的這個實體類來實現(xiàn)的,首先需要判斷數(shù)據(jù)庫中這個用戶信息是不是存在,存在的話再返回給User來使用,所以來看下LoginService.getUserInfo該類下的該方法是如何實現(xiàn)的;
首先新建1個LoginService在service包下,并創(chuàng)建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注入,多參數(shù)多?
User user = new User().findFirst(sql, username);// 使用findFirst來實現(xiàn)指定查找,并且查找到的數(shù)據(jù)會以反射的情勢來給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);//不關(guān)聯(lián)任何實體類的方法,其中有增刪改查方法,可以自己來實現(xiàn)下看看
return key;
}
}
到次,就編寫終了了,可以運行下試試看了,運行結(jié)果以下:

項目Demo下載地址:
http://download.csdn.net/detail/u011539882/9633407
推薦的文章,可以1起深入學(xué)習(xí):
http://www.open-open.com/lib/view/open1429844976073.html
http://www.zuidaima.com/share/2307668580043776.htm
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈