`
j2eetop
  • 浏览: 59714 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

从应用示例来认识Tiny框架

 
阅读更多
呵呵,Tiny框架神龙见首不见尾已经许多时间了,里面只看到一些几个孤零零的子框架。今天就通过Tiny开发示例的方式来重点展示一下利用Tiny框架是如何开发的。
HelloWorld
首先从这个神一样的示例写起。
服务开发:
方式1:注解方式
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
@ServiceComponent()
public class HelloWorldAnnotationService{
@ServiceMethod(serviceId = "sayHelloA")
@ServiceResult(name = "result")
@ServiceViewMapping("/helloworld/helloresult.page")
public String sayHello(String name) {
if (name == null) {
name = "world.";
}
return "hello," + name;
}
}

解释:
@ServiceMethod(serviceId = "sayHelloA")声明服务ID,必须不能重复,保证唯一
@ServiceResult(name = "result")声明返回结果在服务调用完之后旋转在数据总线的名称
@ServiceViewMapping("/helloworld/helloresult.page")声明如果调用服务之后转向的展现页面,可省略
表单输入界面:helloworld.page
服务方式:
[AppleScript] 纯文本查看 复制代码
1
2
3
4
<form action="sayHelloA.servicepage">
输入名称:<input type="text" name="name"/>
<input type="submit" value="提交"/>
</form>

运行结果界面:
helloresult.page
$!result
方式2:Xml配置方式
[AppleScript] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
public class HelloWorldXmlService{
public String sayHello(String name) {
if (name == null) {
name = "world.";
}
return "hello," + name;
}
}

上面写完类之后,还要再加一个配置文件:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<service-components>
<service-component type="org.tinygroup.helloworld.service.HelloWorldXmlService"
group-id="org.tinygroup" artifact-id="helloworldservice">
<service-method name="sayHello" local-name="sayHello"
service-id="sayHello" version="" description=""
method-name="sayHello">
<service-parameters>
<service-parameter name="name" type="java.lang.String"
required="true" is-array="false" />
</service-parameters>
<service-result name="result" required="false"
is-array="false" type="java.lang.String" />
</service-method>
</service-component>
</service-components>

这段Xml手工写还是有点麻烦的,不过没关系,咱有工具:

172244_xQD4_1245989.jpg (33.82 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传


172345_2GDF_1245989.jpg (82.79 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



如果想在调用服务之后自动转向到一个页面,则要再配下面的xml
[AppleScript] 纯文本查看 复制代码
1
2
3
<service-view-mappings>
<service-view-mapping service-id="sayHello" path="/helloworld/helloresult.page" type="forward"></service-view-mapping>
</service-view-mappings>

表单输入界面:helloworld.page
服务方式:
[AppleScript] 纯文本查看 复制代码
1
2
3
4
<form action="sayHello.servicepage">
输入名称:<input type="text" name="name"/>
<input type="submit" value="提交"/>
</form>

运行结果界面:
[AppleScript] 纯文本查看 复制代码
1
2
helloresult.page
$!result

方式3:流程编排方式
要通过流程编排方式实现,先要写一个组件:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
public class HelloWorldComponent implements ComponentInterface {
String name;
String resultKey;
public String getResultKey() {
return resultKey;
}
public void setResultKey(String resultKey) {
this.resultKey = resultKey;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void execute(Context context) {
context.put(resultKey, String.format("Hello, %s", name));
}
}

写完组件之后,还要编写组件定义文件来定义组件的定义文件,当然要做成组件,就一定要有通用性,这样就可以一次定义,到处使用,对于只用一次的,这么做就不方便了。
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
<components>
<component name="helloworld" bean="helloworld"
title="HelloWorld组件" category="测试组件" icon="/icon/component.gif">
<short-description>helloworld component</short-description>
<long-description>helloworld component long description
</long-description>
<parameter name="name" title="名字" type="java.lang.String"></parameter>
<parameter name="resultKey" title="结果键值" type="java.lang.String"></parameter>
</component>
</components>

OK,现在流程组件就开发完毕了。

144453_9aLV_1245989.jpg (26.35 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传


就可以像上面一样在可视的流程编辑器中进行可视化开发了。
表单输入页面:
[AppleScript] 纯文本查看 复制代码
1
2
3
4
5
6
/helloworld.page
流程方式:
<form action="helloworld.pageflow">
输入名称:<input type="text" name="name"/>
<input type="submit" value="提交"/>
</form>

运行结果页面:
[AppleScript] 纯文本查看 复制代码
1
2
helloresult.page
$!result

上面的展现简单是简单了点,但是容易理解。
通过上面的HelloWorld,我们对Tiny框架的服务开发及界面开发及控制层的开发都有了一定的了解,下面我们就进入更加复杂一点的示例:
四则运算
由于前面一节已经有了一定了解,因此这一节就只贴代码,解释就省了。

通过注解方式开发服务
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@ServiceComponent()
public class FourOperateAnnotationService{
@ServiceMethod(serviceId = "additionWithAnno")
@ServiceResult(name = "result")
@ServiceViewMapping("/fouroperate/result.page")
public double addition(double number1,double number2){
return number1+number2;
}
@ServiceMethod(serviceId = "subtractWithAnno")
@ServiceResult(name = "result")
@ServiceViewMapping("/fouroperate/result.page")
public double subtraction(double number1,double number2){
return number1-number2;
}
@ServiceMethod(serviceId = "multiWithAnno")
@ServiceResult(name = "result")
@ServiceViewMapping("/fouroperate/result.page")
public double multi(double number1,double number2){
return number1*number2;
}
@ServiceMethod(serviceId = "divisionWithAnno")
@ServiceResult(name = "result")
@ServiceViewMapping("/fouroperate/result.page")
public double division (double number1,double number2){
return number1/number2;
}
}

通过Xml配置方式开发服务
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class FourOperateXmlService{
public Double addition(Double number1,Double number2){
return number1+number2;
}
public Double subtraction(Double number1,Double number2){
return number1-number2;
}
public Double multi(Double number1,Double number2){
return number1*number2;
}
public Double division (Double number1,Double number2){
return number1/number2;
}
}

通过流程方式开发服务
下面先搞个抽象类:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public abstract class AbstractFourOperateComponent implements ComponentInterface {
protected double number1;
protected double number2;
protected String resultKey;
public String getResultKey() {
return resultKey;
}
public void setResultKey(String resultKey) {
this.resultKey = resultKey;
}
public double getNumber1() {
return number1;
}
public void setNumber1(double number1) {
this.number1 = number1;
}
public double getNumber2() {
return number2;
}
public void setNumber2(double number2) {
this.number2 = number2;
}
}

接下来就简单了:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

然后就可以通过编辑器,可视化编辑了。

150926_F5FX_1245989.jpg (5.87 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



由于这里主要说明服务端的开发,因此客户端的开发就省略了,其实也是非常简单的。

数据库示例
搞开发,怎么能不搞数据库呢??
下面展现一下数据的开发:
采用Hibernate来开发数据库应用
首先搞个Pojo
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

接下来配个hbm文件:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<hibernate-mapping package="org.tinygroup.crud.pojo">
<class name="User" table="user" >
<id name="id" >
<generator class="native" />
</id>
<property name="name" />
<property name="age" />
</class>
</hibernate-mapping>

再接下来写个Dao:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class HibernateCrudDao extends HibernateDaoSupport implements CrudDbDao<User>{
public void addUser(User user) {
getHibernateTemplate().save(user);
}
public void updateUser(User user) {
getHibernateTemplate().update(user);
}
public void deleteUser(User user) {
getHibernateTemplate().delete(user);
}
@SuppressWarnings("unchecked")
public List<User> queryUsers(User user) {
if(user==null){
return getHibernateTemplate().loadAll(User.class);
}
return getHibernateTemplate().findByExample(user);
}
public User queryUserById(int id) {
return (User) getHibernateTemplate().get(User.class, id);
}
}

接下来实现服务:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@ServiceComponent()
public class HibernateCrudService implements CrudDbService<User> {
private CrudDbDao<User> crudDbDao;
public CrudDbDao<User> getCrudDbDao() {
return crudDbDao;
}
public void setCrudDbDao(CrudDbDao<User> crudDbDao) {
this.crudDbDao = crudDbDao;
}
@ServiceMethod(serviceId = "addUser")
@ServiceViewMapping(value="/queryUsers.servicepage",type="redirect")
public void addUser(User user) {
crudDbDao.addUser(user);
}
@ServiceMethod(serviceId = "updateUser")
@ServiceViewMapping(value="/queryUsers.servicepage",type="redirect")
public void updateUser(User user) {
crudDbDao.updateUser(user);
}
@ServiceMethod(serviceId = "deleteUser")
@ServiceViewMapping(value="/queryUsers.servicepage",type="redirect")
public void deleteUserById(int id) {
User user=getUserById(id);
crudDbDao.deleteUser(user);
}
@ServiceMethod(serviceId = "queryUsers")
@ServiceResult(name = "users")
@ServiceViewMapping("/crud/service/hibernate/list.page")
public List<User> queryUsers(User user) {
return crudDbDao.queryUsers(user);
}
@ServiceMethod(serviceId = "queryUserById")
@ServiceResult(name = "user")
@ServiceViewMapping("/crud/service/hibernate/operate.page")
public User getUserById(Integer id) {
if(id==null){
return null;
}
return crudDbDao.queryUserById(id);
}
}

没错,你看起来这里的服务都是直接调用dao里的方法的,对于这个简单例子看起来有点重复,但是实际应用中是不可能直接把dao发布成服务的,因此你可以想像一下这里有好多步操作就好了。
至此基于Hibernate就可以开发完毕了。

采用TinyDB来实现
TinyDB采用了No Pojo,No Dao的解决方案:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@ServiceComponent()
public class TinyDbCrudService extends BeanSupport implements CrudDbService<Bean>{
private DBOperator operator;
private BeanOperatorManager manager;
private String beanType;
public void setBeanType(String beanType) {
this.beanType = beanType;
}
public void setManager(BeanOperatorManager manager) {
this.manager = manager;
}
/** 初始化bean。 */
protected void init() throws Exception {
Assert.assertNotNull(manager, "manager must not null");
operator=manager.getDbOperator(beanType);
}
@ServiceMethod(serviceId = "addUserTiny")
@ServiceViewMapping(value="/queryUsersTiny.servicepage?@beantype=user",type="redirect")
public void addUser(Bean user) {
operator.insert(user);
}
@ServiceMethod(serviceId = "updateUserTiny")
@ServiceViewMapping(value="/queryUsersTiny.servicepage?@beantype=user",type="redirect")
public void updateUser(Bean user) {
operator.update(user);
}
@ServiceMethod(serviceId = "deleteUserTiny")
@ServiceViewMapping(value="/queryUsersTiny.servicepage?@beantype=user",type="redirect")
public void deleteUserById(int id) {
operator.deleteById(id);
}
@ServiceMethod(serviceId = "queryUsersTiny")
@ServiceResult(name = "users")
@ServiceViewMapping("/crud/service/tinydb/list.page")
public List<Bean> queryUsers(Bean user) {
if(user==null){
user=new Bean(beanType);
}
Bean[] beans= operator.getBeans(user);
return Arrays.asList(beans);
}
@ServiceMethod(serviceId = "queryUserByIdTiny")
@ServiceResult(name = "user")
@ServiceViewMapping("/crud/service/tinydb/operate.page")
public Bean getUserById(Integer id) {
if(id==null){
return null;
}
return operator.getBean(id);
}
}

OK,这样就算完成了。
够简单么??NO,还不够简单。
实际上TinyDB中对于常用的CRUD,根本就不用写代码,框架默认就全部支持了,所以只有复杂的业务逻辑的都需要像上面一样写一下,简单的CRUD,就不用写了。

通过流程方式开发
框架内嵌已经包含了常用的数据库处理组件:

152717_8WYb_1245989.jpg (26.89 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传


哇,只要拖拖配配就可以了。

页面流
页面流是Tiny框架推荐的控制层解决方案,它强大,简单,可视性好。

153711_cVs6_1245989.jpg (22.29 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



呵呵,是不是实现简单,看起来清晰?
当然它的强大在这么简单的例子里是看不到的。

WEB工程
从上面的示例来看,它的界面确实是简单的。然后上面的三个工程最后打了3个Jar包,就算开发完毕了。
在我们的Web工程中,我们要添加这些示例,只要修改pom文件即可:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<dependency>
<groupId>org.tinygroup</groupId>
<artifactId>org.tinygroup.helloworld</artifactId>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.tinygroup</groupId>
<artifactId>org.tinygroup.fouroperate</artifactId>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.tinygroup</groupId>
<artifactId>org.tinygroup.crud</artifactId>
<version>1.2.0-SNAPSHOT</version>
</dependency>

POM添加了,功能就添加了;POM删除了,功能就删除了,这就是Tiny框架中所说的模块化。
UI引擎
示例完成之后,我对做示例的同学说,你这个示例写得还是可以的,但是我展示的时候很不方便,我要记得每个地址,这对我要求也太高了,能不能给我搞个菜单出来??
此同学说好的,结果他创建了一个default.layout文件,加了如下的代码:
[AppleScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<table border="1" width="100%">
<tr>
<td colspan="2">
helloworld示例:<a href="${TINY_CONTEXT_PATH}/helloworld/helloworld.page">helloworld</a><br/>
四则运算示例:<a href="${TINY_CONTEXT_PATH}/fouroperate/fouroperate.page">四则运算</a><br/>
增删改查示例:<a href="${TINY_CONTEXT_PATH}/crud/crud.page">增删改查</a><br/>
</td>
</tr>
<tr>
<td width="20%">内容展示</td>
<td>
$pageContent
</td>
</tr>
</table>

然后我就在访问所有页面的时候都有菜单可用了,这就是TinyUI框架中的装饰。

应用截图
首页:

163238_pRxM_1245989.jpg (9.93 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



点击helloworld进入helloworld示例首页

163352_cNzD_1245989.jpg (4.44 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



再点下面的服务方式后的helloworld链接

163509_dNmk_1245989.jpg (5.53 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



输入abc之后,点提交:

163559_Wypy_1245989.jpg (4.32 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传


结果就出来了。

下面是数据访问页面:

163722_XWdH_1245989.jpg (12.68 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



添加界面:

163825_jOrC_1245989.jpg (6.83 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传




四则运算界面:

163919_C5T0_1245989.jpg (8.39 KB, 下载次数: 0)

下载附件

2015-5-28 17:17 上传



呵呵,不要嫌界面丑,界面丑是因为我不想引入复杂的页面使得注意力转移到其它地方。

总结
上面用了三个例子:HelloWorld,四则运算,数据库访问来对Tiny框架的开发过程进行了展示。当然,Tiny框架提供的实际内容要远远多于你上面看到的内容,比如:
对页面的局部刷新有强有力的支持,便于进行Ajax处理
提供Bigpipe模式来提升用户体验
提供CSS合并、提供JS合并,提供内容压缩输出到浏览器端
上面开发的所有服务都可以提供xml,json方式结果的返回,也可以通过webservice进行访问
提供分层部署能力
提供集群部署支持,接入服务器可以水平进行扩展,应用服务器可以进行水平扩展。
更多请看Tiny框架内容组成请看:
http://my.oschina.net/tinyframework/blog/204994
更多内容请看本人首页:http://my.oschina.net/tinyframework

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics