Hasor 2.4.3 正式发布了,Hasor 是一款基于 Java 语言的应用程序开发框架,它的核心设计目标是提供一个简单、且必要的环境给开发者。开发者可以在此基础上,通过 Hasor 强有力的粘合机制,构建出更加完善的应用场景。同时 Hasor 的各种内置插件也会帮助开发者进行快速开发。而所有内置插件,在初始化的时都做了智能加载,只有用到了它们才会被加载到框架中。否则这些内置插件在初始化期间就会放弃加载自己。基于目前 Hasor 内核上已经发展出 DB、Web、Restful 三大基础框架。
该版本更新如下:
新增:
01.新增 Htmlspace工具类:StringEscapeUtils、EntitiesUtils。工具来源为:apache-common
改进:
01.改进启动日志输出。
02.WebController 增加一组 putData 方法用于输出到渲染模版中。
03.JdbcOperations接口可以通过依赖注入被注入到 Service 中。
04.TransactionTemplateManager 代码优化,修复潜在的 npe 异常情况。
05.ValidErrors 接口继承自 RenderData 获取参数更加方便。
06.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>