基于playframework v1构建一个新的Java web应用框架

正在考虑基于playframework v1构建一个新的Java web应用框架

动机: 我非常喜欢 playframework v1 但对v2不太感冒 v1中哪些特性应该保留:

  • 字节码增强。 这个超酷的特性允许框架和插件作者在应用中插入需要的逻辑,比如AOP,而AOP也仅仅是其中之一而已。
  • 全栈框架。跟play一样,这个新框架应该能自己运行,而不是插入一个Servlet容器。当然也应该允许用户应用被包进Servlet。
  • 支持插件,虽然API应有所变化。
  • 为应用程序提供方便的工具库, 比如 IO, Codec, Images 等.
  • 内置简单的安全框架
  • 易用的DB 层,允许插入不同的实现,包括 JPA, EBean, Morphia 等.
  • 内置数据有效性检查
  • 方便易用的异步API。
  • Before, After, Final, Catch 等过滤器
  • 根据 request.format 自动匹配模板文件
  • 模板中支持JavaExtension
  • 最最重要的是 简洁易用!

哪些应该改变或者提高的:

  • 路由机制。优化路由性能,让框架在大型应用(100条路由以上)也能快速定位响应方法。优化的机制可能包括使用代码生成器生成为每条路由动态生成帮助类。
  • 响应方法启动机制. 提高性能,减少对 reflection, static methods 和 Exception的使用。但API应该保持play1的简洁易用。
  • 插件框架API。
  • 用Java和脚本替代play1发行包中的python部分
  • CRUD
  • 用Rythm替代Groovy作为缺省模板引擎
  • 用Ebean替代JPA作为缺省数据访问层
  • 增强对JSON的支持。
  • 用markdown替代textile作为文档语言

Proposed Controller API:

public class Orders extends Controller {
 
 
   // --- Parameters used in action handling methods
   @Bind(method = Bind.ByID)
   protected Order order; // will bind to http request params with Order.findById(params.get("orderId"))
 
   @Bind(method = Bind.ById)
   protected User user;
   // -- eof Parameters
 
   // this use new return style API
   @Required("orderId")
   public Result show() {
     return new Render(order);
   }
 
 
   // this use old style API
   @Required("orderId")
   public void saveUpdate() {
     notFoundIfNull(user);
     order.save();
     render(order, user);
   }
 
   // this action method will be executed in a separate thread
 @Async
   public Result report() {
     order.save();
     List<Order> orders = ...
     return new RenderPDF(orders);
   }
 
 }
 
Sample route file:
GET /orders/{orderId} Orders.show
 POST /orders/{orderId} Orders.saveUpdate
 GET /orderReport Orders.report
 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏.NET技术

.net平台的rabbitmq使用封装

  RabbitMq大家再熟悉不过,这篇文章主要整对rabbitmq学习后封装RabbitMQ.Client的一个分享。文章最后,我会把封装组件和demo奉上。

1287
来自专栏AhDung

对C#中的Close()和Dispose()的浅显理解

.net中的许多类都提供了Close()和Dispose()方法,一直以来我都以为它俩是一回事,是完全等价的,在任何地方,用其一即可,这一意识源于《NET设计规...

722
来自专栏Jerry的SAP技术分享

使用nodejs消费SAP Cloud for Customer上的Web service

Jerry在公众号文章C4C和微信集成系列教程里曾经使用nodejs去消费C4C提供的标准webservice。

1772
来自专栏大内老A

[WCF REST] 一个简单的REST服务实例

微软在WCF 3.5中就通过提供基于Web HTTP的编程模式使我们很容易地创建基于REST的服务,WCF 4.0中对此进行了较大的改进。为了让读者对REST在...

1646
来自专栏AI-vell

java轻量RESTful api服务搭建(jersey+jetty)

由于开始要搭建一个java + python的服务,java端提供数据库增删改查逻辑供python端调用,第一时间想到了用REST(Representation...

2737
来自专栏张善友的专栏

实现WebSocket和WAMP协议的开源库WampSharp

Websocket Application Messaging Protocol 协议:https://github.com/wamp-proto/wamp-p...

1997
来自专栏张善友的专栏

Net Framework 2.0 事务处理

事务 处理事务是构建许多业务逻辑的一个重要方面。 .NET Framework 2.0 中的事务 在 .NET Framework 2...

1678
来自专栏杨建荣的学习笔记

从业务角度分析奇怪的数据库高负载问题 (r4笔记第35天)

今天到公司以后,照例查看了数据库的负载情况,发现有一些异常。11点开始到12点的时候,数据库的负载格外的高。按照平时的经验,这个时间段内不会有太多的高峰业务在运...

2595
来自专栏二进制文集

思维导图学《Mongo 官方文档》

本文是对 Mongo 官方文档粗略的总结,并没有涉及到很深的细节(细节还是直接看官方文档吧)。我认为 Mongo 有重要的就 3 点:

583
来自专栏hbbliyong

检测端口是否被占用

        当我们要创建一个Tcp/Ip Server connection ,我们需要一个范围在1000到65535之间的端口 。 但是本机一个端口只能一...

27010

扫码关注云+社区