ADF 入门帮助

ADF 入门帮助
ADF 入门帮助

本文是由英文帮助翻译所得:

1>task flows

“任务流task flows”可以包括非可视化的组件,比如方法调用。

“页片段page fragment”可以运行在一个页面的某个局部区域,最大限度地提高复用性。ADF Task Flow是在JSF Controller的基础上扩展而来的,它除了包括View Activities 和导航规则之外,还可以包括method calls等非可视化Activity。

ADF Task Flow分为两种:Bounded task flow和Unbounded task flow

1、Bounded task flow

(1)、作为局部、分支的页面流程。

(2)、有一个唯一入口和零到多个出口。

(3)、拥有自己私有的Control flow rules,Activities,Managed bean,Transactions.

(4)、可以重用。

2、Unbounded task flow

(1)、作为顶级的页面流程。

(2)、出口不固定。

ADF ManagedBean与JSF Managed Bean的区别在于,ADF Managed Bean的Scope 比JSF Managed Bean多了pageFlowScope、viewScope、backingBeanScope。. pageFlowScope:Managed Bean在Task Flow中的所有Page可见,且访问的同一个实例。如果其它Task flow中Page访问该Managed Bean,将会创建一个新实例,供这个Task flow中的所有Page使用。

. viewScope:只在当前这个view(可能是root browser window,也可能是region)可见,当viewId发生改变后,该Managed Bean被释放掉。

. backingBeanScope:一个Page中含有一个Task Flow,并且这个Task flow使用了多个region,设置此值可以起到隔离各个region的作用(会在每个region中创建一个实例),避免数据冲突。

2>布局

为了使组件能够自适应浏览器窗口大小,首先需要放置根一级的可伸缩的布局组件。以下组件可以根据父容器的大小自动伸缩(加星号的还可以伸缩其子组件):

. * Decorative Box

. Panel Accordion

. Panel Box (当type="stretch"或"default")

. Panel Collection

. Panel Dashboard

. Panel Group Layout (当layout="scroll"或"vertical")

. * Panel Spliter

. * Panel Stretch Layout

. Panel Tabbed

对于这些组件,不要设置其宽度、高度的百分比,设置了反而不好。

以下组件不能根据父容器的大小自动伸缩:

. Panel Border Layout

. Panel Box (当type="flow"或"vertical")

. Panel Form Layout

. Panel Group Layout (当layout="default"或"horizontal")

. Panel Header

. Panel Label and Message

. Panel List

如果你必须使用一个不能自动伸缩的容器,但又想达到自动伸缩的效果,可以为该容器套上一个可以自动伸缩的容器,如Panel Group Layout(当layout="scroll"或"vertical")。最佳实践:(1)、布局时,根容器要可以自动伸缩。(2)、无法伸缩的容器,可以考虑外套一个Panel Group Layout(当layout="scroll"或"vertical")。

3>eo的自定义属性

为Entity Object增加Transient Attribute,比如自动计算订单总价:单价*数量。

(1)、因为是Transient Attribute,所以不要选择Persistent。

(2)、在View Object中增加该Attribute。

(3)、设置重新计算的条件:Always--每次都重新计算;Never--只在创建时计算一次;Based on the following expression--根据表达式返回值(True or false)来计算是否重新计算。

为Entity Object增加Association,比如订单项目中的产品与产品关系。

(1)、Association命名规则是FKAssoc。

(2)、搞清楚一对多的关系中,谁是一、谁是多。

4>vo添加View Link

为View Object增加View Link,比如订单项目中的产品与产品关系。

View Object是对Entity Object的查询结果,结果包括Entity Object的全部或部分属性。一般来说,一个View Object对应一个Entity Object。当然,你也可以完全根据SQL 语句自定义一个View Object。View Link表明的是两个View Object之间的关系,一个View Link对应一个Association。

(1)、View Link命名规则也是FkLink。

(2)、同样,也要搞清楚一对多的关系中,谁是一、谁是多。

5>am添加Data Model

为Application Module增加Data Model。

View Object表明数据被访问的方式。客户端通过访问View Object而访问Data Model。Data Model保存在Application Module中。Application Module是一种类型的业务服务,其它类型的业务服务有Web Service、EJB。在Data Model中,View Object所带的数字“1”、“2”、“3”....,表明这是该View Object的第几个实例。

6>LOV

ADF BC特色功能之一:级联式下拉列表

在实际应用中,经常会使用两个级联式下拉列表的情况,比如先选择国家列表,在根据选择的国家显示城市列表。你可以把View Object某个Attribute定义成LoVs(全称:List of Values)。这样,由于是定义在模型层上,UI界面无需做任何改动。

7>ADF BC特色功能之二:强大的自动计算与验证功能

1、通过新建Transient Attribute来实现自动计算。

2、验证Foreign Keys:Key Exists。LOVs可以限制用户只能从已有的外键中选择,但有时界面要求使用文本输入框,而不是下拉列表,这时候就需要使用Key Exists来验证用户输入的外键是否正确。并且,Key Exists可以让我们在程序中使用该功能,不通过界面。LOVs是定义在View Object上的,而Key Exists是定义在Entity Object上的。

3、约束性条件依赖:Compare。某个Attribute的值与设定值进行比较,为真则满足要求,否则报错。其中可以设定触发条件和触发Attributes。

4、使用Groovy脚本验证。如果脚本中有对象为null,Groovy不会抛出NullPointerException,而是表达式结果为null,null对应的Boolean值为false。

8>使用ADF Faces之一:开发用户界面

如何使用其它Project的资源:共享资源如servlet classes,helper classes,images 和templatess,可以通过创建ADF library来为其它Project所共用。

9>使用ADF Task Flows之一:菜单与页面导航

一个应用的页面之间的上下级关系就像一棵树。每个节点都是一个页面。

一个典型的ADF应用由一个或多个unbounded task flow和bounded task flows组成。创建unbounded task flow时不要选择“Create as Bounded Task Flow”,并且以adfc-xxx-config.xml的格式来命名,比如adfc-sale-config.xml。adfc- config.xml

是应用默认的unbounded task flow,它应该作为应用的总入口、根节点。

10>客制化:个性化的一种服务(customize(v),customization(n))

表示根据客户的需求进行特别的定制,已满足其需要。一般用于软件/服务/加工制造等方面。针对顾客的需求,对一个标准的产品进行改变、用新的部件替换标准的部件、或是在一个标准产品中加入特殊的功能,提供顾客一个更完整的产品组合。

个性化:就是非一般大众化的东西。在大众化的基础上增加独特、另类、拥有自己特质的需要,独具一格,别开生面,打造一种与众不同的效果。

问题:在ADF中如何定制ADF应用?

根据行业的不同,客户的不同,需要对ADF应用做一些定制化操作,ADF应用的定制化分为两种:

(1)、个性化:允许用户运行时对应用进行定制。

(2)、客制化:允许用户设计时对应用进行定制。

无论是那种定制方法,这些定制的内容均不会对已开发完成的应用作出修改,而是存储在MDS(Metadata Service repository)中。MDS支持两种方式的实现:文件和数据库。ADF应用默认使用基于文件的MDS。

基于文件的MDS:选择Application -> Application Properties -> RUN -> MDS。Directory Content:你可以设置是否在每次执行应用前清空MDS存储的定制化信息。

如何实现用户客制化(Customize)

客制化是在设计时,在原有ADF应用的基础上,增加定制化层,每一层可能对应不同的行业、不同的公司。这样做的好处就是,既能满足不同风格的展现要求,同时又不改变原有应用的基础代码。

(1)、一个ADF应用允许设置多个客制化层,如industry层及site层。

(2)、每一个客制化层允许具有多个客制化值,如industry层可以具有healthcare和financial等。

(3)、运行时,每一个层只有一个客制化层值有效。

(4)、客制化层的顺序由adfc-config.xml中各个客制化类的顺序决定。

实现客制化的具体步骤如下:

one、定义CustomizationLayerValues.xml。

打开文件

C:\Oracle\Middleware\jdeveloper\jdev\CustomizationLayerValues.xml,该文件

定义了所有客制化层以及每层的值。

two、创建customization.properties文件

在Model Project中,新建一个文件customization.properties。该文件表明运行时,每个客制化层设定为哪个值。

three、创建和发布客制化类

MDS使用客制化类来决定应用哪个客制化层,一个客制化类对应一个客制化层,其接口如下:

. CacheHint getCacheHint();

决定customization的类型,返回值包括ALL_USERS、MULTI_USER、REQUEST、USER四种。

ALL_USERS:customization为针对某应用全局有效的,通常用于static类型的customization层。

MUTI_USER:针对复数用户有效的customization。

REQUEST:针对当前请求有效的customization。

USER:针对某特定用户有效的customization,通过用户访问应用的Session来决定具体用户。

. String getName();

返回当前customization类对应customization层的名称。

. String generateIDPrefix(RestrictedSession sess, MetadataObject mo);

返回在MDS中对应当前customization层元素加的前缀,以使该客制化层的元素在MDS中具有唯一标示。这一前缀在所有customization层中必须是唯一的,出于性能考虑应小于4个字符。

. String[] getValue(RestrictedSession sess, MetadataObject mo);

返回反映客户化层加载顺序的列表,按照列表顺序加载。通常只需要有一个customization层,故该列表通常只返回一个值。

在Model Project中,新建一个Java类:SiteCCTV.java,内容自己再去看。写好类后,编译Model Project,发布Model Project为一个Jar文件。这里需要注意三点:

(1)、选中Include Manifest File。

(2)、只选中定制化类和customization.properties文件。

(3)、必须把该Jar文件Copy到C:\Oracle\Middleware\jdeveloper\jdev\lib\patches 目录下。

four、修改adf-config.xml文件

选择Application Resource -> Descriptors -> ADF META_INF,双击adf-config.xml 打开overview editor。增加前面新建的定制化类。

five、为ViewController Project选中Enable Seeded Customizations。

six、创建基础应用:TaskFlows,JSF Pages等等。

seven、在基础应用上客制化应用。这时,要以Customization Developer角色重新进

入JDeveloper。方法是Tools -> Preferences -> Roles,选择

Customization Developer。重启JDeveloper后,应该能看到之前做的设置。

11>开发端到端的ADF应用之一:开发富互联网应用

1、创建Read-Only Vo:创建此种Vo一般作为下拉列表选项出现在UI中。

2、为EO的字段定义验证规则:除了可以为EO的字段定义验证规则(Attributes Level Validator)之外,你还可以为整个EO定义验证规则(Entity Level Validator)。Attributes Level Validator在attribute值变时触发;Entity Level Validator在验证Entity时触发。如果想要自定义Java验证规则,则Rule Type选择Method方式,会自动帮你生成相应的方法,Java验证规则也可以定义在Attributes或Entity上。

3、在EO的字段设置默认值

当前日期,adf.currentDate,显示格式。当前时间,adf.currentDateTime。注意,必须选择Expression方式。

4、创建一对多的UI界面(部门与员工是一对多的关系)

注意,拖放EmployeesVo时,要选择DepartmentsVo下的EmployeesVo,这样才能自动关联一对多的关系。

5、创建VO(Updatable access throuth entity objects)

(1)、创建VO的方式除了从Tables的方式创建以外,也可以通过抽取多个EO的属性来创建。

(2)、为VO增加自动计算的Transient属性,如SumSalary=Salary*12。

(3)、为EmpDetails VO增加View Accessors:Job VO,供以下拉列表的方式选择Job。

注意,手工创建的VO必须加入Application Model的Data Model中才能使用。

6、创建VO(Read-only access through SQL query)

可以用自定义SQL query的方式来创建Read-Only VO,可以带查询参数,参数直接定义在查询语句中,如select first_name from employees where email=:p_email。这种方式定义的VO,生成Data Control时,会在该VO的Operations下生成对应的ExecuteWithParams。

12>开发端到端的ADF应用之二:使用EJB、JPA、JSF开发Web应用

1、使用EJB3和JPA建立业务服务层。

(1)从数据库表创建JPA Entities,生成相应的java文件,主要包括Entities的属性和CRUD方法。以后可以根据需要,手工添加一些方法。

(2) 创建EJB Session Bean,选择Persistence Type=JPA,选择暴露哪些Entities

上的方法。Entity如果增加了新的方法想要通过Session Bean调用,右键点击

EJB Session Bean,选择Edit Session Facade,把新方法加进来即可。

(3)测试Session Bean非常方便,右键点击EJB Session Bean,选择New Sample Java Client,就会帮你生成测试代码,你只需要传一些必要的参数即可。测试前,先要运行Session Bean(把Session Bean发布到WLS上,并启动),然后右键点击Java Client,选择Run。

(4)JPA Entities也可以不通过Java EE Container——直接在Java SE Container中就可以调用。你需要创建一个新的persistence unit,右键点击persistence.xml选择New Java Service Facade,选择Persistence Type=JPA,选择暴露哪些Entities上的方法。在main函数中,可以增加你的测试代码,并直接运行——不需要先运行Session Bean。

2、为Session Bean创建Data Control。

右键点击EJB Session Bean,选择Create Data Control,选择暴露的Session Bean 的Interface:Local或Remote。

3、如何让一个普通Project可以使用JSF/ADF组件?

(1) 右键点击Project,选择Project Properties,选择JSP Tag Libraries,选择Select Distributed libraries,增加ADF Faces Components 11,(只选这个就可以,其它的会带过来)。

(2)继续选择Technology Scope,选择JSF(只选这个就可以,其它的会带过来)。

13>如何显示提示信息

1、显示在某个组件的旁边

要想显示在组件的旁边,首先要得到这个组件的ID,然后就是构造FacesMessage,并显示出来。

(1)组件已经绑定在MB中

FacesContext context = FacesContext.getCurrentInstance();

FacesMessage message = new

FacesMessage(FacesMessage.SEVERITY_ERROR,"Please supply a valid file name to upload",null);

context.addMessage(this.getFileInputComponent().getId(),message);

(2)通过组件上的事件获取组件

FacesContext context = FacesContext.getCurrentInstance();

FacesMessage messagge = new FacesMessage("Successfully uploaded file"+file.getFilename()+"("+file.getLength()+"bytes)");

context.addMessage(event.getComponent().getClientId(context),message);

(3)获取根组件

public static void addFacesErrorMessage(String attrName, String msg){

FacesContext ctx = FacesContext.getCurrentInstance();

FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, attrName, msg);

ctx.addMessage(JSFUtils.getRootViewComponentId(), fm);

}

(4)通过根组件+组件ID查找组件

pubic static void addFacesErrorMessage(String attrName, String msg){

FacesContext ctx = FacesContext.getCurrentInstance();

FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, attrName, msg);

ctx.addMessage(JSFUtils.getRootViewComponentId().findComponent("produ ctpriceIT").getClientId(ctx), fm);

}

14>页面之间传值的几种方法:

两个页面,第一个页面点击某个command component,传一个参数到第二个页面。

方法一:选中task flow中的某个View Activity,设置属性Input Page Parameters,from,to。设置到pageFlowScope中。

方法二:在按钮上设置set action listener事件,导航前该listener被触发。使用set action listener设置from,to,将当前页面的某个值设置到pageFlowScope中。

方法三:在按钮上设置set property listener事件,设置from,to,type。type=action,表明监听该command component的action event。

说明:建议使用set property listener。

两个页面,第二个页面接收第一个页面传过来的参数值

Map pageFlowScope =

RequestContext.getCurrentInstance().getPageFlowScope();

Object myObject = pageFlowScope.get("myObjectName");

RequestContext adfContext = RequestContext.getCurrentInstance(); adfContext.getPageFlowScope().clear();

15>commit操作

因为Commit操作往往需要保存到数据库,操作相对费时,因此最好不要让用户随便点击。需要Enable时才Enable,其判断依据就是表单数据是否已经更改。

实际应用中,在做其它操作时,我们也需要判断数据是否已经更改,比如:用户修改了某个表单,没有提交,然后直接转到其它页,这时我们应该提醒它数据已经修改,是否保存?也

就是说,我们需要在MB中判断https://www.360docs.net/doc/bd7512657.html,mit.enabled的值,方法如下:

public boolean isCommitEnabled(){

Boolean commitState =

(Boolean)JSFUtils.getManagedBeanValue("https://www.360docs.net/doc/bd7512657.html,mit.enabled");

boolean commitEnabled = commitState != null ? commitState.booleanValue() : false;

return commitEnabled;

}

判断数据是否已经更改的一种更底层方法(因为是在AM上判断的),只要AM上的VO发生了改变,都可以用这个方法监测到。方法如下:

public boolean isDirty(){

ApplicationModule am =

ADFUtils.getDCBindingContainer().getDataControl().getApplicationModule();

return am.getTransaction().isDirty();

}

在使用ADF Commit按钮时,还有一个常见问题:当用户修改某一个表单项后,即使焦点转移后,Commit按钮也不会被Enable。如果出现这种情况,需要增加两个参数:(1)增加autoSubmit="true"。(2)刷新Commit按钮。

建议方法:设定Commit按钮的PPR,指向该表单项,这样当该表单项变动后,会局部刷新Commit按钮。

16>关于Table

关于Table:点击某个按钮后,传入选中行的整个对象

方法:为该按钮添加setActionListener,其from值绑定到Table对应iterator的currentRow,to值绑定到页面对应MB中ViewRowImpl类型的变量rowObject(该变量就是用来接收传进来的行对象的)。实例

from="#{bindings.tableIterator.currentRow}" to="#{MB.rowObject}">,然后在rowObject的set方法中就可以设置行中字段值了。

关于Table:Table显示时为只读模式,点击Table后,选中行变为修改模式,保存后回

到只读模式:

适合场景:表列项比较少的情况,增加,修改,删除功能都在一个页面完成,不用打开新页面。

方法:拖放Table时,选择ADF Table(不要选择ADF ReadOnly Table),然后设置属性EditingMode=clickToEdit(默认是editAll,一般不用这种方式)。

关于Table:Table显示时为只读模式,点击某个按钮后,弹出一个窗口修改选中行,保存后关闭弹出窗口,Table回到只读模式:

方法:1、拖放Table时,选择ADF ReadOnly Table(因为修改是在弹出窗口中,因此Table只读即可)。

2、使用Popup窗口是比较好的选择,因为Popup窗口支持popupCanceledListener,当直接关闭窗口时,可以捕捉到该事件。

3、在按钮中设置showPopupBehavior。

4、在合适的位置放置popup组件,内嵌一个dialog组件。设置popup的popupCanceledListener事件、popupFetchListener事件及Dialog的dialogListener 事件,都将对应方法绑定到页面对应的MB中。

5、MB中对应的各个listener代码。比如:

public void cancelListener(PopupCancelEvent popupCancelEvent){//cancel listener

BindingContainer bc = getBindings();

OperationBinding ob = bc.getOperationBinding("Rollback");

ob.execute();

}

public void fetchListener(PopupFetchEvent popupFetchEvent){//fetch listener //根据触发事件的source client id,来判断点击的是哪个按钮:Edit or Insert。

if(popupFetchEvent.getLaunchSourceClientId().contains("insert")){

BindingContainer bc = getBindings();

OperationBinding ob = bc.getOperationBinding("CreateInsert");

ob.execute();

}

}

public void dialogListener(DialogEvent dialogEvent){//dialog listener

if(dialogEvent.getOutcome().name().equals("ok")){

BindingContainer bc = getBindings();

OperationBinding ob = bc.getOperationBinding("Commit");

ob.execute();

}else{

BindingContainer bc = getBindings();

OperationBinding ob = bc.getOperationBinding("Rollback");

ob.execute();

}

}

17>LOV

Vo中制作LOV时,将字段UI Hints中的Default List Type设为Input Text with List of Values:

(1)、为JobId增加LOV,并设置Default List Type:Input Text with List of Values;选择显示JobId和JobTitle,即在Display Attributes下Available中的将JobId

和JobTitle拉入Selected中。

(2)、拖放view至页面,选择生成ADF Form,发现JobId的显示组件自动设置为ADF List of Values Input。如果选中Query List Automatically,弹出查询页面时,会直接显示所有结果。

(3)、运行,JobId为一个文本输入框,旁边有一个查询按钮,点击后可以查询,选择一条记录,会返回到文本输入框。注意,无论查询显示的是哪些字段,返回的都是JobId。

(4)、设置inputListOfValues组件的autoSubmit="true"。除了(3)的运行效果之外: . 当输入AD_,按下Tab键,会弹出所有以AD_开头的JobId选项。

. 当输入AD_V,按下Tab键,会直接补全为AD_VP,因为只有一个值满足条件。(5)、为inputListOfValues组件增加autoSuggestBehavior,如:

suggestedItems="#{bindings.JobId.suggestedItems}"/>此时,除了(4)的

运行效果之外,会新增一种效果:随着用户的输入,会自动下拉显示匹配的结果。经过测试,中文也可以支持自动匹配。

(6)、有时候我们需要为弹出的查询窗口预设置一些过滤LOV,这是可以考虑使用LaunchPopupListener。inputListOfValues组件增加了属性launchPopupListener,如:launchPopupListener="#{backing_Bean.filterLOV}",绑定MB中方法。最后在MB中添加方法,如下:

public void filterLOV(LaunchPopupEvent launchPopupEvent){

BindingContainer bc = getBindings();

FacesCtrlLOVBinding lov = (FacesCtrlLOVBinding)bc.get("JobId");

lov.getListIterBinding().getViewObject().setNamedWhereClauseParam("salar y",4000);

}

18>popup

popup组件常常嵌套组件Note Window、Dialog、Menu,一起使用。

点击一个按钮,根据某些条件,动态来决定是否弹出一个窗口?

此种情况适合以下场景:

(1)当用户修改了表单,如果没有保存,接着直接转到其它地方,此时应该提示:“数据已更改,是否保存?”;如果保存了,则不提示。

(2)允许用户删除多条记录功能:

当用户点击Delete按钮时,需要确认用户选择了哪些记录,如果超过一条(包括一条),则提示用户:“数据将被删除,是否确认?”;否则提示“你没有选择任何数据”。当然,如果前端可以控制成如下效果则更好:当用户选择了一条以上(包括一条)的记录时,Enable Delete按钮;否则Desable Delete按钮。

实现步骤:

(1)在页面中创建popup对象。

(2)在按钮上,添加actionListener(不要添加showPopupBehavior组件,因为showPopupBehavior组件会在Action事件之前触发,也就是说,只要点击按钮就会

弹出窗口,这不符合要求),我们只在actionListener对应MB中的方法中写代码条件弹出popup窗口。

public void dialogListener(DialogEvent dialogEvent){

if(dialogEvent.getOutcome() == DialogEvent.Outcome.ok) {

FacesContext facesContext = FacesContext.getCurrentInstance();

ExtendedRenderKitService extendedRenderKitService =

Service.getRenderKitService(facesContext, ExtendedRenderKitService.class); String script = "var popup; popup =

AdfPage.PAGE.findComponent('"+"p2"+"'); popup.show();";

extendedRenderKitService.addScript(facesContext, script);

}else if(dialogEvent.getOutcome() == Dialog.Outcome.cancel) {

//Nothing to do here...

}

}

18>am

Nested AM与Root AM的Transaction关系

在实际应用中,为了达到逻辑重用的目的,会使用嵌套的AM。在Root AM和Nested AM 中都有各自的VO,在一个页面中,可能同时用到了不同AM的不同VO,那么当一个AM 提交时,另一个AM是否也会提交呢?

实验略,实验中需要巩固的代码:

如果VO中字段为Number类型,那么给该字段设置值时,应该这样

--vo.setMinSalary(new oracle.jbo.domain.Number(1000));

获取AM对象的代码:

ApplicationModule am =

ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl"); AppModuleImpl service = (AppModuleImpl)am;

NestedAppModuleImpl nestedService =

(NestedAppModuleImpl)service.getNestedAppModule();//从Root AM中获取Nested AM对象

结论:

(1)Nested AM与Root AM使用的是同一个Transaction,都是Root AM中的Transaction,无论使用哪个AM提交,另一个AM中的VO也会被提交。

(2)多个Root AM之间的Transaction互不干涉,各自管理自己的。

(3)所以,想要避免提交本不想提交的表单,该表单所对应的VO的AM必须是Root AM。注:Nested AM并不是另外一种AM,只不过是次AM是嵌套在另一个AM中的,所以叫它Nested(嵌套的)AM。

Transaction和DBTransaction的区别与联系

DBTransaction和Transaction都是接口,DBTransaction是Transaction的子类,Transaction主要提供了一些事务常用到的方法:

.commit:Commits the transaction and saves all changes to the database.

.connect: Attempts(试图) to establish(建立) a connection to the given database URL.

.disconnect: DisConnects the server from the database.

.getLockingMode: Gets the preferred(首先的、当前的) locking mode for this transaction.

.rollback: Rolls back the transaction and discards(丢弃) all changes.

.setLockingMode: Sets the preferred(首选的、当前的) locking mode for this transaction.

DBTransaction则继承了以上方法,并提供了一些针对EO的方法:

. findByPrimaryKey()

. getSession()

. getEnvironment()

验证实例略,需记住和巩固代码:

当给vo中添加row时,vo.createRow()后一定要记住vo.insertRow(row)。

在MB中先获取DataControl对象,在从中获取AM对象代码,

DCDataControl dc = BindingContext。getCurrent().getDefaultDataControl(); ApplicationModule am = (ApplicationModule)dc.getDataProvider(); AppModuleImpl service = (AppModuleImpl)am;

验证结论:

(1)使用getTransaction().commit()和getDBTransaction().commit(),数据库都提交

了。

(2)一般情况下,使用Transaction就可以了,除非你需要使用DBTransaction上独有的方法。

19>Database Connection Pool调优

在AM的配置项中,有Connection Pool一项,其分为两种:JDBC URL和JDBC Datasource。

(1)在开发环境中,一般使用JDBC URL,由ADF管理ConnectionPool。这时,你可以修改相关的参数。但一般来说,开发时不会关心数据库连接池的优化。因此,一般不修改这些参数。

(2) 在生产环境中,一般使用JDBC Datasource,由应用服务器管理Connection Pool,与ADF无关。所有在AM上设置的Connection Pool参数将被忽略。AM也将从应用服务器管理的Connection Pool中获取数据库连接。

使用JDBC Datasource好处是不用在开发端配置数据库的具体信息,将来数据库变了,只要JNDI名字不变,程序就不用修改。

所以,总的来说,我们不需要修改Connection Pool的配置,因为这个是由应用服务器管理的,不同的应用服务器配置不同,需要查相关手册。

20>Application Module Pool调优

Application Module Pool使用用来存放有同一类型的AM实例的池子,多个浏览器客户端可以“共享使用”少量的Application Module实例,这样就可以提高应用的性能。只有根一级的Application Module才可以建立Pool,换句话说,内嵌的Application Module 也将“共享使用”根一级的Application Module Pool,包括数据库连接,事务,缓存。Application Module实例也分为状态和无状态两种。对于有状态的AM实例,它保存用户session的相关信息,用户做下一步操作时,将会继续使用该AM实例。如果用户请求很多,AM实例已经接近峰值,那么将会“钝化”这些有状态的AM实例,即把有状态信息持久化。然后把这些AM实例腾出来供其它用户使用,等到该用户继续做下一个有状态操作时,再用一个新的AM实例,并匹配“激活”刚才“钝化”的信息。

AM Pool主要参数说明如下:

1、Pool Behavior Parameters

. Failover(失效备援) Transaction State Upon Managed Release: 默认false,建议设置为true。

在有状态的AM实例被释放回池中时执行“钝化”。

. Disconnect Application Module Upon Release:默认值false,建议设置为false。

强制AM实例每次释放回池中时,同时释放掉其对应的JDBC连接。默认为false,好

处是不仅不用再从数据库连接池获取连接,并且连prepared statements也可以直

接拿来就用。

. Support Dynamic JDBC Credentials(文凭、信用状): 默认值true,建议设置为true。

允许程序在新的用户Session开始的时候通过代码来修改数据库的连接的用户和口令。 . Reset Non-Transactional State Upon Unmanaged Release: 默认true,建议设置true。

当AM实例以无状态的方式释放回池中时,重置所有的Non-Transaction State,比如VO的运行时设置,JDBC的Prepared Statements,绑定变量等等,保证放回池中

的AM实例是“干净”的

. Enable Application Module pooling: 默认false,建议设置为true。

. Row-Level Locking Behavior Upon Release: 默认false,建议设置为true。

强制AM实例被释放回池时不去在数据库中创建一个pending transaction state。

ADF web application应该设置锁定模式为乐观锁“optimistic”(默认为悲观锁“pessimistic”),以避免创建行级锁。

关于参数“Disconnect Application Module Upon Release”实验结论:

(1)在使用AM Pool时,发现数据库连接消耗的特别快。用户每次访问一个页面,都会新占用一个数据库连接,这是不合理的。

(2)Disconnect Application Module Upon Release参数默认不选中是有利于性能优化的。

(3) 参数Idle Instance Timeout、Pool Polling Interval、Maximum Instance Time to Live应该配合使用,基本原则是:Maximum Instance Time to Live >

Idle Instance Timeout + Pool Polling Interval(否则还没等AM Pool标记清除之前,AM实例就已经被清除了)。

(4)每个AM池的设置可以根据自身情况有所不同,比如如果AM的调用时间比较长,可以适当增大Maximum Instance Time to Live;Maximum Pool Size基本接近或略高于用户并发数的峰值,如果用户并发数很高,可以适当减小Maximum Instance Time to Live,便于回收AM实例和数据库连接;对应操作频繁,但事务较小的AM,可以适当增大。

(5)ADF 自带的数据库连接池一般不用于生产环境。在生产环境下,应该使用JDBC Datasource的方式,使用WLS的数据库连接池来管理。基本原则是数据库连接池的最大值=AM Maximum Pool Size。Idle Instance Timeout、Pool Polling Interval,尽量直接重用AM实例,无需重新获取。

对AutoSubmit、PartialSubmit、Immediate、PartialTriggers更深层次的了解:

1、autoSubmit只在输入组件上才有的一个属性,如RichIputText。

2、partialSubmit只在命令组件上才有的一个属性,如CommandLink。

autoSubmit 与partialSubmit的区别是,后者仅处理更改的组件本身以及在其partialTriggers属性中包含引用的所有组件,不会触发表单中的必填项的验证,除非这些必填项的partialTriggers指向设置了autoSubmit=true的组件。

值得注意的是,CommandToolBarButton默认partialSubmit=true,所以如果你需要刷新某个组件,必须设置partialTriggers,否则页面不会被刷新。而CommandButton 默认partialSubmit=false,默认会刷新整个页面。

技术因素不是网站成功的因素,决定网站成功的关键因素是内容。

如果你定一个高得离谱的目标,就算失败了,那你的失败也在任何人的成功之上——詹姆斯.卡梅隆。

22>TaskFlow之Reentry属性的使用

在实际应用中,用户可能会点击浏览器的回退按钮回到上一页面,在有些情况下会导致一些问题。ADF Bounded TaskFlow有一个选项(Unbounded TaskFlow无此选项)可以设置是否允许用户使用浏览器的回退按钮回到上一页面,这个属性就是Reentry。Reentry可以设置为:

. reentry-allowed:默认选项。允许该bounded task flow中的所有页面实用化浏览器的回退按钮重新进入上一页面。

. reentry-not-allowed: 不允许该bounded task flow中的所有页面使用浏览器的回退按钮重新进入上一页面。这里的不允许不是禁止用户点击浏览器的回退按钮,这个是没有办法禁止的。它的不允许时这样体现的:当用户点击浏览器的回退按钮后,可以重新进入上一页面,但如果你在该页面做任何事情,也如点击按钮,将会抛出异

常:InvalidTaskFlowReentry。

. reentry-outcome-dependent:能否允许该bounded task flow中的所有页面使用浏览器的回退按钮重新进入上一页面取决于上一次从该bounded task flow返回的outcome ,也就是说,取决于Return Activity上的Reentry属性设置。适合的典型场景:购物网站如果用户取消了某此采购,那么允许回退;如果订单已经提交,则不允许回退。注:reentry- not-allowed的行为和我们想象的不一样,事后警告用户抛异常,这个页面效果肯定不太友好,这时,我们应该创建一个exception handler来处理这个异常,提示用户页面过期,需要重新登录之类的警告,并在几秒之后自动跳转到登录页面。

几个需要明确的问题:

(1)、重新进入Task Flow后,Task Flow上的输入参数将使用当前值(如果有新的赋值的话),而不是初始值。

(2)、重新进入Task Flow后,Manage Bean中的值也跟着回退到之前的值,所有在用户回退之后的修改将丢失。可以通过设置View Activity上的redirect属性来改变这一

行为。这个有待实验考证。

23>TaskFlow之Transaction的使用

ADF TaskFlow有一个很重要的特性:在Bounded TaskFlow上可以设置事务。也就是说,在这个TaskFlow中的所有Activity(View和其它非可视化的)都将属于一个事务。区别于Java EE Container上的事务设置(要么是直接设置在EJB的方法上,要么是设置在ejb.xml中,运行时由Container解析);TaskFlow 这个是设置在控制器层的,这使得我们很容易控制一个TaskFlow的事务。

打开一个Bounded Task Flow,在Property中找到Behavior,其中Transaction属性:找到

. No Controller Transaction:不加入任何事务中。

. Always Begin New Transaction:开始一个新的事务,无论是否已经在一个事务之中。. Always Use Existing Transaction:加入已有的事务,如果没有事务可加入,抛异常。. Use Existing Transaction If Possible:加入已有的事务,如果没有事务可加入,开始一个新的事务。

事务的提交是在Task Flow Return Activity上完成的,在Property中找到Behavior,其中End Transaction属性,我们可以设置如何提交事务(commit or rollback)。

进一步对Bounded TaskFlow对事务支持程度的研究,以下实验结论:

实验一结论:Bounded TaskFlow中的所有View Activity都属于一个事务。

实验二结论:Bounded TaskFlow中事务处理是跨AM的,即不同AM中的VO的事务操作,也可以作为一个全局事务来管理。页面都没有

实验三结论:Bounded TaskFlow中事务处理是跨AM、跨数据库的,即不同AM中的VO 的事务操作,VO来自于不同的数据库,也可以作为一个全局事务来管理。

实验四:2个AM,3个DB Connection,1个Bounded TaskFlow(包含两个修改页面和一个Method Call,每个页面都没有事务提交功能,而是交给Task Flow Return Activity 负责)。

实验四结论:EJB Transaction由Java EE Container负责,不能与TaskFlow Transaction一起作为一个全局事务来管理二者的事务各自独立,互不干涉。

一看就懂的Android APP开发入门教程

工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择U SE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JAVA_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Andro id的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

如何开发iOS应用程序

如何开发iOS应用程序 开发iOS应用程序既有趣又回报丰厚,如果您是一位新手,自然想知道从哪里入手。本路 线图提供了iOS应用程序开发的绝佳起点。在Mac 电脑上,您可以创建在iPad、iPhone 和iPod touch 上运行的iOS应用程序。遵循本路线图以了解如何取得开发工具,理解主要概念及最佳实践,并学会查找更多信息。 继续遵循此路线图,您将使用到Xcode和iOS SDK(Apple 提供的开发工具)。您将了解Objective-C(驱动所有iOS应用程序和框架的程序设计语言)的编程基础知识,并将探索Cocoa Touch 框架。您将创建一个简单的iOS应用程序,并学会在设备上进行测试。最后,您还会学到如何将应用程序提交到App Store。 路线图中的每个页面,都介绍一个新主题,并链接到一篇或多篇有关该主题的简短文章。路线图只是提供基本的入门知识,最后一页“接下来做什么”包含您接下来应该阅读的文稿链接。完成了路线图,您就具备了进一步了解各个主题的能力,并且掌握到着手开发iOS应用程 序的知识、工具和技能。 如果您是Mac 开发者:您其实已经掌握了不少开发iOS应用程序的知识。可是,尽管iOS 和OS X 使用相同的开发工具和开发语言,两者仍然存在着一些重大的差异(您将在路线图的学习过程中发现这点)。有关这些平台差异的全面描述,请参阅iOS Technology Overview(iOS技术概述)中的“Migrating from Cocoa”(从Cocoa 迁移)。

设置 您在开发应用程序时,会使用到iOS软件开发套件(SDK) 以及Xcode,即Apple 的集成开发环境(IDE)。Xcode包括源代码编辑器、图形用户界面编辑器及其他许多功能,为您开发完美的iPhone、iPod touch 和iPad应用程序,提供了所需要的全部资源。大多数应用程序开发工具集中显示在一个窗口中,Xcode称之为工作区窗口。在此窗口内,您可以顺畅地从代码编写转换到代码调试,再到用户界面设计。iOS SDK 扩展了Xcode工具集,包含iOS专用的工具、编译器和框架。 开始之前: 1. 下载最新版本的Xcode。 在Mac 上打开Mac App Store应用程序,搜索Xcode,然后点按“免费”按钮下载Xcode。您下载的Xcode已包含iOS SDK。(Mac OS X v10.7 以及更高版本已经预装Mac App Store 应用程序。如果您使用的是较早版本的Mac OS X,则需要升级。) 您无需加入该计划也可编写应用程序并在iOS Simulator 中测试。但是,您只有加入该计划,才能在设备上测试与分发应用程序。加入该计划后,您还可以全权访问iOSDev Center 和iOS Provisioning Portal。如果您现在加入,就可以执行路线图中的所有操作步骤,包括在设备上测试应用程序。 马上开始 开发优秀的iOS应用程序,需要大量的学习和实践。不过,有了这些工具和iOS SDK,开发一个简单可用的程序并非难事。您的首个iOS应用程序教程,介绍了这些工具、基本设计模式和应用程序开发过程。通过这个教程,您将学习创建一个能接收用户文本输入并能将文本显示在屏幕上的应用程序。您还将学到如何在Mac 上的iOS Simulator 中运行这一程序。本教程中的简单步骤引入了一些简练实用的概念,将在今后的程序开发中不断地用到。

ADF检验

以中国2001——2015年各季度GDP 为例。 时间 GDP 时间 GDP 时间 GDP 时间 GDP 2001年Q1 23,299.5000 2004年Q4 159,878.0000 2008年Q3 228,935.4229 2012年Q2 246,913.7330 2001年Q2 48,950.9000 2005年Q1 38,848.6000 2008年Q4 314,045.4271 2012年Q3 383,636.6047 2001年Q3 75,818.2000 2005年Q2 81,422.5000 2009年Q1 73,283.6275 2012年Q4 519,470.0992 2001年Q4 109,655.0000 2005年Q3 125,984.9000 2009年Q2 156,897.8212 2013年Q1 128,083.5340 2002年Q1 25,375.7000 2005年Q4 183,867.9000 2009年Q3 245,821.2738 2013年Q2 271,115.3226 2002年Q2 53,341.0000 2006年Q1 46,678.2949 2009年Q4 340,902.8126 2013年Q3 421,835.1222 2002年Q3 83,056.7000 2006年Q2 99,238.7117 2010年Q1 86,684.3479 2013年Q4 588,019.0000 2002年Q4 120,333.0000 2006年Q3 154,706.4747 2010年Q2 185,744.1504 2014年Q1 138,737.9662 2003年Q1 28,861.8000 2006年Q4 216,314.4259 2010年Q3 290,694.7860 2014年Q2 293,938.9812 2003年Q2 59,868.9000 2007年Q1 56,686.6255 2010年Q4 401,512.7952 2014年Q3 457,405.9484 2003年Q3 93,329.3000 2007年Q2 121,335.5172 2011年Q1 103,456.8650 2014年Q4 636,138.7325 2003年Q4 135,823.0000 2007年Q3 190,125.0432 2011年Q2 221,921.8620 2015年Q1 147,961.7996 2004年Q1 33,420.6000 2007年Q4 265,810.3058 2011年Q3 347,201.1732 2015年Q2 314,178.2215 2004年Q2 70,405.9000 2008年Q1 68,778.3523 2011年Q4 473,104.0486 2015年Q3 487,773.5083 2004年Q3 109,967.6000 2008年Q2 147,315.9722 2012年Q1 116,147.8983 在eviews 中输入数据,双击序列名,选择View ——Unit Root Test ,得到下对话框: 这里做的选择是(1)ADF 检验,(2)对原序列yt 做单位根检验,(3)检验式中不包括趋势项和截距项。点击OK 键。得ADF 检验结果如下。 注意: (1)Test type (选择检验类型) (2)Test for unit root in (选择差分形式) Level (原序列)、一阶差分、二阶差分 (3)选择不同检验式(缺省选择是检验式中只包括截距项。其他两种选择是检验式中包括趋势项和截距项,检验式中不包括趋势项和截距项。 (4)ADF 检验式中选择差分项的最大滞后期数。

Android APP开发入门教程

Android APP开发入门教程 这篇文章主要介绍了Android APP开发入门教程,从SDK下载、开发环境搭建、代码编写、APP打包等步骤一一讲解,非常简明的一个Android APP开发入门教程,需要的朋友可以参考下。 工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android 程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android 开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择USE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JAVA_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK 包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Android的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK 目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

苹果 iOS 移动应用开发新手入门

苹果 iOS 移动应用开发新手入门 马上着手开发 iOS 应用程序 开发iOS 应用程序既有趣又回报丰厚,如果您是一位新手,自然想知道从哪里入手。本路线图提供了iOS 应用程序开发的绝佳起点。在Mac 电脑上,您可以创建在iPad、iPhone 和iPod touch 上运行的iOS 应用程序。遵循本路线图以了解如何取得开发工具,理解主要概念及最佳实践,并学会查找更多信息。 继续遵循此路线图,您将使用到Xcode 和iOS SDK(Apple 提供的开发工具)。您将了解Objective-C(驱动所有iOS 应用程序和框架的程序设计语言)的编程基础知识,并将探索Cocoa Touch 框架。您将创建一个简单的iOS 应用程序,并学会在设备上进行测试。最后,您还会学到如何将应用程序提交到App Store。

设置 您在开发应用程序时,会使用到iOS 软件开发套件(SDK) 以及Xcode,即Apple 的集成开发环境(IDE)。Xcode 为开发完美的iPhone、iPod touch 和iPad 应用程序,提供了您所需要的一切。它包括源代码编辑器、图形用户界面编辑器和许多其他功能。大多数应用程序开发工具集中显示在一个窗口中,Xcode 称之为工作区窗口。在此窗口内,您可以顺畅地从代码编写转换到代码调试,再到用户界面设计。iOS SDK 扩展了Xcode 工具集,包含iOS 专用的工具、编译器和框架。 开始之前: 1.下载最新版本的Xcode。 在Mac 上打开Mac App Store应用程序,搜索Xcode,然后点按“免费”按钮下载Xcode。您下载的Xcode 已包含iOS SDK。(Mac OS X v10.7 以及更高版本已经预装Mac App Store 应用程序。如果您使用的是较早版本的Mac OS X,则需要升级。) 2.加入iOS Developer Program 成为Apple 开发者。 您无需加入该计划也可编写应用程序并在iOS Simulator 中测试。但是,您只有加入该计划,才能在设备上测试与分发应用程序。加入该计划后,您还可以全权访问iOS Dev Center 和iOS Provisioning Portal。如果您现在加入,就可以执行路线图中的所有操作步骤,包括在设备上测试应用程序。 马上开始 开发优秀的iOS 应用程序,需要大量的学习和实践。不过,有了这些工具和iOS SDK,开发一个简单可用的程序并非难事。“您的首个iOS 应用程序”教程,介绍了这些工具、基本设计模式和应用程序开发过程。通过这个教程,您将学习创建一个能接收用户文本输入并能将文本显示在屏幕上的应用程序。您还将学到如何在Mac 上的iOS Simulator 中运行

ADF单位根检验

1.ADF单位根检验 2.Engle-Granger协整检验 3.Da-vdson误差修正模型 4.Granger因果关系检验 1、简单回归; 2、工具变量回归; 3、面板固定效应回归; 4、差分再差分回归(difference in differnece); 5、狂忒二回归(Quantile)。 大杀器就这几种,破绽最少,公认度最高,使用最广泛。真是所谓的老少皆宜、童叟无欺。其他的方法都不会更好,只会招致更多的破绽。你在STATA 里面还可以看到无数的其他方法,例如GMM、随机效应等。GMM其实是一个没有用的忽悠,例如估计动态面板的diffGMM,其关键思想是当你找不到工具变量时,用滞后项来做工具变量。结果你会发现令人崩溃的情况:不同滞后变量的阶数,严重影响你的结果,更令人崩溃的是,一些判断估计结果优劣的指标会失灵。这GMM的唯一价值在于理论价值,而不在于实践价值。你如果要玩计量,你就可以在GMM的基础上进行修改(玩计量的方法后面讲)。 有人会问:简单回归会不会太简单?我只能说你真逗。STATA里面那么多选项,你加就是了。什么异方差、什么序列相关,一大堆尽管加。如果你实在无法确定是否有异方差和序列相关,那就把选项都加上。反正如果没有异方差,结果是一样的。有异方差,软件就自动给你纠正了。这不很爽嘛。如果样本太少,你还能加一个选项:bootstrap来估计方差。你看爽不爽!bootstrap就是自己把脚抬起来扛在肩上走路,就这么牛。这个bootstrap就是用30个样本能做到30万样本那样的效果。有吸引力吧。你说这个简单回归简单还是不简单!很简单,就是加选项。可是,要理论推导,就不简单了。我估计国内能推导的没几

Scala从基础到开发实战

Scala从基础到开发实战 对于进化缓慢的Java跟C++语言来说,目前Scala无疑更适应现代化特质的语言,语法简洁,同时兼备函数式编程与面向对象编程,具有令人耳目一新的编程范式。而运行在Java 虚拟机上的编译环境使得其具有很多的现有工具与类库,拥有快速的可靠的解释器和编译器。 本课程是Scala语言基础课程,面向没有或仅有少量编程语言基础的同学,当然,具有一定的Java或C、C++语言基础将有助于本课程的学习。在本课程内,将更注重scala的各种语言规则和应用,通过学习本课程能具备初步的Scala语言实际编程能力。 Scala最近的红火也得益于Spark分布式内存计算平台的兴起,由于其惊人的计算速度,Spark将要革命Hadoop的说法尘嚣日上,但学习Spark的一项瓶颈是其原生语言Scala并不为大众所熟知,即使是资深程序员,从未听说过Scala者大有人在,于是本门课程也可以称为Spark系列的前置课程,供深入学习大数据技术的同仁们进行热身运动。 课程大纲: 第一课:Scala介绍——如何安装Scala REPL、SBT、IDE,编写简单的Scala程序;函数式编程简介 第二课:Scala的class和object,Scala的变量、类的介绍 第三课:Scala的基本数据类型、控制语句 第四课:高阶函数、Currying、尾递归 第五课:数据结构:List、Map、Set 第六课:组合和继承 第七课:Trait 第八课:响应式编程介绍 第九课:Akka框架(一)——akka的基本用法 第十课:Akka框架(二)——actor的监控 第十一课:Akka框架(三)——网络编程 第十二课:Akka框架(四)——akka使用技巧

编程入门教程.doc

编程入门教程 编程入门教程由勤快学基础教程https://www.360docs.net/doc/bd7512657.html,梳理的一本面向程序开发入门初学者的编程入门教程,是一个涵盖了游戏、PLC、VB、数控、JAVA、APP、Matlab、C语言、Shell、IOS、Android安卓等手机和PC编程的入门教程。 1.编程入门教程 1.1. 游戏编程入门 游戏编程入门适用于任何对C++语言有基本了解的读者阅读,适宜作为读者进入游戏开发领域的技术入门学习用书。 游戏编程入门介绍如何设计和构建自己的电脑游戏。游戏编程入门不是泛泛地介绍编程理论,而是引导读者开发一个“即插即用”的游戏引擎,可以增强和重用这个游戏引擎以开发各种游戏。书中包括了7个完整游戏的详尽解释以及示例代码,使读者准备好开始自己的游戏项目开发。如果读者喜爱玩游戏,那么只需在学习了如何开发它们之后,就可以玩上自己开发的游戏了。 光盘内容:Bloodshed Dev-C++开发环境;在游戏编程入门中开发的示例和游戏的完整源代码和可执行程序文件;C++语言和Windows编程的入门指导。 1.2. plc编程入门 可编程序控制器,英文称Programmable Controller,简称PC。但由于PC容易和个人计算机(Personal Computer)混淆,故人们仍习惯地用PLC作为可编程序控制器的缩写。它是一个以微处理器为核心的数字运算操作的电子系统装置,专为在工业现场应用而设计,它采用可编程序的存储器,用以在其内部存储执行逻辑运算、顺序控制、定时/计数和算术运算等操作指令,并通过数字式或模拟式的输入、输出接口,控制各种类型的机械或生产过程。PLC 是微机技术与传统的继电接触控制技术相结合的产物,它克服了继电接触控制系统中的机械触点的接线复杂、可靠性低、功耗高、通用性和灵活性差的缺点,充分利用了微处理器的优点,又照顾到现场电气操作维修人员的技能与习惯,特别是PLC的程序编制,不需要专门的计算机编程语言知识,而是采用了一套以继电器梯形图为基础的简单指令形式,使用户程序编制形象、直观、方便易学;调试与查错也都很方便。用户在购到所需的PLC后,只需按说明书的提示,做少量的接线和简易的用户程序编制工作,就可灵活方便地将PLC应用于生产实践。 1.3. 电脑编程入门 编辑程序让电脑执行的过程就叫编程很多软件都可以编程具有代表性的计算机语言有Java,BASIC C,C++,VB,VF,SQL,网页编程JSP,ASP,PHP ,软件是eclipse,Microsoft Visual

大数据开发新手学习指南(经典)

上市公司,官网:https://www.360docs.net/doc/bd7512657.html, 大数据开发初学者该如何学习 导读: 第一章:初识Hadoop 第二章:更高效的WordCount 第三章:把别处的数据搞到Hadoop上 第四章:把Hadoop上的数据搞到别处去 第五章:快一点吧,我的SQL 第六章:一夫多妻制 第七章:越来越多的分析任务 第八章:我的数据要实时 第九章:我的数据要对外 第十章:牛逼高大上的机器学习 经常有初学者会问,自己想往大数据方向发展,该学哪些技术,学习路线是什么样的,觉得大数据很火,就业很好,薪资很高……首先,如果你确定了想往这个方面发展,先考虑自己的过去从业经历、专业、兴趣是什么。计算机专业——操作系统、硬件、网络、服务器?软件专业——软件开发、编程、写代码?还是数学、统计学专业——对数据和数字特别感兴趣? 其实这就是想告诉你大数据的三个发展方向,平台搭建/优化/运维/监控、大数据开发/设计/架构、数据分析/挖掘。 先扯一下大数据的4V特征: ?数据量大,TB->PB ?数据类型繁多,结构化、非结构化文本、日志、视频、图片、地理位置等;

上市公司,官网:https://www.360docs.net/doc/bd7512657.html, ?商业价值高,但是这种价值需要在海量数据之上,通过数据分析与机器学习更快速的挖掘出来; ?处理时效性高,海量数据的处理需求不再局限在离线计算当中。 现如今,正式为了应对大数据的这几个特点,开源的大数据框架越来越多,越来越强,先列举一些常见的: 文件存储:Hadoop HDFS、Tachyon、KFS 离线计算:Hadoop MapReduce、Spark 流式、实时计算:Storm、Spark Streaming、S4、Heron K-V、NOSQL数据库:HBase、Redis、MongoDB 资源管理:YARN、Mesos 日志收集:Flume、Scribe、Logstash、Kibana 消息系统:Kafka、StormMQ、ZeroMQ、RabbitMQ 查询分析:Hive、Impala、Pig、Presto、Phoenix、SparkSQL、Drill、Flink、Kylin、Druid 分布式协调服务:Zookeeper 集群管理与监控:Ambari、Ganglia、Nagios、Cloudera Manager 数据挖掘、机器学习:Mahout、Spark MLLib 数据同步:Sqoop 任务调度:Oozie 1.1 学会百度与Google

xcode全中文教程(iOS开发快速入门利器)

介绍 本教程向您演示如何创建一个简单的iPhone应用程序。本文不打算对iPhone目前可用的特性作全面介绍,而是介绍一些技术,让您对基础开发过程有初步了解。 如果您刚开始使用Cocoa Touch进行iPhone开发,则您需要阅读本文档。阅读之前,您需要大致了解计算机编程基础,尤其是要了解Objective-C。如未曾用过该语言,则至少应通读学习Objective-C:入门教材。 本文档不是为了创建一个优雅漂亮的应用程序,而是为了向您描述: 如何使用Xcode创建并管理一个工程 基础设计模式和iPhone开发的基本技术 Interface Builder使用入门 如何让应用程序响应来自标准用户接口控件的用户输入 另外,我们还在教程中指出其他一些文档。只有阅读这些文档,您才能充分理解iPhone开发的工具和技术。 重要:为了学习本教程,您需要安装iPhone SDK和开发者工具,它们位于iPhone开发中心。 文档描述的工具包含在iPhone SDK v3.0里面—请检查一下Xcode版本,它不能低于3.1.3。 文档的组织方式 本文档分为如下章节: “教程概述和设计模式” “创建您的工程” “添加一个视图控制器” “查看Nib文件” “配置视图” “实现视图控制器”

“排除疑难” “下一步做什么?” 下页 教程概述和设计模式 本章概述您将要创建的应用程序以及将会使用的设计模式。 教程概述 在学习过程中,您将创建一个很简单的应用程序。它含有一个文本字段,一个标签和一个按键。您可以把名字输入到文本字段中,再按下按键,这时标签的文本就会变成“Hello, !”:

ADF检验

引自Ruey S. Tsay著,王辉、潘家柱译《金融时间序列分析》(第2版) DF检验 为了检验资产的对数价格p t是否服从一个随机游动或一个带漂移的随机游动,对模型 p t=?1p t?1+e t (1) p t=?0+?1p t?1+e t (2) 其中e t为误差项。考虑原假设H0:?1=1;H1:?1<1,即是一个单位根检验问题。一个方便的检验统计量就是在原假设下?1的最小二乘估计的t?比。对(1)式,由最小二乘法得 ?1= p t?1p t T t=1 t?1 T t=1 ,σe2= p t??1p t?12 T t=1 其中p0=0,T为样本容量。t?比为 DF≡t?比= ?1?1 ?1的标准差 = p e T σe p t?12 T t=1 这个t?比检验通常称为DF检验。若e t为一个白噪声序列,其稍高于二阶的矩是有限的,则当T?∞时DF统计量趋于一个标准布朗运动的函数。如果?0=0但我们采用了(2)式,则所得的检验?1=1的t?比将趋于另一种非标准的渐进分布。上述两种情形都是用模拟方法来得到检验统计量的临界值。然而如果?0≠0且使用的是(2)式,则用来检验?1=1的t?比是渐进正态的,但此时将需要很大的样本容量来保证渐进正态分布的使用。 ADF检验 用x t表示一个AR(p)时间序列,为了验证序列是否存在单位根,通常人们采用ADF检验来验证,即可以用如下回归来进行假设检验(H0:β=1;H1:β<1): x t=c t+βx t?1+?iΔx t?i+e t p?1 i=1 其中c t是关于时间t的确定性函数,Δx j=x j?x j?1是x t的差分序列。在实际中,c t可以是常数或者c t=ω0+ω1t。β?1的t?比为

用Apache Spark进行大数据处理——第一部分:入门介绍

用Apache Spark进行大数据处理——第一部分:入门介绍 什么是Spark Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势。 首先,Spark为我们提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。 Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍,甚至能够将应用在磁盘上的运行速度提升10倍。 Spark让开发者可以快速的用Java、Scala或Python编写程序。它本身自带了一个超过80个高阶操作符集合。而且还可以用它在shell中以交互式地查询数据。 除了Map和Reduce操作之外,它还支持SQL查询,流数据,机器学习和图表数据处理。开发者可以在一个数据管道用例中单独使用某一能力或者将这些能力结合在一起使用。 在这个Apache Spark文章系列的第一部分中,我们将了解到什么是Spark,它与典型的MapReduce解决方案的比较以及它如何为大数据处理提供了一套完整的工具。 Hadoop和Spark Hadoop这项大数据处理技术大概已有十年历史,而且被看做是首选的大数据集合处理的解决方案。MapReduce是一路计算的优秀解决方案,不过对于需要多路计算和算法的用例来说,并非十分高效。数据处理流程中的每一步都需要一个Map阶段和一个Reduce阶段,而且如果要利用这一解决方案,需要将所有用例都转换成MapReduce模式。 在下一步开始之前,上一步的作业输出数据必须要存储到分布式文件系统中。因此,复制和磁盘存储会导致这种方式速度变慢。另外Hadoop解决方案中通常会包含难以安装和管理的集群。而且为了处理不同的大数据用例,还需要集成多种不同的工具(如用于机器学习的Mahout和流数据处理的Storm)。 如果想要完成比较复杂的工作,就必须将一系列的MapReduce作业串联起来然后顺序执行这些作业。每一个作业都是高时延的,而且只有在前一个作业完成之后下一个作业才能开始启动。 而Spark则允许程序开发者使用有向无环图(DAG)开发复杂的多步数据管道。而且还支持跨有向无环图的内存数据共享,以便不同的作业可以共同处理同一个数据。

ADF检验和协整检验的区别

特征根迹统计量 (P值)5%临界值λ_max统计量 (P值) 5%临界值原假设 0.786230 43.63(0.02) 40.17 23.14(0.06) 24.16 0个协整向量 0.659057 20.49(0.14) 24.28 16.14(0.09) 17.8 至少1个协整向量0.249925 4.35(0.66) 12.32 4.31(0.58) 11.22 至少2个协整向量0.002389 0.0023(0.88) 4.13 0.036(0.88) 4.13 至少3个协整向量正确的计算以1978年为100的定基指数的方法为: 如果有以上一年为100的GDP指数,如何计算以某固定年份为100的GDP指数? 以北京1978年为100的定基指数计算为例: 第一步: (1)将1978年的GDP指数定义为100,这样,1978年定基指数(1978=100)=100. 第二步:(2)那么1979年的定基(1978=100)就等于当年的同比指数,即 1979年GDP定基指数(1978=100)=1979年GDP指数(以上一年为100) 第三步(最关键):1980年GDP指数(1978=100)=1979年GDP指数(1978=100)*1980年GDP指数(以上一年为100)/100。 第四步:自1981年起重复第三步,即以各上年定基指数(1978=100)分别乘以当年 同比指数(上年=100的指数)再除以100,就依次可以得到所有年份以1978年为100 的定基指数。EXCEL直接复制第三步的公式就可以计算出来。 本文来自: 人大经济论坛数据交流中心版,详细出处参考: 定基指数 编辑 目录 1定基指数与环比指数的关系 2定基指数的分类 3定基指数与环比指数的区别 定基指数即定比指数。定基指数是指在指数数列中,各期指数都以某—固定 时期为基期。定基指数说明现象在较长时期内的发展变化情况。

利用Scala语言开发Spark应用程序

利用Scala语言开发Spark应用程序 park内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情。如果你对Scala语言还不太熟悉,可以阅读网络教程A Scala Tutorial for Java Programmers或者相关Scala书籍进行学习。 AD: Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情。如果你对Scala语言还不太熟悉,可以阅读网络教程A Scala Tutorial for Java Programmers或者相关Scala书籍进行学习。 本文将介绍3个Scala Spark编程实例,分别是WordCount、TopK和SparkJoin,分别代表了Spark 的三种典型应用。 1. WordCount编程实例 WordCount是一个最简单的分布式应用实例,主要功能是统计输入目录中所有单词出现的总次数,编写步骤如下: 步骤1:创建一个SparkContext对象,该对象有四个参数:Spark master位置、应用程序名称,Spark安装目录和jar存放位置,对于Spark On Y ARN而言,最重要的是前两个参数,第一个参数指定为yarn-standalone ,第二个参数是自定义的字符串,举例如下: valsc=newSparkContext(args(0), WordCount ,System.getenv( SPARK_HOME ),Seq(System.getenv( SPARK_TEST_JAR ))) 步骤2:读取输入数据。我们要从HDFS上读取文本数据,可以使用SparkCon valtextFile=sc.textFile(args(1)) 当然,Spark允许你采用任何Hadoop InputFormat,比如二进制输入格式SequenceFileInputFormat,此时你可以使用SparkContext中的hadoopRDD函数,举例如下: valinputFormatClass=classOf[SequenceFileInputFormat[Text,Text]]varhadoopRdd=sc.hadoopRDD(c onf,inputFormatClass,classOf[Text],classOf[Text]) 或者直接创建一个HadoopRDD对象: varhadoopRdd=newHadoopRDD(sc,conf,classOf[SequenceFileInputFormat[Text,Text,classOf[Text],c lassOf[Text]) 步骤3:通过RDD转换算子操作和转换RDD,对于WordCount而言,首先需要从输入数据中每行字符串中解析出单词,水草玛瑙 https://www.360docs.net/doc/bd7512657.html,然后将相同单词放到一个桶中,最后统计每个桶中每个单词出现的频率,举例如下: valresult=hadoopRdd.flatMap{case(key,value)= value.toString().split( \\s+ }.map(word= (word,1)).reduceByKey(_+_) 其中,flatMap函数可以将一条记录转换成多条记录(一对多关系),map函数将一条记录转换为另一条记录(一对一关系),高山茶 https://www.360docs.net/doc/bd7512657.html, reduceByKey函数将key相同的数据划分到一个桶中,并以key为单位分组进行计算,这些函数的具体含义可参考:Spark Transformation。步骤4:将产生的RDD数据集保存到HDFS上。可以使用SparkContext中的saveAsTextFile哈数将数据集保存到HDFS目录下,默认采用Hadoop提供的TextOutputFormat,每条记录以(key,value)的形式打印输出,你也可以采用saveAsSequenceFile函数将数据保存为SequenceFile格式等,举例如下: result.saveAsSequenceFile(args(2)) 当然,一般我们写Spark程序时,需要包含以下两个头文件: importorg.apache.spark._importSparkContext._ WordCount完整程序已在Apache Spark学习:利用Eclipse构建Spark集成开发环境一文中进行了介绍,在次不赘述。 需要注意的是,指定输入输出文件时,需要指定hdfs的URI,比如输入目录是hdfs:hadoop-testtmpinput,输出目录是hdfs:hadoop-testtmpoutput,其中,hdfs:hadoop-test 是由Hadoop配置文件core- site.xml中参数https://www.360docs.net/doc/bd7512657.html,指定的,具体替换成你的配置即可。 2. TopK编程实例

APP开发入门教程

APP开发入门教程 这篇文章主要介绍了Android APP开发入门教程,从SDK下载、开发环境搭建、代码编写、APP打包等步骤一一讲解,非常简明的一个Android APP开发入门教 程,需要的朋友可以参考下 作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择USE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JA V A_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK 包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Android 的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

Android APP开发入门教程_新手必学

Android APP开发入门教程 工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 当然如果你是一个初学者,你如果每天晚上有时间,你可以加企鹅(444—513_089)晚上免费和安卓开发经验丰富的架构师一起学习安卓,并获取之前的高清视频和工具以及源码。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择USE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JA V A_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK 支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Android的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录 即可。

ADF检验

1.3.4 ADF检验 仍以日本人口序列y t为例(数据见3.3)。在工作文件窗口中双击y t序列,从而打开y t数据窗口。点击View键,选择Unit Root Test功能,如下图, 则会弹出一个单位根检验对话框。 其中共有4种选项。(1)检验方法(缺省选择是ADF检验),(2)所检验的序列(缺省选择是对原序列(Level)做单位根检验)。(3)选择不同检验式(缺省选择是检验式中只包括截距项。其他两种选择是检验式中包括趋势项和截距项,检验式中不包括趋势项和截距项。(4)ADF检验式中选择差分项的最大滞后期数。这里做的选择是(1)ADF 检验,(2)对原序列y t做单位根检验,(3)检验式中不包括趋势项和截距项。点击OK 键。得ADF检验结果如下。

相应的检验式是 ?= 0.0041 y t-1 + 0.2197? y t-1 + 0.1366? y t-1 + 0.2159? y t-1 (2.9) (2.4) (1.4) (2.3) DW = 2.05 输出的最上部分给出了检验结果。因为ADF = 2.9283,分别大于不同检验水平的三个临界值,所以日本人口序列y t是一个非平稳序列。在此情形下,应该继续对y t的差分序列进行单位根检验。 在序列y t窗口(即显示单位根检验结果的窗口)中,点击View键,选择Unit Root Test 功能,再次得到单位根检验对话框。这时第二项选择应选1st difference,即检验?y t。第三项选择含截距项,第四项选择滞后2期。

点击OK键。得ADF检验结果如下。 见输出结果的最上部分。因为ADF = 3.5602,分别小于不同检验水平的三个临界值,所以日本人口差分序列? y t是一个平稳序列。因此y t~ (1)。

ios入门(一般)

《iOS(一般)》试卷 得分 一、单选题(每题2分,共计30分) 1.缩放图片经常使用的手势是()() A、UITapGestureRecognizer,点按手势 B、UIPinchGestureRecognizer,捏合手势 C、UIRotationGestureRecognizer,旋转手势 D、UISwipeGestureRecognizer,轻扫手势 2.如果要进入编辑模式,需要调用()方法实现。() A、setEditing:animated B、tableView:editingStyleForRowAtIndexPath: C、tableView:commmitEditingStyle:forRowAtIndexPath: D、tableView:canMoveRowAtIndexPath: 3.下列选项中,不能够接收并处理事件的是()() A、UIApplication B、UIViewController C、UIView D、NSObject 4.下列选项中,用于设置当前显示的是哪一页的是() A、currentPage B、pageIndicatorTintColor C、numberOfPages D、currentPageIndicatorTintColor 5.下列选项中,用于表示文本字符串的字段类型是()() A、REAL B、INTEGER C、BLOB D、TEXT 6.下列方法中,用于为表视图添加索引的是()() A、tableView:editingStyleForRowAtIndexPath: B、sectionIndexTitlesForTableView C、tableView:commmitEditingStyle:forRowAtIndexPath: D、tableView:moveRowAtIndexPath:toIndexPath: 7.下列选项中,哪个属性可以设置视图的位置和尺寸()() A、bounds B、center C、transform D、tag 8.如果数据库不再使用,可通过()函数来关闭。() 总分题号一二三四五题分 得分

相关文档
最新文档