发布于 2016-08-19 07:50:45 | 147 次阅读 | 评论: 0 | 来源: 网友投递
Hasor Java开源框架
Hasor是一款开源框架。它是为了解决企业模块化开发中复杂性而创建的。Hasor遵循简单的依赖、单一职责,在开发多模块企业项目中更加有调理。然而Hasor的用途不仅仅限于多模块项目开发。从简单性、松耦合性的角度而言,任何Java应用都可以从中受益。Hasor与Struts,Hibernate等单层框架不同,它可以提供一个以统一、高效的、友好的方式构造整个应用程序。并且可以将这些单层框架建立起一个连贯的体系,可以说Hasor是一个搭建开发环境的框架。Hasor包含多个可选的子模块
设计思想
Hasor 提倡开发者充分利用编程语言的优势进行三方整合和模块化设计。同时 Hasor 也主要是通过这种“ 微内核+插件 ”的方式丰富开发所需的所有功能。
决定避开 COC 原则的原因是, COC 虽然已约定的方式降低了整个框架的设计复杂度,但同时也最大限度的牺牲了框架的灵活性。缺少灵活性的框架在应用场景上会受到极大的制约。而 Hasor 的设计则更加面向底层,因此需要更多的灵活性。
Hasor 强大的灵活性表现在模块整合能力上,对于某一个领域开发方面 Hasor 依然强调并力推 COC 。小而美的核心,大而全的生态圈是 Hasor 的目标。
01. IoC/Aop编程模型,设计精巧,使用简单。
02. COC原则的最佳实践,‘零’配置文件。
03. 微内核 + 扩展,基于内核已发展出 DB、Web、Restful 三大独立的基础框架。
04. 真正的零开发,解析项目特有的自定义 Xml 配置。
05. 支持模板化配置文件,程序打包之后一套配置通吃(日常、预发、线上)以及其它各种环境。
06. 完备的 JDBC 操作接口,支持 Result -> Object 映射。
07. 提供三种途径控制事务,支持七种事务传播属性,标准的事务隔离级别。
08. 支持多数据源、及多数据源下的事务控制(非JPA)。
09. 内置事件机制,方便进行业务深度解耦,使业务逻辑更佳清晰。
10. 支持 Web 类型项目开发,提供 restful 风格的 mvc 开发方式。
11. 支持Form表单验证、支持场景化验证。
12. 提供开放的模版渲染接口,支持各种类型的模版引擎。
13. 提供丰富的工具箱,帮助您快速开发,有了它您甚至不需要 apache-commons。
14. 支持log4j、logback等多种主流日志框架。
15. 体积小,无第三方依赖。
---2.4.1 到 2.4.3 ---
* 新增: 01.新增 Htmlspace工具类:StringEscapeUtils、EntitiesUtils。工具来源为:apache-common * 改进: 01.改进启动日志输出。 02.WebController 增加一组 putData 方法用于输出到渲染模版中。 03.JdbcOperations接口可以通过依赖注入被注入到 Service 中。 05.TransactionTemplateManager 代码优化,修复潜在的 npe 异常情况。 06.ValidErrors 接口继承自 RenderData 获取参数更加方便。 07.WebController 类重度优化,删除了一些重复的方法,增添表单验证相关的方法。
* 新增: 01.Restful 框架整合 Validation 插件增加请求参数 @Valid 验证功能。 02.注解 @Valid 支持场景化验证。 * 改进: 01.env.config 加载环境变量遇到名称冲突时的,Bug。 02.DBModule 类,在声明 Aop 类匹配的时候从任意类,改为需要标记 @Transactional 注解的类。
* 改进: 01.env.config 功能的优化。
---一个简单的用户登陆Demo ---
/** * 本地登陆 * @version : 2016年1月1日 * @author 赵永春(zyc@hasor.net) */ @MappingTo("/account/login.{action}") public class Login extends Action { // public void execute(@PathParam("action") String action, @Valid("SignIn") @Params LoginForm loginForm, RenderData data) throws IOException { if (StringUtils.equalsIgnoreCase("do", action)) { // // - 登录请求 this.putData("loginForm", loginForm); if (!data.isValid()) { renderTo("htm", "/account/login.htm");//验证失败 } else { renderTo("htm", "/account/login.htm");//验证通过 } } else { // // - 登录页面 data.clearValidErrors();//清空验证信息,避免瞎显示 if (this.isLogin()) { String ctx_path = data.getAppContext().getServletContext().getContextPath(); data.getHttpResponse().sendRedirect(ctx_path + "/account/my.htm"); } } } }
FormBean
@ValidBy(LoginFormValidation.class) public class LoginForm { @ReqParam("email") private String email; @ReqParam("account") private String account; @ReqParam("password") private String password; @ReqParam("redirectURI") private String redirectURI; // // .... .... }
表单验证器
public class LoginFormValidation implements Validation<LoginForm> { @Override public void doValidation(String validType, LoginForm dataForm, ValidErrors errors) { if (StringUtils.equalsIgnoreCase("SignIn", validType)) { if (!StringUtils.equalsIgnoreCase("admin", dataForm.getAccount())) { errors.addError("account", "帐号不是admin。"); } // // } else if (StringUtils.equalsIgnoreCase("SignUp", validType)) { errors.addError("message", "暂不支持注册功能。"); // } } }
使用了 Freemarker 之后页面对于验证结果的显示
<form class="form-horizontal"> <input type="hidden" name="redirectURI" value="${req_redirectURI}"/> <input name="email" type="text" value="${loginForm.email}"> <!-- 帐号的验证结果 --> <#if validData["account"]?? >${escapeHtml.escapeHtml(validData["account"]?join(","))}</#if> <input name="password" type="password"> <!-- 密码的验证结果 --> <#if validData["password"]?? >${escapeHtml.escapeHtml(validData["password"]?join(","))}</#if> <input type="submit"> </form>