JAVAEE用最快最酸爽最简单的方式开发Android接口
Posted 风之叶语
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVAEE用最快最酸爽最简单的方式开发Android接口相关的知识,希望对你有一定的参考价值。
之前有个哥们给我一个SSM(Spring+SpringMVC+MyBatis)框架的工程,让我研究研究android接口的快速开发,得知这个很爽的SSM框架后,我开始研究这个工程,后来实验了半天,作为一个EE小白得到的感受是:
- SSM里面的配置很多;
- 虽然已经是很简单很快速的几个方法几个接口就KO接口了,但是配置还是很复杂
于是,放弃了.....但是个人认为,对于一些比较大型的项目,可以试用SSM框架来实现接口。好了,下面我来介绍一种十分酸爽的EE框架,对于EE小白来说真的是不错的东西,配置上面起码很少,几乎达到0配置,实现上面也很简单,对于数据库的连接上也已经进行了封装,这个框架就是JFinal,不得不说这框架太牛逼了。
本文适合的对象:
l 对Java EE有一定了解的小白
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,且无第三方依赖
Jfinal的官方网站:
开始实践
说了那么多,我们开始实践下这个框架,来验证下是有多爽,下面会以用户登录这个简单的例子来展现如何试用Jfinal框架,使用的请求方式为GET。
准备工作:
1.编写数据库,来支撑后台
这里我使用的是MySql数据库,可视化工具用的是Navicat
这里我创建了一个叫做coderbase的数据库,创建时候注意编码格式一律设置为UFT-8
创建一个用户表tb_user
字段如下:
字段 | 类型 | 含义 |
id | int | id自动递增 |
username | varchar | 用户名 |
password | varchar | 密码 |
nickname | varchar | 昵称 |
sex | int | 性别 |
usertype | int | 用户权限类型 |
| 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', '张三', '123', '三', '1', '1', '', '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-8"</strong>
redirectPort="8443" />
3.创建新工程,并添加需要的JAR包
新建web工程(Dynamic Web project)
所需的jar包如下,注意粘贴到WebContent/WEB-INF/lib下:
- commons-beanutils-1.7.0.jar
- commons-collections-3.1.jar
- commons-lang-2.3.jar
- commons-logging.jar
- druid-1.0.5.jar
- ezmorph-1.0.6.jar
- fastjson-1.1.25.jar
- jfinal-2.2-bin-with-src.jar
- json-lib-2.1.jar
- mchange-commons-java-0.2.3.4.jar
- mysql-connector-java-5.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)
用于配置一些插件,如连接数据的插件
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-8
me.setEncoding("utf-8");
// 设置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新建一个,配置如下:
<span style="font-family:SimSun;"><?xml version="1.0" encoding="UTF-8"?>
<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%-dyyyy-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%-dyyyy-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-8
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);
下一步进行分包
l 新建一个controller包,用于存放主要逻辑
l 新建一个module包,用于存放实体类
l 新建一个service包,用于存放数据库的操作
l 新建一个utils包,用于存放工具类
2.编写接口
以登录为例子来展示如何编写接口:
1.加入路由配置
l 首先新建LoginController.java文件在Controller包中,并实现com.jfinal.core.Controller类;
l 在MyAppConfig中的configRoute方法中加入路由配置,me.add("/", LoginController.class);第一个参 数制定的值访问时候的一个分类一样的东西,例如你写成/login和/时候访问时候就会变成如下形式:
http://localhost:8080/项目名称/login/......(/login)
http://localhost:8080/项目名称/......(/)
第二个参数指的是哪个类来实现这个逻辑。
3.实现LoginController类
例如你要实现登录的动作,可以新建一个方法,访问时候直接访问该方法即可,例如我新建的方法名字叫 做LoginAction,所以我在访问时候就可以这样来调用这个登录动作:
http://localhost:8080/项目名称/LoginAction
所以这是方法名称的含义;其次就是获取get请求参数的方法为
this.getPara(String param)方法,里面的参数就是get请求时候的参数,当用户登录成功或失败时候,需 要使用this.renderJson(Object obj)方法来实现json数据的反馈,其中User userModule = LoginService.getUserInfo(user, pwd);这一句的意思我们拿到后面来说,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类中新建一个User.java类,并继承Model,在泛型中加入User类本身,这样一个实体类就写好了,至于为什么要继承Model这个类,应该做过开发的同学很清楚,实体类中一般会有数据库表对应的字段或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);
这三个参数分别是,表名,主键,以及对应的实体类是哪一个,这样实体类就配置好了。
5.实现LoginService逻辑
在上面说到
User userModule = LoginService.getUserInfo(user, pwd)
这句话,这句话的意思是需要获取到指定用户名密码的用户的用户信息,如果存在的话,就会返回数据库表中的信息;如果不存在的话就会返回空null给User,所以后面的判断都是根据的这个实体类来实现的,首先需要判断数据库中这个用户信息是否存在,存在的话再返回给User来使用,所以来看下LoginService.getUserInfo该类下的该方法是如何实现的;
首先新建一个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
推荐的文章,可以一起深入学习:
http://www.open-open.com/lib/view/open1429844976073.html
http://www.zuidaima.com/share/2307668580043776.htm
以上是关于JAVAEE用最快最酸爽最简单的方式开发Android接口的主要内容,如果未能解决你的问题,请参考以下文章