发布于 2016-08-19 07:50:45 | 160 次阅读 | 评论: 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>