paoding-rose后端java框架
原文地址 https://www.b2bchain.cn/5492.html
其依赖 Spring 的一套体系,主要对 Controller 和 DAO 层提供支持。
Controller 跟 Spring MVC 比较类似,但是相对Spring MVC来说功能稍弱一点; DAO 又跟 MyBatis 比较类似,相对轻量一些,实际上是对 JdbcTemplate 的封装,并添加注解/SQL自定义标签等支持,使用起来很方便。
Rose 是一个基于Servlet规范、Spring“规范”的WEB开发框架。
Rose 框架通过在web.xml配置过滤器拦截并处理匹配的web请求,如果一个请求应该由在Rose框架下的类来处理, 该请求将在Rose调用中完成对客户端响应. 如果一个请求在Rose中没有找到合适的类来为他服务,Rose将把该请求移交给web容器的其他组件来处理。
Rose使用过滤器而非Servlet来接收web请求,这有它的合理性以及好处。
Servlet规范以“边走边看”的方式来处理请求, 当服务器接收到一个web请求时,并没有要求在web.xml必须有相应的Servlet组件时才能处理,web请求被一系列Filter过滤时, Filter可以拿到相应的Request和Response对象 ,当Filter认为自己已经能够完成整个处理,它将不再调用chain.doNext()来使链中下个组件(Filter、Servlet、JSP)进行处理。
使用过滤器的好处是,Rose可以很好地和其他web框架兼容。这在改造遗留系统、对各种uri的支持具有天然优越性。正是使用过滤器,Rose不再要求请求地址具有特殊的后缀。
为了更好地理解,可以把Rose看成这样一种特殊的Servlet:它能够优先处理认定的事情,如无法处理再交给其它Filter、Servlet或JSP来处理。这个刚好是普通Servlet无法做到的 : 如果一个请求以后缀名配置给他处理时候 ,一旦该Servlet处理不了,Servlet规范没有提供机制使得可以由配置在web.xml的其他正常组件处理 (除404,500等错误处理组件之外)。
一个web.xml中可能具有不只一个的Filter,Filter的先后顺序对系统具有重要影响,特别的,Rose自己的过滤器的配置顺序更是需要讲究 。如果一个请求在被Rose处理前,还应该被其它一些过滤器过滤,请把这些过滤器的mapping配置在Rose过滤器之前。
拦截器要放在controllers下(注意:必须要放在和需要验证的controller在同一个包下!!!)
paoding-rose “强制限制”,paoding-rose 规定 Controller 层 类必须以Controller结尾,必须写在 controller包下面; DAO 层都是接口,命名必须以 DAO 结尾,必须写在 dao 包下面等等一些强制的要求,否者项目就跑不起来。 跟约定大于配置这个概念有点类似,但是其又不提供配置,必须按照要求来,这些强制的编码要求使开发相对来说规范起来,对后期维护是有益的。
Rose框架内部采用"匹配->执行"两阶段逻辑。Rose内部结构具有一个匹配树, 这个数据结构可以快速判断一个请求是否应该由Rose处理并进行, 没有找到匹配的请求交给过滤器的下一个组件处理。匹配成功的请求将进入”执行“阶段。 执行阶段需要经过6个步骤处理:“参数解析 -〉 验证器 -〉 拦截器 -〉 控制器 -〉 视图渲染 -〉渲染后"的处理链。
包 padding jade web xml 配置过滤器 biz 业务处理查询 con-biz-sevice-dao 抽象service dto 请求 前台请求参数给这里 dto传参数 转换只需求的参数 enums 数据库状态 枚举 excpention 异常 exterenal 外部接口 调区块链或者三方支付接口 interceptors 过滤器 登录验证等 quartz 定时任务,暂时不用 service.xml spring管理的业务 cotroller dao 包名,结尾必须固定才可以扫描到 请求json转对象 对象验证参数正确validatetable 在dto当中 dao pojo 数据对象 dto 与前端交互返回对象 dto 当中用 json formet插件 ctrl n快捷键 实体类转json例子 package org.rose.template.common; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.rose.template.dao.pojo.ChainInfo; /** * @author lizhenglong */ public class ChainJson { //通过实体类转换成json public static void BeanToJson(){ List<ChainInfo> data = new ArrayList<ChainInfo>(); ChainInfo chainEntity = new ChainInfo(); chainEntity.setName("btc"); chainEntity.setLock_add("buQjzRpyveZYJ9yTN6dRnCYxQMmQve6dKGU4"); chainEntity.setDeposit("1000"); chainEntity.setAbi("[{\"constant\":false,\"inputs\":[{\"name\":\"seq\",\"type\":\"uint64\"},{\"name\":\"block_data\",\"type\":\"bytes\"}],\"name\":\"submitBlock\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getMaxBlockNum\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"input\",\"type\":\"string\"},{\"name\":\"ledger_seq\",\"type\":\"uint64\"},{\"name\":\"spv_tx_data\",\"type\":\"bytes\"},{\"name\":\"spv_receipt_data\",\"type\":\"bytes\"}],\"name\":\"submitCrossTx\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"); chainEntity.setSpv("buQjzRpyveZYJ9yTN6dRnCYxQMmQve6dKGU4"); chainEntity.setStatus(1); chainEntity.setAsset("buc"); chainEntity.setDescription("btcchain"); chainEntity.setIcon("https://imgchr.com/i/MWXC7Q"); data.add(chainEntity); JSONObject jsonObject = new JSONObject(); System.out.println(jsonObject.toJSONString(data));//通过toJSONString( )将实体类转化成json对象 } public static void main(String[] args) { BeanToJson(); } } 检查数据库字段是否冲突例如Lock 数据库id是否自增 json传入数据只需data内部分即可