# nature-framework
**Repository Path**: mvilplss/nature-framework
## Basic Information
- **Project Name**: nature-framework
- **Description**: nature-framework是一个基于jdk8和servlet3.0规范,以自由为理念,以易用,代码简洁,开发快速,功能强大,易扩展,低耦合为目标,适用于快速开发的轻量级MVC+ORM框架。无getter/setter方法,无xml配置,包括源码的jar仅280KB,不仅适合网站的快速开发,更适合最接口服务。可以为您节省更多的时间做更多有意义的事儿!赶快动手体验吧!
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: nature4j
- **Homepage**: https://git.oschina.net/mvilplss/nature-framework
- **GVP Project**: No
## Statistics
- **Stars**: 47
- **Forks**: 7
- **Created**: 2016-12-01
- **Last Updated**: 2022-04-07
## Categories & Tags
**Categories**: webframework
**Tags**: None
## README
# 框架简介
nature-framework是一个以自由为理念,以易用,代码简洁,开发快速,功能强大,易扩展,低耦合为目标,适用于快速开发的轻量级MVC+ORM框架。无getter/setter方法,无xml配置,包括源码的jar仅280KB。有效的为您节省大量时间来感受生活的美好,该快试试吧!!!
# 功能特点
- 完整的MVC支持,功能齐全,简单易用;
- 模块结构自然:Control,Service,Model;
- 简单易用的依赖注入ioc;
- 比Struts功能强大的拦截器intercepter;
- 后台验证器validator; 支持国际化i18n;
- 防重复提交令牌token;
- 灵活易用的Ecache本地缓存,强大的Redis分布式缓存;
- 支持c3p0和druid数据源; 支持一个项目多个数据库连接;
- 比Hibernate更简单易用的数据库操作,包括自动建表;
- 数据库支持Mysql,Microsoft SQL Server,Oracle,Sqlite等;
- 不得不说的事务控制,多数据事务控制;
- 拥有强大的插件扩展plugin;
- 比Springmvc更好用的Restful风格请求;
- 轻量级的WebService服务;
- 支持分布式的任务调度;
- 基于Freemark和jsp的前端权限验证;
# maven依赖
[https://oss.sonatype.org/#nexus-search;quick~nature4j](https://oss.sonatype.org/#nexus-search;quick~nature4j)
```
org.nature4j
nature-framework
1.0.5
true
```
# 最新改进
## 增加优化测试用例写法
写法如下,只需继承NatureTest即可
```
public class TestDemo extends NatureTest{
@Test
public void demo(){
MainService service = ServiceHelper.getService(MainService.class);
NatureMap natureMap = service.riskRate();
System.out.println(natureMap);
}
}
```
## 增加事务的传递支持
原来不能对服务的方法进行嵌套,只能用DatabaseHelper:
```
@Service
public class UserService extends NatureService {
@Tx
public void insert() {
User user = new User();
user.put(User.loginname, "lucy");
user.put(User.nickname, "god");
DatabaseHelper.use().insert(user);
user.put(User.loginname, "tom");
DatabaseHelper.use().update(user);
}
}
```
现在:
```
@Service
public class UserService extends NatureService {
@Tx
public void insert() {
User user = new User();
user.put(User.loginname, "lucy");
user.put(User.nickname, "god");
insert(user);
user.put(User.loginname, "tom");
update(user);
}
}
```
## 增加hessian分布式工具插件内置
- 通过注解@hessian来实现接口api成为hessian服务,hessian服务url必须以.hessian链接结尾
- 增加HessianClient工具来生成实现类
服务提供者:
```
@Hessian("/user.hessian")
public interface UserServiceIntf {
public List list(String sql);
}
```
服务消费者:
```
public static void userList(){
String url = "http://localhost:8080/nature-user/user.hessian";
UserServiceIntf basic = HessianClient.create(url,UserServiceIntf.class);
List list = basic.list("select * from tb_user");
System.out.println(list.toString());
}
```
## 框架安全升级
- 传入参数和返回参数进行解耦,考虑增加参数传入和传出专用拦截器(本次提交已经改进);
- 增强框架本身的安全策略,如xss,csrf,sql注入等防范(本次提交已经改进);
- 在拦截器中可以通过invocation在invoke前后分别获取请求参数和响应参数,并可以对其进行验证和修改,如下例子就是对请求参数进行html编译,防止XSS攻击。
```
public void intercept(Invocation invocation) {
NatureMap requestParams = invocation.getRequestParams();
Set> entrySet = requestParams.entrySet();
for (Entry entry : entrySet) {
requestParams.put(entry.getKey(),StringUtil.XHTMLEnc( CastUtil.castString(entry.getValue())));
}
System.err.println("***测试拦截器执行前***");
invocation.invoke();
System.err.println("***测试拦截器执行后***");
}
```
# 如何使用
## 快速上手
三分钟上手实例(如果是初次接触此框架):https://git.oschina.net/mvilplss/nature-user
功能全面的实例(略熟悉此框架的朋友):https://git.oschina.net/mvilplss/nature-demo
## 功能介绍
### 实体类
1、实体类,无需GET/SET方法,只需声明数据库字段的名称
2、使用注解控制指定主键@id,支持ADDSELF(数据库自增长)、UUID(框架维护)、ASSIGN(程序员指定id)
3、@Type:按照JAVA语言的基本类型进行设定,无需考虑数据库的字段,还支持默认值,长度设定等,简单快捷
```
@Table(name = "tb_user")
public class User extends NatureMap {
@Id(strategy = Strategy.ADDSELF)
@Type(type = Types.INT)
public String id = "id";
@Type(type = Types.INT)
public String age = "age";
@Type(def = "女")
public String sex = "sex";
public String name = "name";
@Type(length="300")
public String address = "address";
}
```
### 服务类
1、服务类,为了开发简单可以继承框架中的NatureService(非必需),添加@Service注解即可
2、事物控制可以通过@Tx进行急速实现
3、如果某些业务多读少写则建议使用缓存,使用方法只需传入缓存名称即可,如果缓存有配置则使用,否则使用默认配置。
4、所有业务逻辑建议放在Service层
```
@Service
public class UserService extends NatureService {
public Page page(Page page) {
String sql = "select id,name,sex,age from tb_user where 1=1 order by id desc";
return DatabaseHelper.query(page, sql,"user_cache");
}
@Tx
public int delete(NatureMap natureMap) {
return super.delete(natureMap,"user_cache");
}
}
```
### 控制类
1、创建控制层继承NatureCtrl类并增加@Ctrl注解即可
2、类@Ctrl的namespace是控制层的命名空间,所有本控制层的请求都要通过namespace
3、属性@Inject注解是注入Service实例
4、方法@Ask注解是对方法的映射,如果不写url则默认映射为方法名;与namespace共同组成请求路径/namespace/list
5、返回支持直接返回页面"xxx.jsp",返回方法"xxx",返回JSON数据 JsonData,返回下载文件FileData等,绝对的简单快捷
6、在控制层需要页面传值的只需声明public类型变量即可,无需冗长的GET/SET
7、如需上传文件,控制层直接声明File类型变量即可,支持多文件集合上传,就像接受普通变量一样简单
```
@Ctrl(namespace="/user")
public class UserCtrl extends NatureCtrl{
public User user=new User();//可以不new,如果new的话会提高项目效率
public File myfile;//文件接收
public ArrayList files = new ArrayList();//多文件接收。前台只需input的name为files[0...]
public String action;
@Inject
protected UserService userService;
@Ask(url="/list")
public Object list(){
page = userService.page(page);
return "list.ftl";
}
@Ask
public Object toOper(){
if (user.getInt(user.id)!=0) {
userService.byId(user);
action = "update";
}else{
action = "insert";
}
return "oper.ftl";
}
@Ask
@Redirect
public Object insert(){
userService.insert(user,"user_cache");
return "list";
}
@Ask
@Redirect
public Object update(){
userService.update(user,"user_cache");
return "list";
}
@Ask
@Redirect
public Object delete(){
userService.delete(user,"user_cache");
return "list";
}
@Ask
public Object getJson(){
return new JsonData(userService.byId(user));
}
//文件下载示例,就是这么简单
@Ask
public Object getFile(){
InputStream inputStream =this.getClass().getResourceAsStream("文件.docx");
return new FileData(inputStream, "文件.docx");
}
}
```
# 技术交流
目前框架已经应用公司十多个大小型项目,经过实战和改版升级后正式开源,技术交流群 **148999765** ,如果有问题和意见欢迎加入群进行讨论。
# 特别鸣谢
nature-framework框架的建设离不开开源社区的开源项目和技术分享,特别感谢@Jfinal https://git.oschina.net/jfinal/jfinal @黄勇 https://git.oschina.net/huangyong/smart-framework Struts2 SpringMVC等优秀框架