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的官方网站:

http://www.jfinal.com/

 

开始实践

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

 

准备工作:

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

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

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

创建一个用户表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', '张三', '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接口的主要内容,如果未能解决你的问题,请参考以下文章

最酸爽的哈希(太难了!!!)

最酸爽的哈希(太难了!!!)

如果读了我2011年求职前端开发的酸爽经历,希望你可以鼓起勇气继续向前

这款IDEA插件刷爆了朋友圈,网友:这用起来有点酸爽~

这款IDEA插件刷爆了朋友圈,网友:这用起来有点酸爽~

这款IDEA插件刷爆了技术群,群友:这用起来真酸爽~