【JAVAEE】用最快最酸爽最简单的方式开发Android接口
来源:程序员人生 发布时间:2016-12-08 16:45:14 阅读次数:3599次
之前有个哥们给我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,个人比较偏向于使用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包,用于寄存数据库的操作
l 新建1个utils包,用于寄存工具类
2.编写接口
以登录为例子来展现如何编写接口:
1.加入路由配置
l 首先新建LoginController.java文件在Controller包中,并实现com.jfinal.core.Controller类;
l 在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
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠