一些体会,收获
Dec 29
Dec 9

1.二级域名

HTML code 
<%@ Page Language="C#"%>
<%
HttpCookie hc = new HttpCookie("OutByTopDomain", "OutByTopDomain" + DateTime.Now.ToString());
hc.Expires = DateTime.Now.AddDays(30);//过期时间为30天
hc.Domain = "你的顶级域名";//设置共享域,如aa.com,bb.aa.com等,可以设置为aa.com,这样可以在子域共享
Response.Cookies.Add(hc);
%>
subdomain.aspx,子域读cookie

HTML code 
<%@ Page Language="C#"%>
<%
Response.Write("顶级域名产生的Cookie==|" + Response.Cookies["OutByTopDomain"].Value + "|===");
%>


2.sso方案


 通过设置p3p头来实现跨域访问cookie

今天在w3网站上看到了一篇介绍p3p的文章(http://www.w3.org/TR/P3P/),利用这个可以实现跨域访问cookie,我也试验一下。 其实很简单:试验用了2个域名readlog.cn和diaor.com 首先在readlog.cn下放置一个文件setcookie.php 内容:  PHP代码 header(’P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND

 PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"’);//p3p   setcookie("TestCookie","test",time()+3600,"/",".readlog.cn");//设置cookie  再放置一个readcookie.php 内容: 然后在diaor.com下放置setcookie.php ,内容: JavaScript代码 1. <script xsrc="http://www.readlog.cn/setcookie.php"></script>  然后访问http://www.diaor.com/setcookie.php 抓取数据包可以发现,在readlog.cn域下生成了一个cookie ,名称是TestCookie,值是test 下面访问http://www.readlog.cn/readcookie.php 来验证一下,可以发现,cookie确实设置成功了。 有兴趣可以去掉header(’P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IN

D PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"’);这句,试一下就会发现cookie能设置,但是在readlog.cn读不到这个cookie。

------IIS 通用设置

打开IIS

 

管理工具——〉选择一个网站——〉属性——〉http头,增加一个http头
然后输入头名:P3P

输入头内容:CP=CAO PSA OUR

------HttpModual实现

可以用httpmodual来实现在全部页面或者部分页面头部插入所需要的标志

------老外的解决方案

http://articles.sitepoint.com/article/p3p-cookies-ie6/2

-----P3P设置验证

http://www.w3.org/P3P/validator.html

利用js解决ajax跨域问题

由于安全性问题, ajax在进行请求数据时,不能跨域请求. 比如 在 http://www.a.com/ 下的页面, 无法ajax请求www.b.com/ajax.php的内容. 尽管这样的需求不多,但遇到了怎么办? 这里给出一个JS模拟ajax的方式实现跨域, 但仅仅局限于GET!

在 <script> 标签中, src的属性是可以设置非本域下的地址的. 借助此特点,即可模拟ajax的方式实现跨域. 假设 http://www.a.com/ 域名下的程序 需要通过ajax方式提交数据到http://www.b.com/ 下的login.php?username=*&passwod=*实现登陆判断. 实现方式如下: 在http://www.a.com/内动态创建JS的方式来加载http://www.b.com/的内容,代码如下

JavaScript代码
//此代码在http://www.a.com/下    
var head = document.getElementsByTagName("head")[0];        
var js = document.createElement("script");        
js.src = "http://www.b.com/login.php?username=*&passwod=*";        
js.onload = js.onreadystatechange = function()        
{        
    if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")        
    {    
         head.removeChild(js);    
         //JS加载完毕了. 类似于ajax请求完成.    
         //执行是否登陆成功的判断    
    }        
}        
head.appendChild(js);   
这只是一个简单的例子,需要b.com下的login.php做好配合,login.php通过GET取得传入值,并生成JS的登陆标记. JS加载完成后,根据JS标记判断登陆的状态,提示登陆成功或失败.即可完成要求,代码兼容常见浏览器. :)

当然缺陷也很明显,只能支持GET的方式提交数据. 下一次我会在说说ajax跨域POST的方法.

                                           用JS或jQuery访问页面内的iframe,兼容IE/FF

js或者jQuery访问页面中的框架也就是iframe. 注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.html 文件内含有一个iframe:

XML/HTML代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml">   
<head>   
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />   
<title>页面首页</title>   
</head>   
   
<body>   
<iframe xsrc="iframe.html" id="koyoz" height="0" width="0"></iframe>   
</body>   
</html>   
iframe.html 内容:

XML/HTML代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml">   
<head>   
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />   
<title>iframe.html</title>   
</head>   
   
<body>   
<div id="test">www.koyoz.com</div>   
</body>   
</html>   
1. 在index.html执行JS直接访问:

JavaScript代码
document.getElementById('koyoz').contentWindow.document.getElementById('test').style.color='red'   
通过在index.html访问ID名为'koyoz'的iframe页面,并取得此iframe页面内的ID为'test'的对象,并将其颜色设置为红色.

此代码已经测试通过,能支持IE/firefox . 2. 在index.html里面借助jQuery访问:

JavaScript代码
$("#koyoz").contents().find("#test").css('color','red');  

Jul 14

在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下:

Flex中的复制同java一样,也分为深复制和浅复制下面总结一下ArrayCollection的浅复制,共有4种方法:

1、var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

2、var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

3、var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

4、var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

以上方法中,第一种方法由于不是创建的独立的ArrayCollection对象,所以不推荐使用。第二、三、四种方法相似,可以参考使用。

有的时候,我们也会用到深复制,方法如下:

var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

this.clone()方法定义如下:

function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}

下面是我测试以上程序的Flex程序代码,大家可以参考:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()" layout="absolute">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.collections.ListCollectionView;
import mx.controls.Alert;
import flash.utils.ByteArray;


public function initApp():void
{
}


//开始测试:
//浅复制1
private function test1():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}
//浅复制2
private function test2():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//浅复制3
private function test3():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//浅复制4
private function test4():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//深复制
private function test5():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//深复制调用的方法
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
]]>
</mx:Script>
<mx:Button label="第一种浅复制方法" click="test1()" x="61" y="36"/>
<mx:Button label="第二种浅复制方法" click="test2()" y="57" x="61" width="114"/>
<mx:Button label="第三种浅复制方法" click="test3()" y="78" x="61" width="114"/>
<mx:Button label="第四种浅复制方法" click="test4()" y="98" x="61" width="114"/>

<mx:Button label="深复制方法" click="test5()" y="147" x="61"/>
</mx:Application>



删除


<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()"

backgroundGradientColors="[#ffffff, #ffffff]" >

<mx:Script>

<![CDATA[

import mx.collections.ArrayCollection;

[Bindable]

public var ac:ArrayCollection=new ArrayCollection([

{name:"1",sex:"男",age:"11"},

{name:"2",sex:"女",age:"12"},

{name:"3",sex:"女",age:"14"},

{name:"4",sex:"女",age:"15"},

{name:"5",sex:"男",age:"16"},

{name:"6",sex:"男",age:"13"}

]);

public function init():void{

for(var i:int=0;i<ac.length;i++){

var item:Object=ac.getItemAt(i);

if(item.sex=="女"){

ac.removeItemAt(i);

}

}

}

]]>

</mx:Script>

<mx:DataGrid width="100%" dataProvider="{ac}">

<mx:columns>

<mx:DataGridColumn dataField="name" width="100" headerText="ID"/>

<mx:DataGridColumn dataField="sex" width="100" headerText="性别"/>

<mx:DataGridColumn dataField="age" width="100" headerText="年龄"/>

</mx:columns>

</mx:DataGrid>

</mx:Application>




Jun 30
ArcGIS Server Flex API调用GP服务的一般步骤

1、说明

ArcGIS Geoprocessing提供了大量地理处理和分析工具,可根据需要对这些工具进行组合构造自己的GIS分析模型,然后发布成GP服务,以方便各种Web客户端调用。Flex API中提供了访问GP服务的接口,通过该接口和GP工具,可实现具有高级GIS分析功能的Web应用。

2、模型创建与测试

创建模型可在modelbuilder可视化环境下进行,也可使用Python脚本定义。模型创建完成需要在ArcMap环境下测试是否正常运行。

详细建模过程请参考ArcGIS的帮助文档。

3GP服务发布

发布GP服务可使用两种资源类型:GP工具;包含结果图层的MXD文档。其中包含结果图层的MXD文档发布成GP服务时又有两种选择:一种只发布为GP服务;另一种发布成MapServiceGP服务。第二种方式可预先在MXD文档中对结果图层渲染,这样可简化客户端的可视化工作。实际项目中选择使用哪一种方式,需要根据具体业务需要确定,不能一概而论。

4GP服务测试

1)在ArcMap中加载MapService

注意为方便测试,该MapService不能使用发布GP服务时一同发布出来的MapService

2)在ArcToolbox中添加GP服务

将发布的GP服务添加到ArcToolbox中,点击运行,生成的结果会自动添加到当前的地图中。

5ArcGIS Server Flex API调用GP服务示例

上面几小节简单的介绍了GP工具的制作和GP服务的发布,本小节正式进入正题,讲讲如何使用ArcGIS Server Flex API调用GP服务。

GP服务分同步和异步两种执行模式,Flex API也提供了两种处理方式与之对应。Flex API调用GP服务使用的是Geoprocessor类。该类提供了execute(params)submitJob(params)两个方法调用后台的GP服务进行数据处理,其中execute(params)对应的是同步执行模式,执行完成触发executeComplete事件。submitJob(params)对应的是异步执行模式,执行完成触发jobComplete事件。对GP服务结果的处理我们可以定义在这些complete事件中。如果GP服务处理过程比较简单而且耗费时间少,我们可以选择同步执行模式,但如果比较耗时,为避免客户端长时间等待,常使用异步执行模式。

为保证Flex API正常调用GP服务,在GP模型定义和GP服务发布过程需要,还需要注意以下几项:

1)在配置MXD文档时,设置临时工作空间

MXD中添加完GP工具后,如果未设置临时工作空间,则运行GP工具生成的结果将默认保存在C盘下,该路径会导致GP服务无法读取结果图层,可通过设置临时工作空间解决。设置方法:在ArcToolbox上右键选择Environment,设置scratchworkspace的路径即可。

2GP工具输出路径的处理

为方便访问输出图层,一般情况下使用环境变量来指定输出路径,即使用scratchworkspace变量,该变量指向ArcGIS Serverarcgisjobs目录。例如:%scratchworkspace%\idwraster

3)输出图层中文字符处理

如果GP工具中输出的图层名包含中文,需要更改为英文名称,否则添加到地图上的结果图层无法正常显示。

本示例以生成等值面为例,数据使用ArcGIS自带的World地图,软件环境使用ArcGIS Server9.3.1ArcGIS for Flex API 1.3版本。示例代码如下:

1)发布服务

将包含GP工具的MXD文档发布成同名的地图服务和GP服务。

2Flex调用GP服务

<mx:Script>
<![CDATA[
import mx.controls.Alert;
import com.esri.ags.events.*;
import com.esri.ags.tasks.*;
import com.esri.ags.layers.*;

private function gpJobCompleteHandler(event:GeoprocessorEvent):void
{

var imageParameters : ImageParameters = new ImageParameters();
var myImageLayer2 :GPResultImageLayer = gp.getResultImageLayer(event.jobInfo.jobId,"dzhm",imageParameters);
//dzhm参数为GP工具中定义的输出文件名
baseLayer.visible = false;
map1.addLayer(myImageLayer2,0);

Alert.show("job:"+event.jobInfo.jobId);
}
]]>
</mx:Script>

<esri:Geoprocessor id="gp" url="http://xinli:8399/arcgis/rest/services/test/world_gdb/GPServer/IDW"
jobComplete="gpJobCompleteHandler(event)">
<esri:fault>
<![CDATA[
Alert.show(event.fault.message);
]]>
</esri:fault>
</esri:Geoprocessor>
<mx:Button x="10" y="10" label="执行">
<mx:click>
<![CDATA[
var params:Object = {};
gp.submitJob(params);
]]>
</mx:click>
</mx:Button>
<esri:Map id="map1" width="100%" height="100%">
<esri:ArcGISDynamicMapServiceLayer id="baseLayer" url="http://xinli:8399/arcgis/rest/services/test/world_gdb/MapServer"/>
</esri:Map>
May 19

decode

 

 

在Oracle/PLSQL中,  decode 具有和 IF-THEN-ELSE 一样的功能。

decode 函数语法如下:

decode( expression , search , result [, search , result]... [, default] )

expression 要比较的表达式.

 

search 要与expression 比较的字段。.

 

result 如果expression 与search 一样的话,返回该结果。.

default 此参数可选,如果没有与expression 匹配上的search . 就返回此结果,如果此参数没有设置,当没有与expression匹配上的search时,返回null。

search 和 result可成对出现多次,代表各种要匹配的情况。 
 

应用于

  • Oracle 9i, Oracle 10g, Oracle 11g

判断数据正负然后统计 

sum(DECODE(SIGN(INTENS-0), 1, 1, 0) ) as zINTENS,sum(DECODE(SIGN(INTENS-0), -1, 1, 0) ) as fINTENS
分页: 1/11 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]