<commit_before>@extends(layout, title = "ActFramework Home")

@section("moreJs") {
<script src="/js/site.js"></script>
<script src="/js/prism.js" charset="utf-8"></script>
}

@section("moreCss") {
<link rel="stylesheet" href="/css/prism.css">
<link rel="stylesheet" href="/css/prism-line-numbers.css">
<style>
  h6.feature[data-link] {
    cursor: pointer;
  }
</style>
}


<div class="container">
  <section class="hero">
    <h1>ActFramework v1.0.1</h1>
    <h5>Java MVC 框架的最终幻想</h5>
    <a class="button button-primary" href="#start">马上使用!</a>
    <div class="value-props row">
      <div class="four columns value-prop">
        <img class="value-img" src="/image/development.png">
        无与伦比的开发体验 ． 卓越的性能
      </div>
      <div class="four columns value-prop">
        <img class="value-img" src="/image/tech.png">
        绝妙的RESTful支持　．　强大的后端页面生成
      </div>
      <div class="four columns value-prop">
        <img class="value-img" src="/image/security.png">
        安全从无如此简单
      </div>
    </div>
  </section>


  <div class="navbar-spacer"></div>
  <nav class="navbar">
    <div class="container">
      <ul class="navbar-list">
        <li class="navbar-item"><a class="navbar-link" href="/#intro">介绍</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/doc/index">文档</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#video">视频教程</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#start">开始使用Act！</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#support">技术支持</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#about">关于</a></li>
      </ul>
      <ul class="navbar-list u-pull-right">
        <li class="navbar-item"><a id="go_zh" class="navbar-link" href="#">中文</a></li>
        <li class="navbar-item u-pull-right"><a id="go_en" class="navbar-link" href="#">English</a></li>
      </ul>
    </div>
  </nav>


  <div class="docs-section" id="intro">
    <h6 class="docs-header">最新消息</h6>
    <ul>
      <li>
        <a href="/doc/release_notes">2017-03-13: ActFramework 1.0.2 在maven中央库发布</a>
      </li>
      <li>
        <a href="/doc/release_notes">2017-03-09: ActFramework 1.0.0 在maven中央库发布</a>
      </li>
      <li>
        一个ActFramework实现的<a href="http://www.todobackend.com/">TodoBackend</a>项目: http://github.com/greenlaw110/todomvc-act
      </li>
      <li>
        著名的<a href="https://www.techempower.com/benchmarks">TechEmpower Benchmark</a>接受了
        ActFramework提交的<a href="https://github.com/TechEmpower/FrameworkBenchmarks/pull/2525">PR</a>
      </li>
      <li>
        一个第三方发布的<a href="https://github.com/networknt/microservices-framework-benchmark">简单的benchmark</a>
        显示ActFramework在处理简单请求时的强劲性能: 吞吐量可以达到SpringBoot的20倍以上
      </li>
    </ul>
    <h6 class="docs-header">ActFramework 特性</h6>
    <p>
      ActFramework是一种简洁易用,具有强大表达力的Java MVC框架
    </p>
    <ul>
      <li>
        <h6 class="feature" data-link="full-stack">
          全栈式框架
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden full-stack">
          ActFramework的应用都有自己的main方法, 通常在数秒之内完成启动

          <div class="feature-desc alert alert-info">
            <i class="fa fa-info-circle indicator"></i> Act不是一个Servlet架构的框架, Act应用不能部署到Servlet容器中
          </div>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="dev-exp">
          无与伦比的开发体验 ． 卓越的性能
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden dev-exp">
          <p>
            在开发模式下Act支持热加载。在开发模式下，收到任何请求的时候Act会扫描项目的`src`目录，项目中的任何java源代码、
            模板源码或者配置文件有变动，Act会废弃掉当前的<code>ApplicationClassLoader</code>，重新编译整个项目，并加载到一个新的
            <code>ApplicationClassLoader</code>中。这个过程非常快，我们一个上万行源码的项目，热加载的过程大概在500ms完成。
          </p>
          <p>
            虽然开发体验为ActFramework的最高优先级，我们同时也非常重视系统性能。根据
            <a href="https://www.techempower.com/benchmarks/">这个</a>
            benchmark项目，对于一个简单的HelloWorld应用, ActFramework的性能是SpringBoot的20倍以上。
          </p>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="di">
          依赖注入
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden di">
          Act通过<a href="https://github.com/osglworks/java-di">Genie</a>提供对JSR 330完整支持，并做了一些扩展:
          <ul>
            <li>方法参数注入，包括action handler, mail sender, job 方法等</li>
            <li>注入集合类型，比如所有实现某个借口的类</li>
            <li>自定义注入标记, 比如<code>@@LoginUser</code></li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="spa">
          SPA/移动应用支持
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden spa">
          现在越来越多的项目采用前后端分离的开发架构，并通过RESTful的接口使用JSON通讯。ActFramework对此
          提供了丰富的支持：
          <ul>
            <li>
              RESTful支持
            </li>
            <li>
              内置CORS支持
            </li>
            <li>
              Session/HTTP Header 映射
            </li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="security">
          绝不忽略的安全
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden security">
          安全！安全！安全！重要的话重复三遍
          ActFramework将安全构建在你的应用程序中
          <ul>
            <li>Session cookie是http only (javascript不可读写), secure(在产品模式下，只能用于https链接);
              payload有hash签名，还可以选择加密</li>
            <li>在配置文件中加上`csrf=true`来打开CSRF保护机制</li>
            <li>XSS保护: Rythm模板引擎默认escape变量输出</li>
            <li>
              <a href="https://github.com/actframework/act-aaa-plugin">AAA plugin</a>提供最为方便
              灵活的AAA(认证/授权/记账)机制
            </li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="anno">
          使用但不过分依赖注解
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden anno">
          <p>
            ActFramework使用注解来提高应用程序的表达力。但是我们不赞成<a href="http://annotatiomania.com/">过度使用注解</a>
            我们认为当代码提供足够表达力的时候就不需要注解，所谓画蛇添足不外如是。
          </p>
          <div>例如下面的SpringMVC代码:</div>
          <pre class="line-numbers"><code class="language-java">@@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
   @@PathVariable("userId") int user,
   @@RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}
</code></pre>
          提供相同功能的ActFramework代码为:
          <pre class="line-numbers"><code class="language-java">@@GetAction("/user/{user}/invoices")
public List<Invoice> listUsersInvoices(int user, Date date) {
  ...
}
</code></pre>
          显而易见，Act的代码更加简洁清楚
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="conf">
          不同运行环境下的配置支持
          <i class="fa fa-angle-right"></i>
        </h6>
        <div class="feature-desc hidden conf">
          ActFramework支持<code>profile</code>的概念，让你更方便地组织在不同运行环境下的配置文件
          下面的配置文件目录结构来自我们一个真实项目：
          <pre><code>resources
├── conf
│   ├── common
│   │   ├── app.properties
│   │   ├── db.properties
│   │   ├── mail.properties
│   │   ├── payment.properties
│   │   └── social.properties
│   ├── local-no-ui
│   │   ├── app.properties
│   │   ├── db.properties
│   │   └── port.properties
│   ├── local-sit
│   │   └── app.properties
│   ├── local-ui
│   │   ├── app.properties
│   │   └── db.properties
│   ├── sit
│   │   ├── app.properties
│   │   └── db.properties
│   └── uat
...</code></pre>
          假设你的项目部署到了你的UAT(User Acceptance Test)服务器，你可以使用JVM参数 <code>-Dprofile=uat</code>
          来启动应用。ActFramework会按照一下序列来加载配置：
          <ol>
            <li>Read <code>/resources/conf/common</code>目录中的所有<code>.properties</code>文件</li>
            <li>Read <code>/resources/conf/uat</code>目录中的所有<code>.properties</code>文件</li>
          </ol>
          这样ActFramework使用<code>uat</code>profile下面的配置项来覆盖<code>common</code>下面的配置项。
          而<code>common</code>下面没有被覆盖的配置项则继续有效。
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="db">
          方便而强大的数据库访问
          <i class="fa fa-angle-right"></i>
        </h6>
        <div class="feature-desc hidden db">
          ActFramework 通过<code>act.db.Dao</code>和相关接口提供一套方便而强大的数据库访问机制
          <ul>
            <li class="feature-desc">
              <a href="https://github.com/actframework/act-ebean">act-ebean插件</a>基于灵活易用的
              <a href="http://ebean-orm.github.io/">ebean ORM</a>库实现了Act的数据库访问。这个插件
              可以用来访问SQL数据库
            </li>
            <li class="feature-desc">
              <a href="https://github.com/actframework/act-morphia">act-morphia插件</a>基于MongoDB
              官方提供的<a href="https://mongodb.github.io/morphia/">Morphia</a>库。这个插件可以用来
              访问MongoDB文档数据库
            </li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="multi-db">
          多数据源支持
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden multi-db">
          访问不同的数据源对于今天的应用来讲并不罕见。Act内置多数据源支持。下面是代码示例：
          <pre class="line-numbers"><code class="language-properties"># 数据库配置文件
db.instances=mongo,sql

# db1 configurations
db.mongo.impl=act.db.morphia.MorphiaPlugin
db.mongo.uri=mongodb://localhost/myapp

db.sql.impl=act.db.ebean.EbeanPlugin
db.url=jdbc:h2:./myapp
db.ddl.createOnly=true
</code></pre>
          <pre class="line-numbers"><code class="language-java">// -- 这个model需要事务支持，因此使用SQL数据源：
@@DB("sql")
@@Entity(name = "va")
public class VirtualAccount{
    @@Id
    private Long id;

    @@Index(unique = true)
    public String ownerId;

    // balance in cents
    public int balance;
}
</code></pre>
          <pre class="line-numbers"><code class="language-java">// -- 不需要事务的model我们尽可能使用MongoDB：
@@DB("mongo")
@@Entity("trans")
public static class Transaction extends MorphiaModel<Transaction> {

    /**
     * Stores from account owner ID
     */
    public String creditAcc;
    /**
     * Stores to account owner ID
     */
    public String debitAcc;
    /**
     * Stores the transaction amount
     */
    public int amount;
    ...
}
</code></pre>
          以上代码演示了如何在配置文件里设置多数据源，以及如果在model代码里使用<code>@@DB</code>注解指定数据源
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="view">
          强大的视图架构以及多模板引擎支持
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden view">
          虽然Act是对RESTful和前后端分离非常友好的框架，对于传统类型服务器端页面生成也提供了非常好的支持。
          ActFramework内置了强大易用的<a href="http://rythmengine.org/">Rythm模板引擎</a>，同时也提供
          其它常用模板引擎的插件：
          <ul>
            <li>
              <a href="http://velocity.apache.org/">Velocity</a>支持：
              <a href="https://github.com/actframework/act-velocity">Velocity插件</a>
            </li>
            <li>
              <a href="http://freemarker.org/">FreeMarker</a>支持：
              <a href="https://github.com/actframework/act-freemarker">FreeMarker插件</a>
            </li>
            <li>
              <a href="http://www.thymeleaf.org/">Thymeleaf</a>支持：
              <a href="https://github.com/actframework/act-thymeleaf">Thymeleaf插件</a>
            </li>
            <li>
              <a href="https://mustache.github.io/">Mustache</a>支持：
              <a href="https://github.com/actframework/act-mustache">Mustache插件</a>
            </li>
            <li>
              <a href="http://ibeetl.com/">Beetl</a>支持：
              <a href="https://github.com/actframework/act-beetl">Beetl插件</a>
            </li>
          </ul>
          ActFramework支持在项目中同时使用多种不同的模板引擎
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="misc">
          其它特性
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden misc">
          ActFramework提供了丰富的功能足够满足你应用开发的大部分需求：
          <ul>
            <li>
              <a href="/doc/email">发送邮件</a>
            </li>
            <li>
              <a href="/doc/job">作业调度</a>
            </li>
            <li>
              <a href="/doc/event">事件处理</a>
            </li>
          </ul>
        </div>
      </li>
    </ul>
  </div>


  <div class="docs-section" id="video">
    <h6 class="docs-header">视频</h6>
    @def videoItem(Video video) {
      @{
        Video.Source source = video.source("cn")
      }
      @if (source) {
        <li>
          <a name="@source.id"></a>
          <div>
            @video.desc
            <a target="_blank" href="@source.siteUrl()">
              <i class="fa fa-play-circle"></i>
            </a>
          </div>
        </li>
      }
    }
    @args Iterable<Video> videos
    <ol>
      @for (videos) {
      @videoItem(_)
      }
    </ol>
  </div>

  <div class="docs-section" id="start">
    <h6 class="docs-header">开始使用ActFramework</h6>
    <div>
      ActFramework程序由maven驱动，您可以选择下载一个ActFramework应用示例作为你的项目基础。
      下载之后将应用导入到您的IDE中，然后利用IDE的代码重构特性更改应用的包名以及入口类名开始开发。
    </div>
    <div class="feature-desc alert alert-info">
      <i class="fa fa-info-circle"></i> 每个示例都可以使用maven运行以及打包
    </div>
    <ul>
      @def download(String title, String desc, String file) {
      <li class="download">
        <div class="header">@title</div>
        <div class="row">
          <div class="desc nine columns">@desc</div>
          <div class="three columns">
            <a href="/skeleton/@file">
              <i class="fa fa-download"></i>
              &nbsp;下载
            </a>
          </div>
        </div>
      </li>
      }
      @args Iterable<act_site.Skeleton> skeletons
      @for (skeletons) {
        @download(_.name, _.desc, _.fileName)
      }
    </ul>
  </div>

  <div class="docs-section" id="support">
    <h6 class="docs-header">技术支持</h6>
    <div class="feature-desc">
      能讲英文的同学可以使用下面的渠道获得技术支持：
      <br/><br/>
      <ul>
        <li>加入Google群： <EMAIL></li>
        <li>加入我们的<a href="https://gitter.im/actframework/actframework">gitter频道</a></li>
        <li>在<a href="">StackOverflow</a>上提问题并使用<code>actframework</code>标签标注</li>
      </ul>
    </div>
    <div class="feature-desc">
      也欢迎加入我们的QQ群: 283919975
    </div>
  </div>

  <div class="docs-section" id="about">
    <h6 class="docs-header">关于</h6>
    <p><b>为什么开发ActFramework</b></p>
    <p>
      简单地说，我需要一个简洁、优雅而不特立独行的Java MVC框架。我不能从Spring MVC/PlayFramework/SparkFramework以及
      其他众多的Java框架中得到我所希求的
    </p>
    <p>
      背后的故事。大概在2009年底的，作为独立技术顾问，我刚刚结束了一个CakePHP的项目。感觉非常不爽，决定
      回到我所钟爱的Java世界来。但又对当时处于主宰地位的Spring/Struts之流不是特别满意。所以开始寻找新的
      Java开发框架。PlayFramework作为当时的新兵进入了我的视野，经过一次简单的尝试，我觉得这就是我一直寻求
      的东西。
    </p>
    <p>
      我热爱PlayFramework（仅限v1.x），因为其简单，干净并富于表达力。它给Javaer们带来一种崭新的体验。遗憾
      的是Play团队在开发2.x版本的时候完全废弃了1.x的代码，并尝试他们新的开发哲学。而我并不是特别感冒。后来
      发生的<a href="https://groups.google.com/d/msg/play-framework/AcZs8GXNWUc/IanbqC-c-MkJ" target="_blank">
      事情</a>证明了我并不是唯一这样想的人
    </p>
    <p>
      我
      <a target="_blank" href="http://software-lgl.blogspot.com.au/2012/12/thinking-about-creating-new-java-web.html">
      开始思考</a>沿着Play 1.x的道路构造一个新的框架。大概一年半之后经过了几个使用Spring的项目的“痛苦”经历，我决定开始这个
      新框架项目。两年多的开发终于开花结果了：这就是我理想中的MVC框架 ———— ActFramework
    </p>
    <p><b>感谢</b></p>
    <p>
      <img src="/image/thinking-studio-logo.png" style="width:32px;height:32px">&nbsp;&nbsp;
      <a href="http://thinking.studio">
        Thinking Studio
      </a> 是ActFramework背后的公司. 感谢公司总监<NAME>允许我使用一些工作时间用于开发ActFramework，同时
      允许我在公司的Java项目上(自2015年底)试用ActFramework
    </p>
    <p>
      <img src="/image/idea-logo.png" style="width:32px;height:32px">&nbsp;&nbsp;
      <a href="https://www.jetbrains.com/">
        JetBrains
      </a> 提供开源授权。本项目每一行代码都是在IntellJ IDEA上完成的。这是一个伟大的产品，我非常享受在IDEA上工作
    </p>
  </div>

</div>
<script>
    function switchLocale(locale) {
        $.post('/~/i18n/locale', {act_locale: locale}, function() {
            window.location.reload();
        })
        return false;
    }

    $('body').on('click', '#go_en', function () {
        return switchLocale('en_AU');
    });
    $('body').on('click', '#go_zh', function () {
        return switchLocale('zh_CN');
    });
    $('body').on('click', 'h6.feature[data-link]', function() {
        $me = $(this);
        var expanded = $me.next().is(':visible');
        $('h6.feature[data-link]').next().hide();
        $('h6.feature[data-link]').find('i.indicator').addClass('fa-angle-right');
        if (!expanded) {
            $me.next().fadeIn();
            $me.find('i.indicator').removeClass('fa-angle-right').addClass('fa-angel-down');
        }
    })
</script>
<a href="https://git.oschina.net/actframework/actframework"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/e7bbb0521b397edbd5fe43e7f760759336b5e05f/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677265656e5f3030373230302e706e67" alt="Fork me on Git@@Oschina" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_green_007200.png"></a><commit_msg>fix CN home page version info<commit_after>@extends(layout, title = "ActFramework Home")

@section("moreJs") {
<script src="/js/site.js"></script>
<script src="/js/prism.js" charset="utf-8"></script>
}

@section("moreCss") {
<link rel="stylesheet" href="/css/prism.css">
<link rel="stylesheet" href="/css/prism-line-numbers.css">
<style>
  h6.feature[data-link] {
    cursor: pointer;
  }
</style>
}


<div class="container">
  <section class="hero">
    <h1>ActFramework v1.0.2</h1>
    <h5>Java MVC 框架的最终幻想</h5>
    <a class="button button-primary" href="#start">马上使用!</a>
    <div class="value-props row">
      <div class="four columns value-prop">
        <img class="value-img" src="/image/development.png">
        无与伦比的开发体验 ． 卓越的性能
      </div>
      <div class="four columns value-prop">
        <img class="value-img" src="/image/tech.png">
        绝妙的RESTful支持　．　强大的后端页面生成
      </div>
      <div class="four columns value-prop">
        <img class="value-img" src="/image/security.png">
        安全从无如此简单
      </div>
    </div>
  </section>


  <div class="navbar-spacer"></div>
  <nav class="navbar">
    <div class="container">
      <ul class="navbar-list">
        <li class="navbar-item"><a class="navbar-link" href="/#intro">介绍</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/doc/index">文档</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#video">视频教程</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#start">开始使用Act！</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#support">技术支持</a></li>
        <li class="navbar-item"><a class="navbar-link" href="/#about">关于</a></li>
      </ul>
      <ul class="navbar-list u-pull-right">
        <li class="navbar-item"><a id="go_zh" class="navbar-link" href="#">中文</a></li>
        <li class="navbar-item u-pull-right"><a id="go_en" class="navbar-link" href="#">English</a></li>
      </ul>
    </div>
  </nav>


  <div class="docs-section" id="intro">
    <h6 class="docs-header">最新消息</h6>
    <ul>
      <li>
        <a href="/doc/release_notes">2017-03-13: ActFramework 1.0.2 在maven中央库发布</a>
      </li>
      <li>
        <a href="/doc/release_notes">2017-03-09: ActFramework 1.0.0 在maven中央库发布</a>
      </li>
      <li>
        一个ActFramework实现的<a href="http://www.todobackend.com/">TodoBackend</a>项目: http://github.com/greenlaw110/todomvc-act
      </li>
      <li>
        著名的<a href="https://www.techempower.com/benchmarks">TechEmpower Benchmark</a>接受了
        ActFramework提交的<a href="https://github.com/TechEmpower/FrameworkBenchmarks/pull/2525">PR</a>
      </li>
      <li>
        一个第三方发布的<a href="https://github.com/networknt/microservices-framework-benchmark">简单的benchmark</a>
        显示ActFramework在处理简单请求时的强劲性能: 吞吐量可以达到SpringBoot的20倍以上
      </li>
    </ul>
    <h6 class="docs-header">ActFramework 特性</h6>
    <p>
      ActFramework是一种简洁易用,具有强大表达力的Java MVC框架
    </p>
    <ul>
      <li>
        <h6 class="feature" data-link="full-stack">
          全栈式框架
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden full-stack">
          ActFramework的应用都有自己的main方法, 通常在数秒之内完成启动

          <div class="feature-desc alert alert-info">
            <i class="fa fa-info-circle indicator"></i> Act不是一个Servlet架构的框架, Act应用不能部署到Servlet容器中
          </div>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="dev-exp">
          无与伦比的开发体验 ． 卓越的性能
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden dev-exp">
          <p>
            在开发模式下Act支持热加载。在开发模式下，收到任何请求的时候Act会扫描项目的`src`目录，项目中的任何java源代码、
            模板源码或者配置文件有变动，Act会废弃掉当前的<code>ApplicationClassLoader</code>，重新编译整个项目，并加载到一个新的
            <code>ApplicationClassLoader</code>中。这个过程非常快，我们一个上万行源码的项目，热加载的过程大概在500ms完成。
          </p>
          <p>
            虽然开发体验为ActFramework的最高优先级，我们同时也非常重视系统性能。根据
            <a href="https://www.techempower.com/benchmarks/">这个</a>
            benchmark项目，对于一个简单的HelloWorld应用, ActFramework的性能是SpringBoot的20倍以上。
          </p>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="di">
          依赖注入
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden di">
          Act通过<a href="https://github.com/osglworks/java-di">Genie</a>提供对JSR 330完整支持，并做了一些扩展:
          <ul>
            <li>方法参数注入，包括action handler, mail sender, job 方法等</li>
            <li>注入集合类型，比如所有实现某个借口的类</li>
            <li>自定义注入标记, 比如<code>@@LoginUser</code></li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="spa">
          SPA/移动应用支持
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden spa">
          现在越来越多的项目采用前后端分离的开发架构，并通过RESTful的接口使用JSON通讯。ActFramework对此
          提供了丰富的支持：
          <ul>
            <li>
              RESTful支持
            </li>
            <li>
              内置CORS支持
            </li>
            <li>
              Session/HTTP Header 映射
            </li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="security">
          绝不忽略的安全
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden security">
          安全！安全！安全！重要的话重复三遍
          ActFramework将安全构建在你的应用程序中
          <ul>
            <li>Session cookie是http only (javascript不可读写), secure(在产品模式下，只能用于https链接);
              payload有hash签名，还可以选择加密</li>
            <li>在配置文件中加上`csrf=true`来打开CSRF保护机制</li>
            <li>XSS保护: Rythm模板引擎默认escape变量输出</li>
            <li>
              <a href="https://github.com/actframework/act-aaa-plugin">AAA plugin</a>提供最为方便
              灵活的AAA(认证/授权/记账)机制
            </li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="anno">
          使用但不过分依赖注解
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden anno">
          <p>
            ActFramework使用注解来提高应用程序的表达力。但是我们不赞成<a href="http://annotatiomania.com/">过度使用注解</a>
            我们认为当代码提供足够表达力的时候就不需要注解，所谓画蛇添足不外如是。
          </p>
          <div>例如下面的SpringMVC代码:</div>
          <pre class="line-numbers"><code class="language-java">@@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
   @@PathVariable("userId") int user,
   @@RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}
</code></pre>
          提供相同功能的ActFramework代码为:
          <pre class="line-numbers"><code class="language-java">@@GetAction("/user/{user}/invoices")
public List<Invoice> listUsersInvoices(int user, Date date) {
  ...
}
</code></pre>
          显而易见，Act的代码更加简洁清楚
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="conf">
          不同运行环境下的配置支持
          <i class="fa fa-angle-right"></i>
        </h6>
        <div class="feature-desc hidden conf">
          ActFramework支持<code>profile</code>的概念，让你更方便地组织在不同运行环境下的配置文件
          下面的配置文件目录结构来自我们一个真实项目：
          <pre><code>resources
├── conf
│   ├── common
│   │   ├── app.properties
│   │   ├── db.properties
│   │   ├── mail.properties
│   │   ├── payment.properties
│   │   └── social.properties
│   ├── local-no-ui
│   │   ├── app.properties
│   │   ├── db.properties
│   │   └── port.properties
│   ├── local-sit
│   │   └── app.properties
│   ├── local-ui
│   │   ├── app.properties
│   │   └── db.properties
│   ├── sit
│   │   ├── app.properties
│   │   └── db.properties
│   └── uat
...</code></pre>
          假设你的项目部署到了你的UAT(User Acceptance Test)服务器，你可以使用JVM参数 <code>-Dprofile=uat</code>
          来启动应用。ActFramework会按照一下序列来加载配置：
          <ol>
            <li>Read <code>/resources/conf/common</code>目录中的所有<code>.properties</code>文件</li>
            <li>Read <code>/resources/conf/uat</code>目录中的所有<code>.properties</code>文件</li>
          </ol>
          这样ActFramework使用<code>uat</code>profile下面的配置项来覆盖<code>common</code>下面的配置项。
          而<code>common</code>下面没有被覆盖的配置项则继续有效。
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="db">
          方便而强大的数据库访问
          <i class="fa fa-angle-right"></i>
        </h6>
        <div class="feature-desc hidden db">
          ActFramework 通过<code>act.db.Dao</code>和相关接口提供一套方便而强大的数据库访问机制
          <ul>
            <li class="feature-desc">
              <a href="https://github.com/actframework/act-ebean">act-ebean插件</a>基于灵活易用的
              <a href="http://ebean-orm.github.io/">ebean ORM</a>库实现了Act的数据库访问。这个插件
              可以用来访问SQL数据库
            </li>
            <li class="feature-desc">
              <a href="https://github.com/actframework/act-morphia">act-morphia插件</a>基于MongoDB
              官方提供的<a href="https://mongodb.github.io/morphia/">Morphia</a>库。这个插件可以用来
              访问MongoDB文档数据库
            </li>
          </ul>
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="multi-db">
          多数据源支持
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden multi-db">
          访问不同的数据源对于今天的应用来讲并不罕见。Act内置多数据源支持。下面是代码示例：
          <pre class="line-numbers"><code class="language-properties"># 数据库配置文件
db.instances=mongo,sql

# db1 configurations
db.mongo.impl=act.db.morphia.MorphiaPlugin
db.mongo.uri=mongodb://localhost/myapp

db.sql.impl=act.db.ebean.EbeanPlugin
db.url=jdbc:h2:./myapp
db.ddl.createOnly=true
</code></pre>
          <pre class="line-numbers"><code class="language-java">// -- 这个model需要事务支持，因此使用SQL数据源：
@@DB("sql")
@@Entity(name = "va")
public class VirtualAccount{
    @@Id
    private Long id;

    @@Index(unique = true)
    public String ownerId;

    // balance in cents
    public int balance;
}
</code></pre>
          <pre class="line-numbers"><code class="language-java">// -- 不需要事务的model我们尽可能使用MongoDB：
@@DB("mongo")
@@Entity("trans")
public static class Transaction extends MorphiaModel<Transaction> {

    /**
     * Stores from account owner ID
     */
    public String creditAcc;
    /**
     * Stores to account owner ID
     */
    public String debitAcc;
    /**
     * Stores the transaction amount
     */
    public int amount;
    ...
}
</code></pre>
          以上代码演示了如何在配置文件里设置多数据源，以及如果在model代码里使用<code>@@DB</code>注解指定数据源
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="view">
          强大的视图架构以及多模板引擎支持
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden view">
          虽然Act是对RESTful和前后端分离非常友好的框架，对于传统类型服务器端页面生成也提供了非常好的支持。
          ActFramework内置了强大易用的<a href="http://rythmengine.org/">Rythm模板引擎</a>，同时也提供
          其它常用模板引擎的插件：
          <ul>
            <li>
              <a href="http://velocity.apache.org/">Velocity</a>支持：
              <a href="https://github.com/actframework/act-velocity">Velocity插件</a>
            </li>
            <li>
              <a href="http://freemarker.org/">FreeMarker</a>支持：
              <a href="https://github.com/actframework/act-freemarker">FreeMarker插件</a>
            </li>
            <li>
              <a href="http://www.thymeleaf.org/">Thymeleaf</a>支持：
              <a href="https://github.com/actframework/act-thymeleaf">Thymeleaf插件</a>
            </li>
            <li>
              <a href="https://mustache.github.io/">Mustache</a>支持：
              <a href="https://github.com/actframework/act-mustache">Mustache插件</a>
            </li>
            <li>
              <a href="http://ibeetl.com/">Beetl</a>支持：
              <a href="https://github.com/actframework/act-beetl">Beetl插件</a>
            </li>
          </ul>
          ActFramework支持在项目中同时使用多种不同的模板引擎
        </div>
      </li>
      <li>
        <h6 class="feature" data-link="misc">
          其它特性
          <i class="fa fa-angle-right indicator"></i>
        </h6>
        <div class="feature-desc hidden misc">
          ActFramework提供了丰富的功能足够满足你应用开发的大部分需求：
          <ul>
            <li>
              <a href="/doc/email">发送邮件</a>
            </li>
            <li>
              <a href="/doc/job">作业调度</a>
            </li>
            <li>
              <a href="/doc/event">事件处理</a>
            </li>
          </ul>
        </div>
      </li>
    </ul>
  </div>


  <div class="docs-section" id="video">
    <h6 class="docs-header">视频</h6>
    @def videoItem(Video video) {
      @{
        Video.Source source = video.source("cn")
      }
      @if (source) {
        <li>
          <a name="@source.id"></a>
          <div>
            @video.desc
            <a target="_blank" href="@source.siteUrl()">
              <i class="fa fa-play-circle"></i>
            </a>
          </div>
        </li>
      }
    }
    @args Iterable<Video> videos
    <ol>
      @for (videos) {
      @videoItem(_)
      }
    </ol>
  </div>

  <div class="docs-section" id="start">
    <h6 class="docs-header">开始使用ActFramework</h6>
    <div>
      ActFramework程序由maven驱动，您可以选择下载一个ActFramework应用示例作为你的项目基础。
      下载之后将应用导入到您的IDE中，然后利用IDE的代码重构特性更改应用的包名以及入口类名开始开发。
    </div>
    <div class="feature-desc alert alert-info">
      <i class="fa fa-info-circle"></i> 每个示例都可以使用maven运行以及打包
    </div>
    <ul>
      @def download(String title, String desc, String file) {
      <li class="download">
        <div class="header">@title</div>
        <div class="row">
          <div class="desc nine columns">@desc</div>
          <div class="three columns">
            <a href="/skeleton/@file">
              <i class="fa fa-download"></i>
              &nbsp;下载
            </a>
          </div>
        </div>
      </li>
      }
      @args Iterable<act_site.Skeleton> skeletons
      @for (skeletons) {
        @download(_.name, _.desc, _.fileName)
      }
    </ul>
  </div>

  <div class="docs-section" id="support">
    <h6 class="docs-header">技术支持</h6>
    <div class="feature-desc">
      能讲英文的同学可以使用下面的渠道获得技术支持：
      <br/><br/>
      <ul>
        <li>加入Google群： <EMAIL></li>
        <li>加入我们的<a href="https://gitter.im/actframework/actframework">gitter频道</a></li>
        <li>在<a href="">StackOverflow</a>上提问题并使用<code>actframework</code>标签标注</li>
      </ul>
    </div>
    <div class="feature-desc">
      也欢迎加入我们的QQ群: 283919975
    </div>
  </div>

  <div class="docs-section" id="about">
    <h6 class="docs-header">关于</h6>
    <p><b>为什么开发ActFramework</b></p>
    <p>
      简单地说，我需要一个简洁、优雅而不特立独行的Java MVC框架。我不能从Spring MVC/PlayFramework/SparkFramework以及
      其他众多的Java框架中得到我所希求的
    </p>
    <p>
      背后的故事。大概在2009年底的，作为独立技术顾问，我刚刚结束了一个CakePHP的项目。感觉非常不爽，决定
      回到我所钟爱的Java世界来。但又对当时处于主宰地位的Spring/Struts之流不是特别满意。所以开始寻找新的
      Java开发框架。PlayFramework作为当时的新兵进入了我的视野，经过一次简单的尝试，我觉得这就是我一直寻求
      的东西。
    </p>
    <p>
      我热爱PlayFramework（仅限v1.x），因为其简单，干净并富于表达力。它给Javaer们带来一种崭新的体验。遗憾
      的是Play团队在开发2.x版本的时候完全废弃了1.x的代码，并尝试他们新的开发哲学。而我并不是特别感冒。后来
      发生的<a href="https://groups.google.com/d/msg/play-framework/AcZs8GXNWUc/IanbqC-c-MkJ" target="_blank">
      事情</a>证明了我并不是唯一这样想的人
    </p>
    <p>
      我
      <a target="_blank" href="http://software-lgl.blogspot.com.au/2012/12/thinking-about-creating-new-java-web.html">
      开始思考</a>沿着Play 1.x的道路构造一个新的框架。大概一年半之后经过了几个使用Spring的项目的“痛苦”经历，我决定开始这个
      新框架项目。两年多的开发终于开花结果了：这就是我理想中的MVC框架 ———— ActFramework
    </p>
    <p><b>感谢</b></p>
    <p>
      <img src="/image/thinking-studio-logo.png" style="width:32px;height:32px">&nbsp;&nbsp;
      <a href="http://thinking.studio">
        Thinking Studio
      </a> 是ActFramework背后的公司. 感谢公司总监<NAME>允许我使用一些工作时间用于开发ActFramework，同时
      允许我在公司的Java项目上(自2015年底)试用ActFramework
    </p>
    <p>
      <img src="/image/idea-logo.png" style="width:32px;height:32px">&nbsp;&nbsp;
      <a href="https://www.jetbrains.com/">
        JetBrains
      </a> 提供开源授权。本项目每一行代码都是在IntellJ IDEA上完成的。这是一个伟大的产品，我非常享受在IDEA上工作
    </p>
  </div>

</div>
<script>
    function switchLocale(locale) {
        $.post('/~/i18n/locale', {act_locale: locale}, function() {
            window.location.reload();
        })
        return false;
    }

    $('body').on('click', '#go_en', function () {
        return switchLocale('en_AU');
    });
    $('body').on('click', '#go_zh', function () {
        return switchLocale('zh_CN');
    });
    $('body').on('click', 'h6.feature[data-link]', function() {
        $me = $(this);
        var expanded = $me.next().is(':visible');
        $('h6.feature[data-link]').next().hide();
        $('h6.feature[data-link]').find('i.indicator').addClass('fa-angle-right');
        if (!expanded) {
            $me.next().fadeIn();
            $me.find('i.indicator').removeClass('fa-angle-right').addClass('fa-angel-down');
        }
    })
</script>
<a href="https://git.oschina.net/actframework/actframework"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/e7bbb0521b397edbd5fe43e7f760759336b5e05f/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677265656e5f3030373230302e706e67" alt="Fork me on Git@@Oschina" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_green_007200.png"></a>
{'fraction_non_alphanumeric': 0.16849752978785237, 'fraction_numerical': 0.015809357744841615, 'mean_word_length': 2.2973361441165197, 'pattern_counts': {'":': 0, '<': 945, '<?xml version=': 0, '>': 945, 'https://': 42, 'lorem ipsum': 0, 'www.': 10, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3951485', 'n_tokens_mistral': 14688, 'n_tokens_neox': 14858, 'n_words': 1854}