# actframework
**Repository Path**: alexwang/actframework
## Basic Information
- **Project Name**: actframework
- **Description**: ActFramework是一种简洁易用,具有强大表达力的Java MVC全栈框架.
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: http://actframework.org
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 192
- **Created**: 2017-02-17
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ACT Framework
[](https://gitter.im/actframework/actframework?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
## News
* Actframework [benchmark set](https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/Java/act)
accepted by [TechEmpower Benchmark](https://www.techempower.com/benchmarks/). Looking forward to
seeing Act in the 14 round test
* A 3rd party [simple benchmark project](https://github.com/networknt/microservices-framework-benchmark)
shows Act's throughput 20 times faster than of Spring-boot in simple cases
## Project status
* Current stable version: 0.5.0-SNAPSHOT
* The first public release is target to March 2017
## Install
Add the following dependency into your `pom.xml` file
```xml
org.actframework
act
0.5.0-SNAPSHOT
```
Add the following snippet into your `pom.xml` file to get SNAPSHOT version:
```xml
org.sonatype.oss
oss-parent
7
```
## Features
* **A full stack MVC framework**
* Actframework is **NOT** a servlet framework. Act app does not run in a servlet container. Instead
it run as an independent Java application and it starts in seconds
* **Unbeatable development experience w/ great performance**
* Never restart your app when you are developing it. Act's super dev mode provides hot reloading
feature is the dream of every Java web app developer. Check out
[this 3 mins video](https://www.youtube.com/watch?v=68Z-jTL6fDg) to see it
* According to [this 3rd party benchmark](https://github.com/networknt/microservices-framework-benchmark)
Act's beats most of Java web framework. In simple case Act can be 20 times faster than Springboot
* **Fully JSR330 Dependency Injection support**
* **Superb SPA/Mobile app support**
* [Awesome JSON/RESTful support](https://www.youtube.com/watch?v=B2RRSzYeo8c&t=4s)
* [Built-in CORS support](http://actframework.org/doc/configuration.md#cors)
* Session/Header mapping so you are not limited to cookie
* **Uncompromising Security**
* Session cookie is secure and http only, payload is signed and encrypted (optionally)
* [Enable CSRF prevention with just one configuration item](http://actframework.org/doc/configuration.md#csrf)
* XSS prevention: Rythm engine [escape variable output](http://fiddle.rythmengine.org/#/editor/398e71d927234f13a26bb346376141ce) by default
* Implementing your authentication/authorisation/accounting framework using [AAA plugin](https://github.com/actframework/act-aaa-plugin)
* **Annotation aware but not annotation stack**
* Annotation is one of the tool ActFramework used to increase expressiveness. However
we do not appreciate [crazy annotation stacked code](http://annotatiomania.com/).
Instead we make the code to express the intention in a natural way and save
the use of annotation whenever possible.
For example, for the following SpringMVC code:
```java
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
```
The corresponding ActFramework app code is:
```java
@GetAction("/user/{user}/invoices")
public List listUsersInvoices(int user, Date date) {
...
}
```
* **Multi-environment configuration**
* ActFramework supports the concept of `profile` which allows you to organize your configurations
in different environment (defined by profile) easily. Take a look at the following
configurations from one of our real project:
```text
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
...
```
Suppose on your UAT server, you start the application with JVM option `-Dprofile=uat`,
ActFramework will load the configuration in the following sequence:
1. Read all `.properties` files in the `/resources/conf/common` dir
2. Read all `.properties` files in the `/resources/conf/uat` dir
This way ActFramework use the configuration items defined in `uat` profile to overwrite
the same items defined in `common` profile. The common items that are not overwritten
still effective.
* **[Simple yet powerful database support](http://actframework.org/doc/model.md)**
* [Multiple database support built in](http://actframework.org/doc/multi_db.md)
* **[Powerful view architecture with multiple render engine support](http://actframework.org/doc/templating.md)**
* **Commonly used tools**
* [Sending email](http://actframework.org/doc/email)
* [Schedule jobs](http://actframework.org/doc/job)
* [Event handling and dispatching](http://actframework.org/doc/event)
## Sample code
### A HelloWorld app
```java
package demo.helloworld;
import act.Act;
import act.Version;
import org.osgl.mvc.annotation.GetAction;
public class HelloWorldApp {
@GetAction
public String sayHello() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
Act.start("Hello World", Version.appVersion(), HelloWorldApp.class);
}
}
```
See [this 7 mins video on how to create HelloWorld in Eclipse from scratch](https://www.youtube.com/watch?v=_IhRv3-Ejfw).
or [for users without youtube access](http://www.tudou.com/programs/view/fZqqkFacfzA/)
### A full RESTful service
```java
package demo.rest;
import act.controller.Controller;
import act.db.morphia.MorphiaAdaptiveRecord;
import act.db.morphia.MorphiaDao;
import org.mongodb.morphia.annotations.Entity;
import org.osgl.mvc.annotation.*;
import java.util.Map;
import static act.controller.Controller.Util.notFoundIfNull;
@Entity("user")
public class User extends MorphiaAdaptiveRecord {
@Controller("user")
public static class Service extends MorphiaDao {
@PostAction
public User create(User user) {
return save(user);
}
@GetAction
public Iterable list() {
return findAll();
}
@GetAction("{id}")
public User show(String id, Map data) {
return findById(id);
}
@PutAction("{id}")
public User update(String id, Map data) {
User user = findById(id);
notFoundIfNull(user);
user.mergeValues(data);
return save(user);
}
@DeleteAction("{id}")
public void delete(String id) {
deleteById(id);
}
}
public static void main(String[] args) throws Exception {
Act.start("RESTful Demo", Version.appVersion(), User.class);
}
}
```
See [this 1 hour video on RESTful support](https://www.youtube.com/watch?v=B2RRSzYeo8c&t=4s) or
[for user without youtube access](http://www.tudou.com/programs/view/K9ayRYIJNhk/)
See [this 7 mins video to understand more about AdaptiveRecord](https://www.youtube.com/watch?v=gWisqi-bp0M&t=1s)
or [for user without youtube access](http://www.tudou.com/programs/view/o4Up0B4wD8Y/)
## Background
I love PlayFramework v1.x because it is simple, clear and expressive. It brought us a completely different experience
in web development with Java. However I don't totally agree with where Play 2.X is heading for, and it looks like I am
not the only person with the concern as per this
[open letter to Play Framework Developers](https://groups.google.com/d/msg/play-framework/AcZs8GXNWUc/IanbqC-c-MkJ).
I [have thought of](http://software-lgl.blogspot.com.au/2012/12/thinking-about-creating-new-java-web.html) rolling out
something that could follow the road paved by Play 1.x, something that is simple, clear, expressive and Java
(specifically) developer friendly. About one and half year after that I decide I could start the project seriously,
and now another one and half year passed by, I've got this ACT framework in a relatively good shape.
Happy coding!