# 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等优秀框架