一个人追求的目标越高,他的才能就发展得越快,对社会就越有益,我确信这也是一个真理。——玛克西姆·高尔基
链接:
GitHub - actframework/actframework: An easy to use Java MVC server stack
Add act-starter-parent
into your pom.xml file
<parent>
<groupId>org.actframework</groupId>
<artifactId>act-starter-parent</artifactId>
<version>1.9.2.0</version>
</parent>
Or use maven archetype to start a new project:
mvn archetype:generate -B \
-DgroupId=com.mycom.helloworld \
-DartifactId=helloworld \
-DarchetypeGroupId=org.actframework \
-DarchetypeArtifactId=archetype-quickstart \
-DarchetypeVersion=1.9.2.0
tips don’t forget replace the groupId
, artifactId
and appName
in the above script, or you can use interactive mode to generate your project:
mvn archetype:generate -DarchetypeGroupId=org.actframework -DarchetypeArtifactId=archetype-quickstart -DarchetypeVersion=1.9.2.0
Note There are more ActFramework application archetypes for use. Please get them here.
A full stack MVC framework
Unbeatable development experience w/ great performance
Fully JSR330 Dependency Injection support
Superb SPA/Mobile app support
Uncompromising Security
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. 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:
@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:
@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:
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:
.properties
files in the /resources/conf/common
dir.properties
files in the /resources/conf/uat
dirThis 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
Powerful view architecture with multiple render engine support
An unbelievable automate testing framework that never presented in any other MVC frameworks
Commonly used tools
package demo.helloworld;
import act.Act;
import act.Version;
import org.osgl.mvc.annotation.GetAction;
public class HelloWorldApp {
@GetAction
public String sayHelloTo(@DefaultValue("World") String who) {
return "Hello " + who + "!";
}
public static void main(String[] args) throws Exception {
Act.start();
}
}
See this 7 mins video on how to create HelloWorld in Eclipse from scratch. or for users without youtube access
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<User> {
@UrlContext("user")
public static class Service extends MorphiaDao<User> {
@PostAction
public User create(User user) {
return save(user);
}
@GetAction
public Iterable<User> list() {
return findAll();
}
@GetAction("{id}")
public User show(@DbBind("id") User user) {
return user;
}
@PutAction("{id}")
public User update(@DbBind("id") @NotNull User user, Map<String, Object> data) {
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();
}
}