多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > web前端 > htmlcss > 【JAVAEE】用最快最酸爽最簡單的方式開發(fā)Android接口

【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個人比較偏向于使用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包,用于寄存數(shù)據(jù)庫的操作

l 新建1個utils包,用于寄存工具類

 

2.編寫接口

 

以登錄為例子來展現(xiàn)如何編寫接口:

1.加入路由配置

l 首先新建LoginController.java文件在Controller包中,并實現(xiàn)com.jfinal.core.Controller類;

在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í)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲欧美综合精品成 | 毛片福利| www亚洲成人 | 日本免费区| 国产一级淫片a免费播放口 国产一级淫片a免费播放口欧美 | 思思久久这里只精品99re66 | 英国美女一级毛片视频 | 午夜国产精品不卡在线观看 | 在线观看 a国v | 欧美国产成人精品一区二区三区 | 18网站在线观看 | 一级毛片不卡免费看老司机 | www.狠狠操.com| 手机看片高清日韩精品 | 亚洲专区中文字幕 | 精品福利在线观看 | 国产成人一区免费观看 | 日韩欧美一区二区三区不卡 | 一级美国乱色毛片 | 欧美天天综合 | 国产精品一二区 | 中文字幕在线视频播放 | 一区二区三区精品国产欧美 | 欧美日韩亚洲一区二区 | 欧美天堂色 | 国产午夜永久福利视频在线观看 | h国产在线观看 | 国产在线欧美日韩精品一区二区 | 国产欧美日韩亚洲精品区2345 | 午夜dj在线观看免费高清在线 | 亚洲色图校园春色 | 亚洲日本免费 | xxxx免费大片 | 欧美日韩中文一区二区三区 | 久久久久国产精品美女毛片 | 欧美精品在线播放 | 最近更新中文字幕免费版 | 亚洲在线看 | 国产欧美成人一区二区三区 | 字幕网中文最新在线 | 性做久久久久久久久浪潮 |