- 浏览: 2467260 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
在实际开发中我们都会面临组件重用的问题, 面向对象的语言可以通过各种设计模式来实现重用.那么在dorado框架中如何进行重用呢? 对于dorado的重用问题,下面我们从三个方面来进行说明.
1.通过使用jsp:include指令进行重用
将要重用的内容写到一个jsp页面中, 然后通过jsp:include标记在需要使用的位置进行重用, 该jsp中可再引用d:view标签,比如定义一个jsp页面:
然后在另外一个页面中进行引入:
该重用方式比较原始, 主要是利用了jsp:include指令, 会编写jsp的人都会用, 相对来说还是非常简单的. 比较适合组件在页面中的布局中规中矩的情况, 比如实现某一类功能的组件都集中在页面中的某一区域.如果某一类功能的组件在页面中的分布跨度比较大的话, 则会因为没法封装在一个jsp中而无法实现重用.由于重用范围仅限于jsp页面中, 因此其维护性还是非常不错的.但是如果对单个简单组件专门写一个jsp从而在多个jsp页面重用显然有些得不偿失.而且如果对于page1页面中适用到了conrol1,conrol2,conrol3几个组件, 同样在page2页面中也有这3个组件, 大部分属性都差不多, 但是只有少数几个属性不同, 那么我们只能对jsp进行重用, 而jsp对应的view.xml文件则需要写两个. 因此重用性会大一定的折扣
易用程度:★★★★★
适用范围:★★★☆☆
重用粒度:★★☆☆☆
可维护性:★★★★★
2.对view组件定义进行重用
view重用分为两种, 一种是通过调用Server API来创建客户端所需要的组件, 另外一种就是将多个view.xml中定义的组件进行组合
2.1.通过调用Server API来创建客户端所需要的组件
通过调用Server API使用java代码在后台来来创建页面所需要的各种Control和Dataset, 而不是在view.xml文件中定义需要的control和dataset, 因为采用这种方式就可以通过利用java的OO特性(封装, 继承和多态), 比如一个保存按钮, 可能在一个涉及到编辑操作的页面中都会用到, 因此我们可以创建一个ViewModel基类,在基类的initControls()方法中通过new Button()的方式来创建该按钮, 然后指定按钮的属性, 有时间的还要加上事件的javascript脚本, 这样所有从该基类继承的ViewModel所对应的view所在的页面都可以适用该按钮了.
该重用方式实际上就是将在view.xml配置文件中定义的control或者dataset通过java代码来实现, 实际上是换了一种写法而已, 但是相对于配置文件中的定义来说, 不够直观, 而且要写更多java的代码, 如果该该组件比较复杂的话, 比如写有复杂的事件代码, 则需要去拼javascript字符串脚本, 这样维护性将非常差.但是这种方式的重用粒度非常细, 比如可以只对一个button中的某几个属性进行重用. 而且对于基类定义的组件可以根据需要进行重载, 这样灵活性将非常好.
易用程度:★★★☆☆
适用范围:★★☆☆☆
重用粒度:★★★★★
可维护性:★☆☆☆☆
2.2.多个view.xml中定义的组件进行组合重用
在前面介绍jsp重用方式的时候, 我们知道是将一个jsp页面分解成多个页面来进行重用, 而这里我们换一个角度: 将一个view.xml根据重用的需要分解成多个view.xml文件, 其实在jsp重用中, 也使用了多个view.xml文件(进行了view.xml的分解), 但是二者的合并时机是不同的, jsp重用是在jsp页面的时候做的view.xml合并, 而这里的合并是在ViewModel初始化中进行的.
这里先来介绍一下JSP Dorado Taglib, ViewModel和view.xml之间的关系(仅限个人理解)
在dorado的view tag中, 根据给定的view文件所在的位置, 创建ViewModel对象, 该对象中会包含一个ViewModelConfig, 它是对应的view.xml文件的一个解析, 接着进行ViewModel的初始化工作, 初始化就是实际创建组件的过程, 这里面有一些细节我们这里不做研究(比如对于不同的control, 创建的时机是不同的). 最后得到的是一个个组件的Java对象, 我们可以将其看成一个个javabean, jsp页面上的dorado taglib就会根据这些组件对象来生成html或者js脚本.
三者之间的关系大致是这样, 接着我们开始探讨将多个view.xml合并的时机, 最开始我采用在生成ViewModel的时候将要组合的其他view.xml引入, 来生成最终我需要的ViewModelConfig对象(在原有基础上添加了其他view.xml中的组件), 后来这种做法失败了(这个过程太多复杂, 比如还涉及到缓存问题, 很容易出现在第一次展现没有问题, 但是在通过command发送ajax请求找不到对应的对象而出错), 于是我在ViewModel初始化(就是init方法)的时候将要组合的view.xml引入进去, 这时候成功了, 没有出现问题.可能dorado原来的设计没有考虑到合并多个view.xml的做法, 因此ViewModel在这一方面还是很封闭的, 很多相关的方法都是private的, 因此需要copy出来
该重用方式集成了jsp重用的优点, 又在一定程度上消除了它的缺点, 与jsp重用相比, 其优点在于, 它不会受到组件在页面中的位置布局的影响. 在重用粒度上能对单个的组件进行重用, 相比jsp重用要细, 但是比Server API的重用方式要粗一些. 因为只是配置文件上的重用, 因此主要是对配置文件的维护, 可维护性要比Server API方式要好, 该方式需要使用者对view.xml配置文件, jsp dorado taglib, ViewModel类三者之间的关系有非常好的认识.
易用程度:★★☆☆☆
适用范围:★★★★☆
重用粒度:★★★★☆
可维护性:★★★★★
其他重用技巧
如果view.xml文件都一样(说明界面一样), 只是ViewModel不同(说明后台业务逻辑不同)的情况下, 我们可以让其公用同一个view.xml, 只是在d:view的配置上加上clazz属性指定二者不同的ViewModel即可.比如这样的写法:
如何选择
其实这几种重用方式互相之间并不矛盾, 可以在一个功能模块中根据需要结合起来适用.但是如果使用太多的重用方式, 会提高项目的复杂程度, 这样就会影响到可维护性, 因此重用也应该适可而止, 否则就是过犹不及.
1.通过使用jsp:include指令进行重用
将要重用的内容写到一个jsp页面中, 然后通过jsp:include标记在需要使用的位置进行重用, 该jsp中可再引用d:view标签,比如定义一个jsp页面:
<%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib uri="http://www.bstek.com/dorado" prefix="d"%> <d:View config="com.baiyao.workflow.component.ChargeType"> <d:SubWindow id="winChargeType" title="选择类型" width="300" height="200" draggable="true" resizable="true" status="hidden" showMinimizeButton="false" showMaximizeButton="false" showCloseButton="true"> <d:Layout type="border" width="100%" height="100%"> <d:Pane position="center"> <d:DataTable id="tblType" /> </d:Pane> <d:Pane position="bottom" align="center"> <d:Button id="btnOK" /> </d:Pane> </d:Layout> </d:SubWindow> </d:View>
然后在另外一个页面中进行引入:
<d:View config="com.baiyao.workflow.charge.ChargeInput"> <d:AutoForm id="frmForm"> <d:FormElementRenderer group="group1" element="render1"> <d:Layout type="border"> <d:Pane position="center"> <d:DataTable id="tblFormItem" /> </d:Pane> <d:Pane position="bottom" align="center"> <d:Button id="btnAdd" /> <d:Button id="btnDelete" /> </d:Pane> </d:Layout> </d:FormElementRenderer> </d:AutoForm> <jsp:include page="/workflow/component/win_charge_type.jsp" /> </d:View>
该重用方式比较原始, 主要是利用了jsp:include指令, 会编写jsp的人都会用, 相对来说还是非常简单的. 比较适合组件在页面中的布局中规中矩的情况, 比如实现某一类功能的组件都集中在页面中的某一区域.如果某一类功能的组件在页面中的分布跨度比较大的话, 则会因为没法封装在一个jsp中而无法实现重用.由于重用范围仅限于jsp页面中, 因此其维护性还是非常不错的.但是如果对单个简单组件专门写一个jsp从而在多个jsp页面重用显然有些得不偿失.而且如果对于page1页面中适用到了conrol1,conrol2,conrol3几个组件, 同样在page2页面中也有这3个组件, 大部分属性都差不多, 但是只有少数几个属性不同, 那么我们只能对jsp进行重用, 而jsp对应的view.xml文件则需要写两个. 因此重用性会大一定的折扣
易用程度:★★★★★
适用范围:★★★☆☆
重用粒度:★★☆☆☆
可维护性:★★★★★
2.对view组件定义进行重用
view重用分为两种, 一种是通过调用Server API来创建客户端所需要的组件, 另外一种就是将多个view.xml中定义的组件进行组合
2.1.通过调用Server API来创建客户端所需要的组件
通过调用Server API使用java代码在后台来来创建页面所需要的各种Control和Dataset, 而不是在view.xml文件中定义需要的control和dataset, 因为采用这种方式就可以通过利用java的OO特性(封装, 继承和多态), 比如一个保存按钮, 可能在一个涉及到编辑操作的页面中都会用到, 因此我们可以创建一个ViewModel基类,在基类的initControls()方法中通过new Button()的方式来创建该按钮, 然后指定按钮的属性, 有时间的还要加上事件的javascript脚本, 这样所有从该基类继承的ViewModel所对应的view所在的页面都可以适用该按钮了.
@Override protected void initControls() throws Exception { Button btnSave = (Button) createControl("Button", "btnSave"); btnSave.setCommand("cmdSave"); btnSave.setValue("保存"); btnSave.setWidth("70"); UpdateCommand cmdSave= (UpdateCommand) createControl( "UpdateCommand", "cmdSave"); cmdSave.setMethod("save"); DatasetInfo info = cmdSave.addDatasetInfo("dsEntity"); info.setSubmitScope(DatasetInfo.ALL_CHANGE); return btnSave; }
该重用方式实际上就是将在view.xml配置文件中定义的control或者dataset通过java代码来实现, 实际上是换了一种写法而已, 但是相对于配置文件中的定义来说, 不够直观, 而且要写更多java的代码, 如果该该组件比较复杂的话, 比如写有复杂的事件代码, 则需要去拼javascript字符串脚本, 这样维护性将非常差.但是这种方式的重用粒度非常细, 比如可以只对一个button中的某几个属性进行重用. 而且对于基类定义的组件可以根据需要进行重载, 这样灵活性将非常好.
易用程度:★★★☆☆
适用范围:★★☆☆☆
重用粒度:★★★★★
可维护性:★☆☆☆☆
2.2.多个view.xml中定义的组件进行组合重用
在前面介绍jsp重用方式的时候, 我们知道是将一个jsp页面分解成多个页面来进行重用, 而这里我们换一个角度: 将一个view.xml根据重用的需要分解成多个view.xml文件, 其实在jsp重用中, 也使用了多个view.xml文件(进行了view.xml的分解), 但是二者的合并时机是不同的, jsp重用是在jsp页面的时候做的view.xml合并, 而这里的合并是在ViewModel初始化中进行的.
这里先来介绍一下JSP Dorado Taglib, ViewModel和view.xml之间的关系(仅限个人理解)
在dorado的view tag中, 根据给定的view文件所在的位置, 创建ViewModel对象, 该对象中会包含一个ViewModelConfig, 它是对应的view.xml文件的一个解析, 接着进行ViewModel的初始化工作, 初始化就是实际创建组件的过程, 这里面有一些细节我们这里不做研究(比如对于不同的control, 创建的时机是不同的). 最后得到的是一个个组件的Java对象, 我们可以将其看成一个个javabean, jsp页面上的dorado taglib就会根据这些组件对象来生成html或者js脚本.
三者之间的关系大致是这样, 接着我们开始探讨将多个view.xml合并的时机, 最开始我采用在生成ViewModel的时候将要组合的其他view.xml引入, 来生成最终我需要的ViewModelConfig对象(在原有基础上添加了其他view.xml中的组件), 后来这种做法失败了(这个过程太多复杂, 比如还涉及到缓存问题, 很容易出现在第一次展现没有问题, 但是在通过command发送ajax请求找不到对应的对象而出错), 于是我在ViewModel初始化(就是init方法)的时候将要组合的view.xml引入进去, 这时候成功了, 没有出现问题.可能dorado原来的设计没有考虑到合并多个view.xml的做法, 因此ViewModel在这一方面还是很封闭的, 很多相关的方法都是private的, 因此需要copy出来
public class BaseViewModel extends DefaultViewModel { protected static ControlFactory controlFactory; protected List<ViewModelConfig> compositedViewModelConfigs; protected List<String> compositedConfigNames; private int state; @Override public void init(int state) throws Exception { List<String> result = new ArrayList<String>(); addViewModelConfig(result); // 因为在初始化其他viewModelConfig的时候需要使用到状态, 而此时还没有执行super的init方法, // 因此sate还是最初的STATE_VIEW状态 setState(state); initCompositedViewModelConfigs(state, result); super.init(state); } protected void setState(int state) { this.state = state; } public int getState() { return state; } /** * 添加需要组合的view.xml文件路径 * * @param result */ protected void addViewModelConfig(List<String> result) { result.add(JbpmConstants.VIEW_TASK_INSTANCE); } /** * 根据ViewModelConfig初始化创建组件 * * @param state * @param configNames * @throws Exception */ protected void initCompositedViewModelConfigs(int state, List<String> configNames) throws Exception { for (String configName : configNames) { ViewModelConfig config = getViewModelConfig(configName); loadDatasetConfigs(config); loadControlConfigs(config); if (state == STATE_VIEW) { loadEventConfig(DoradoContext.getContext(), config); } } } /** * 根据view.xml文件名得到ViewModelConfig对象 * * @param configName * @return * @throws Exception */ protected ViewModelConfig getViewModelConfig(String configName) throws Exception { ViewModelConfig config = null; if (compositedViewModelConfigs == null) { compositedViewModelConfigs = new ArrayList<ViewModelConfig>(); compositedConfigNames = new ArrayList<String>(); } if (!compositedConfigNames.contains(configName)) { ViewModel viewModel = ViewModelManager.getViewModel(null, configName, getNamespace(), "request"); config = viewModel.getConfig(); compositedViewModelConfigs.add(config); compositedConfigNames.add(configName); } return config; } @SuppressWarnings("unchecked") protected static ControlFactory getControlFactory() { if (controlFactory == null) try { String clazz = Setting.getString("view.controlFactory"); Class cl = Class.forName(clazz); controlFactory = (ControlFactory) cl.newInstance(); } catch (IllegalAccessException ex) { Log.error(ex); } catch (InstantiationException ex) { if (System.getProperty("java.version").compareTo("1.4") >= 0) Log.error(ex.getCause()); else Log.error(ex); } catch (ClassNotFoundException ex) { Log.error(ex); } return controlFactory; } @SuppressWarnings("unchecked") protected void loadDatasetConfigs(ViewModelConfig viewModelConfig) throws Exception { if (viewModelConfig == null) return; List keys = viewModelConfig.datasetNodes(); int count = keys.size(); for (int i = 0; i < count; i++) { String id = (String) keys.get(i); XmlNode node = viewModelConfig.getDatasetNode(id); if (state != 2 && state != 3) createDataset(node); } } @SuppressWarnings("unchecked") protected void loadControlConfigs(ViewModelConfig config) throws Exception { if (config == null) return; List keys = config.controlNodes(); int count = keys.size(); for (int i = 0; i < count; i++) { String id = (String) keys.get(i); XmlNode node = config.getControlNode(id); String type = node.getAttribute("type"); Class typeClass = getControlFactory().getControlType(type); if (typeClass != null) { if ((com.bstek.dorado.view.control.Logical.class) .isAssignableFrom(typeClass)) { createControl(type, id); continue; } if (state == STATE_VIEW && !(com.bstek.dorado.view.control.Placeable.class) .isAssignableFrom(typeClass)) createControl(type, id); } else { throw new IllegalArgumentException("Unknown control type '" + type + "'!"); } } } protected void loadEventConfig(DoradoContext context, ViewModelConfig config) { if (config == null) return; XmlNode eventNodes[] = null; XmlNode eventsNode = config.getRoot().getChild("Events"); if (eventsNode != null) eventNodes = eventsNode.getChildren(); if (eventNodes != null) { for (int i = 0; i < eventNodes.length; i++) { XmlNode eventNode = eventNodes[i]; String script = XmlConfigUtils.getNodeContent(eventNode, context); EventHandler event = new EventHandler(eventNode .getAttribute("name"), script); addEventHandler(event); } } } public Control getControl(String id) throws Exception { ViewModelConfig config = getConfig(); Control control = getControl(config, id, true); return control; } /** * 在多个view.xml文件中遍历直到找出要对应的javabean模型数据来创建control * * @param config * @param id * @param loop * 是否循环查找, 如果是在compositeViewModelConfigs中查找的话应该避免循环查找, 否则会死循环 * @return * @throws Exception */ private Control getControl(ViewModelConfig config, String id, boolean loop) throws Exception { Control control = (Control) controls.get(id); if (control == null && config != null) { XmlNode node = config.getControlNode(id); if (node != null) { String type = node.getAttribute("type"); control = createControl(type, id); } else if (loop) { // 注意顺序, 添加组合的view.xml文件的原则是后添加的同id的control或dataset将覆盖前面的 for (int i = compositedViewModelConfigs.size() - 1; i >= 0; i--) { compositedViewModelConfigs.get(i); control = getControl(compositedViewModelConfigs.get(i), id, false); if (control != null) { break; } } } } return control; } public Control createControl(String type, String id) throws Exception { Control control = (Control) controls.get(id); if (control == null) { control = constructControl(type, id); ViewModelConfig config = getConfig(); if (config != null) { initControl(control, config, id); } controls.forceAdd(id, control); initControl(control); } return control; } private void initControl(Control control, ViewModelConfig config, String id) throws Exception { XmlNode node = config.getControlNode(id); if (node == null) { for (int i = compositedViewModelConfigs.size() - 1; i >= 0; i--) { config = compositedViewModelConfigs.get(i); node = config.getControlNode(id); if (node != null) { break; } } } control.init(DoradoContext.getContext(), node); } protected ViewDataset createDataset(String type, String id, XmlNode node) throws Exception { ViewDataset dataset = constructDataset(type, id); DoradoContext context = DoradoContext.getContext(); if (node != null) { dataset.init(context, node); if (state == STATE_REPORT) dataset.setAutoLoadData(true); } datasets.forceAdd(id, dataset); initDataset(dataset); return dataset; } public ViewDataset createDataset(XmlNode node) throws Exception { String type = node.getAttribute("type"); String id = node.getAttribute("id"); return createDataset(type, id, node); } @Override public ViewDataset getDataset(String id) { // 在当前config中找, 如果找不到, 将在组合config中去找 ViewDataset dataset = super.getDataset(id); if (dataset == null) { for (ViewModelConfig config : compositedViewModelConfigs) { if (dataset == null && config != null) { XmlNode node = config.getDatasetNode(id); if (node != null) try { String type = node.getAttribute("type"); dataset = createDataset(type, id); if (dataset != null) break; } catch (Exception ex) { Log.error(ex); } } } } return dataset; } @Override public ViewDataset createDataset(String type, String id) throws Exception { XmlNode node = null; ViewModelConfig config = getConfig(); if(config != null) { node = config.getDatasetNode(id); if (node == null) { for (ViewModelConfig vmc : compositedViewModelConfigs) { node = vmc.getDatasetNode(id); if (node != null) { break; } } } } return createDataset(type, id, node); } }
该重用方式集成了jsp重用的优点, 又在一定程度上消除了它的缺点, 与jsp重用相比, 其优点在于, 它不会受到组件在页面中的位置布局的影响. 在重用粒度上能对单个的组件进行重用, 相比jsp重用要细, 但是比Server API的重用方式要粗一些. 因为只是配置文件上的重用, 因此主要是对配置文件的维护, 可维护性要比Server API方式要好, 该方式需要使用者对view.xml配置文件, jsp dorado taglib, ViewModel类三者之间的关系有非常好的认识.
易用程度:★★☆☆☆
适用范围:★★★★☆
重用粒度:★★★★☆
可维护性:★★★★★
其他重用技巧
如果view.xml文件都一样(说明界面一样), 只是ViewModel不同(说明后台业务逻辑不同)的情况下, 我们可以让其公用同一个view.xml, 只是在d:view的配置上加上clazz属性指定二者不同的ViewModel即可.比如这样的写法:
<d:View config="com.baiyao.workflow.settlement.SettlementInput" clazz="com.baiyao.workflow.settlement.ExpenseSettlementInputViewModel"> <jsp:include page="/workflow/settlement/settlement_input.jsp" /> </d:View>
如何选择
其实这几种重用方式互相之间并不矛盾, 可以在一个功能模块中根据需要结合起来适用.但是如果使用太多的重用方式, 会提高项目的复杂程度, 这样就会影响到可维护性, 因此重用也应该适可而止, 否则就是过犹不及.
发表评论
-
几个经常用到的通用Dorado基础类
2008-08-03 01:22 24631.Dorado中虽然提供了ViewModel的接口, 但是这 ... -
使用Dorado框架开发必备参考(更新中)
2008-07-17 18:21 4903[size=medium]下面是我经常 ... -
如何在bstek IDE插件版中支持多种服务器
2007-11-27 11:59 2056默认情况下, bstekIDE使用tomcat作为服务器, ... -
插件高级应用---通过扩展点自定义组件
2007-11-08 23:44 3471在前面我介绍 ... -
bstekIDE Eclipse插件扩展点应用介绍
2007-11-06 20:39 4942众所周知,Eclipse开发平台本身就是基于插件 ... -
Dorado和Remedy整合可行性分析
2007-10-30 20:27 3494Dorado是一个 ... -
dorado studio插件定制扩展应用两则
2007-09-21 11:02 3964为了减少在使用dorado框架进行开发中的大量重复劳动,我们提 ... -
dorado学习笔记(二)
2007-09-05 17:45 4687·isFirst, isLast在什么情况下使用?在遍历dat ... -
Dorado学习笔记
2006-12-23 22:45 8761·具有过滤功能的dropdown控件是DynamicDropD ...
相关推荐
标题中的"Dorado7/9开发环境 (解压即用Eclipse+dorado插件)支持dorado7和dorado9"表明这是一个专为Dorado7和Dorado9开发设计的集成开发环境(IDE)。这个环境基于Eclipse,一个广泛使用的开源Java IDE,它已经被扩展...
11. **最佳实践**:分享开发过程中的经验和技巧,帮助开发者避免常见问题。 这份离线文档是 Dorado 开发者的重要参考资料,无论是在项目初始化阶段寻找灵感,还是在遇到具体问题时查找解决方案,都能提供极大的帮助...
通过这些文档,开发者可以掌握Dorado7的各种组件、功能以及最佳实践。 `apache-tomcat-7.0.20` 是一个流行的Java应用服务器,用于部署和运行Java Web应用程序。在这个环境中,Dorado7应用将被配置并运行在Tomcat之...
通过阅读"05 技术手册",用户可以全面了解DORADO5的使用方法和最佳实践,从而充分发挥该软件在企业信息化建设中的作用。不断学习和掌握这些知识,对于提升企业的数据处理能力和决策效率具有重要意义。
5. **最佳实践**: - **合理设计数据对象**:为了提高效率,应尽量减少数据对象的字段数量,避免不必要的数据传输。 - **优化缓存策略**:根据业务场景选择合适的缓存策略,平衡性能和内存消耗。 - **错误处理与...
《Dorado7 IDE 0.7.2:前端开发的新选择》 在当前的软件开发领域,前端框架的发展日新月异,其中Dorado7以其独特的特性和强大的功能,逐渐吸引了众多开发者的关注。而“dorado7-ide-0.7.2.zip”这个压缩包,正是为...
8. **最佳实践**:分享实际应用中的经验和技巧,帮助用户实现最佳的业务运行效果。 总的来说,Dorado 5 用户指南是一本全面且实用的操作手册,无论是初次接触Dorado 5的新用户,还是经验丰富的管理员,都能从中获取...
10. **最佳实践**:学习社区推荐的最佳实践,以提高开发效率和代码质量。 通过阅读《Dorado7xQuickStart.pdf》文档,你将逐步了解和掌握这些知识。文档通常会提供详细的教程、示例代码和常见问题解答,帮助你快速...
Dorado 是一个企业级的Java应用开发框架,它旨在简化企业级应用的开发流程,提高开发效率。Dorado 提供了一整套完善的服务,包括UI组件、数据访问、业务服务和事务管理等。在这个场景中,我们关注的是"Dorado-...
在实际使用中,开发者应遵循Dorado7 API的最佳实践,如合理使用批量操作以提高效率,正确处理错误和异常,以及定期刷新Access Token以保持会话的有效性。 通过深入学习和理解Dorado7 API,开发者可以构建出高效、...
《Dorado7实战:从初级到中级的探索与实践》 Dorado7是一款高效、灵活的企业级服务开发框架,主要用于构建复杂的企业应用。本实战课程旨在帮助初学者和有一定基础的开发者深入理解Dorado7的核心概念和技术,通过...
Dorado的性能指南会提供最佳实践和策略,教你如何减少页面加载时间、优化数据请求、缓存策略等,以提升应用的运行效率和用户体验。 6. **Java关联**: 由于Dorado与Java紧密关联,文档中可能涉及到Java相关的知识...
内含Dorado7插件,Eclipse+dorado7插件合集下载地址,百度网盘永久有效地址。
本文将深入探讨Dorado的核心特性,使用方法以及在Eclipse环境中的配置与开发实践。 首先,我们关注的是"Dorado4.jar"这个核心库文件。Dorado 4是该框架的一个版本,包含了众多用于创建动态Web应用的组件和功能。这...
《Dorado快速入门》经典教程是一份非常适合新手学习的指南,旨在帮助初学者逐步...通过这个经典的快速入门教程,新手不仅可以学会基本操作,还能建立起对Dorado开发流程的整体理解,为日后深入学习和实践打下坚实基础。
Dorado Client Api.chm dorado 客户端 手册
5. **sample** 文件夹:通常包含示例代码和项目,便于开发者学习和理解Dorado5的用法和最佳实践。 6. **license**:包含软件的许可协议,规定了软件的使用权限和限制。 7. **support**:可能是一个支持文件夹,...
【 dorado 5 快速入门 】 dorado 5 是一款高性能、高可用性的企业级存储虚拟化系统,主要用于数据中心的数据存储管理。本快速入门将带你了解 ...请务必仔细阅读并实践,以充分利用 dorado 5 提供的强大存储功能。