ArcGIS Engine开发中数据库的加载

1、加载个人地理数据库数据

个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据的存储和管理,它将不同的数据统一纳入Access文件中,便于数据的管理与迁移,容量限制为2GB。个人地理数据库支持单用户编辑,不支持版本管理。在进行ArcGIS软件操作和开发的学习过程中,一般建议采用个人地理数据库进行数据的 组织和存储,同时也便于直接导到ArcSDE空间数据库中。加载个人地理数据库的用到的接口为:IFeatureDataset、IEnumDataset。

1.IFeatureDataset接口:继承自IDataset接口,在其基础上增加一个 创建要素类的功能CreateFeatureClass。

2.IEnumDataset接口:用于访问个人地理数据库中的所有数据集成员,有Reset和Next两个方法。Reset方法重置数据集序列,使指针位于第一个数据集之前;Next方法获取枚举序列的 下一个数据集。

实现的思路:

1)床架AccessWorkspaceFactory类的实例。

2)用IWorkspaceFactory接口的OpenFromFile方法打开.mdb数据集的工作空间,对工作空间里面的数据进行加载。

代码1:对加载数据库的方法进行函数封装

 #region
//封装加载空间数据库方法:AddAllDataset函数,以便对其他空间数据库加载时直接调用。
private void AddAllDataset(IWorkspace pWorkspace, AxMapControl mapControl)
{
IEnumDataset pEnumDataset = pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
pEnumDataset.Reset();
//将Enum数据集集中的数据一个一个地读到dataset 中
IDataset pDataset = pEnumDataset.Next();
//判断数据集是否有数据
while (pDataset != null)
{
if (pDataset is IFeatureDataset)//要素数据集
{
IFeatureWorkspace pFeatureWorkspac = (IFeatureWorkspace)pWorkspace;
IFeatureDataset pFeatureDataset = pFeatureWorkspac.OpenFeatureDataset(pDataset.Name);
IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
pEnumDataset1.Reset();
IGroupLayer pGroupLayer = new GroupLayerClass();
pGroupLayer.Name = pFeatureDataset.Name;
IDataset pDataset1 = pEnumDataset1.Next();
while (pDataset1 != null)
{
if (pDataset1 is IFeatureClass)//要素类
{
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspac.OpenFeatureClass(pDataset1.Name);
if (pFeatureLayer.FeatureClass != null)
{
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
pGroupLayer.Add(pFeatureLayer);
mapControl.Map.AddLayer(pFeatureLayer);
}
}
pDataset1 = pEnumDataset1.Next();
}
}
else if (pDataset is IFeatureClass)//要素类
{
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
mapControl.Map.AddLayer(pFeatureLayer);
}
else if (pDataset is IRasterDataset)//栅格数据
{
IRasterWorkspaceEx pRasterWorkspace = (IRasterWorkspaceEx)pWorkspace;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pDataset.Name);
//影像金字塔的判断和创建
IRasterPyramid3 pRasterPyramid;
pRasterPyramid = pRasterDataset as IRasterPyramid3;
if (pRasterPyramid != null)
{
if (!(pRasterPyramid.Present))
{
pRasterPyramid.Create();//创建金字塔
}
}
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);
ILayer pLayer = pRasterLayer as ILayer;//进行继承
mapControl.AddLayer(pLayer, );
}
pDataset = pEnumDataset.Next();
}
mapControl.ActiveView.Refresh();
//同步鹰眼
// SynchronizeEagleEye();
}
#endregion

代码2:调用个人地理数据库

  ////加载个人地理数据库
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog .Title ="打开PersonGeoDatabase文件";
pOpenFileDialog.Filter = "Personal GeoDatabase(*.mdb)|*.mdb";
pOpenFileDialog.ShowDialog();
string pFullPath = pOpenFileDialog.FileName;
if (pFullPath == "") return;
AccessWorkspaceFactory pAccessWorkspaceFactory = new AccessWorkspaceFactoryClass();
//获取工作空间
IWorkspace pWorkspace = pAccessWorkspaceFactory.OpenFromFile(pFullPath ,);
ClearAllData();
AddAllDataset(pWorkspace,mainMapControl );

2.加载文件地理数据库

文件地理数据库(File GeoDatabase)是以文件夹形式存储各种类型的GIS数据集,可以存储查询和管理空间数据和非空间数据,支持地理数据库的大小为1TB,在不使用数据库管理系统的情况下能够扩展并存储大量的数据,是继个人地理数据库之后esr推出的新的数据管理系统。文件地理数据库支持单用户编辑,不支版本管理。

实现的思路:

1)由于文件地理数据库是以文件夹的形式存在的,因此可以使用FolderBrowserDialog选择文件夹进行加载。首先创建FileGDBWorkspaceFactoryClass类的实例。

2)使用IWorkspaceFactory接口的OpenFromFile方法打开文件地理数据库的工作空间,对工作空间中的文件夹进行加载。

////加载文件地理数据库数据
FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
if(dlg.ShowDialog ()!=DialogResult .OK ) return ;
string pFullth=dlg.SelectedPath ;
if(pFullth =="") return ;
//使用esri.arcgis.DataSourseGDB
FileGDBWorkspaceFactory pFileGDBWorkspaceFactory=new FileGDBWorkspaceFactoryClass();
ClearAllData ();
//获取工作空间
IWorkspace pWorkspac=pFileGDBWorkspaceFactory .OpenFromFile (pFullth ,);
AddAllDataset (pWorkspac,mainMapControl);

3.加载ARCSDE空间数据库数据

ArSDE(Spatial Database Engine空间数据库引擎)是在现有的关型数据库上进行的空间扩展,它使空间数据能保存在关系数据库中(如oracle,sqlserver中)ArcSDE空间数据库的一个重要的特点就是支持多用户并发操作,并且可以通过版本来表现空间数据编辑的状态。当完成数据编辑后,可将多人的编辑状态进行版版本合并,若多个用户对同一个要素进行了编辑,且编辑的状态不一样,将会出现“版本冲突”,提示用户采用哪一版本的数据。版本最后确定取决于用户对于数据管理的权限。

1、ArcSDE的组成

由ArcSDE服务管理进程、专用服务器进程、ArcSDE客户端三部分组成。

ArcSDE服务器管理进程负责维护ArcSDE和监听来自客户端的链接请求。ARCSDE启动就是ArcSDE服务器管理进程,利用管理员账户管理ArcSDE与RDBMS的连接,处理客户端的连接请求。

专用服务器进程由ArcSDE服务器管理进程创建,用于每一个特定的客户端应用程序与数据库的连接。

ArcSDE客户端通过ArcSDE服务器管理进程和专用服务器进程建立和RDBMS的连接,实现对数据库的操作。

、ArcSDE数据库的连接方式

ArcSDE提供了应用服务器连接和直接连接两种连接方式。当服务器性能较好时可采用应用服务器连接,否则采用直接连接,为了减轻服务器的压力,建议采用直接连接的方式进行连接。

应用服务器连接和直接连接的主要区别是属性参数的设置不同:

1)应用服务器连接参数的设置

服务器(Server):SDE服务器的主机名称。

数据库实例(Instance):安装SDE时选择的端口,默认为5151或esri_sde。

数据库(DataBase).根据不同的DBMS决定是否填写。Oracle系列不用填,而SQlServer需要填写。

用户名(Usename):需要填写

密码(Password):需要填写。

2)直接连接的参数设置

服务器(Server):不用填写

数据库实例(Instance):SDE数据类型,例如:如果是Oracle 11g,则为SDE:Oracle:11g:Orcl。其中orcl为数据库的服务名。

数据库(Database):根据不同的DBMS决定是否填写。

用户名(Username):需要填写

密码(password):需要填写

3)两种连接方式的异同

直接连接就是通过ArcSDE访问数据库,并在本地完成对数据库的各种操作(如空间分析、编辑等):而应用服务器连接就是通过ARCSDE访问数据表后,在服务器端完成对数据的各种操作,再把操作结果返回客户端。因此,即便服务器上SDE服务没有启动,采用直接连接的方式也可以直接访问和操作SED数据库,而应用服务器连接只有在SDE服务器启动后才能访问和操作SDE数据库。

SDE 数据库的加载主要用到IPropertySet接口。属性几何(PropertySet)对象是一个专门用于设置属性的对象,它是一种【名称】——【值】对应的集合,类似于哈希表或字典。

4)实例程序的思路:

① 创建SdeWorkspaceFactoryClas类的实例。

②通过SDE连接的连接属性打开SDE数据库的工作空间,对工作空间里面的数据进行加载。

 private void btnFileDatabase_ItemClick(object sender, ItemClickEventArgs e)
{
////加载文件地理数据库数据
FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
if (dlg.ShowDialog() != DialogResult.OK) return;
string pFullth = dlg.SelectedPath;
if (pFullth == "") return;
//使用esri.arcgis.DataSourseGDB
FileGDBWorkspaceFactory pFileGDBWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
ClearAllData();
//获取工作空间
IWorkspace pWorkspac = pFileGDBWorkspaceFactory.OpenFromFile(pFullth, );
AddAllDataset(pWorkspac, mainMapControl);
}
/// <summary>
/// 服务器连接,以Oracle数据库为例
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnaddSDEByServer_ItemClick(object sender, ItemClickEventArgs e)
{
IWorkspace pWorkspace;
pWorkspace = arcSDEWorkspaceOpen("192.168.70.110", "esri_sde", "sde", "sde", "", "SDE.DEFAULT");//调用定义的函数 }
/// <summary>
/// 定义函数arcSDEWorkspaceOpen(),用于连接数据库
/// </summary>
/// <returns></returns> private IWorkspace arcSDEWorkspaceOpen(string server, string instance, string user, string password, string database, string version)
{
IWorkspace pWorkSpace = null;
//创建和实例化数据集
IPropertySet pPropertySet = new PropertySetClass();
pPropertySet.SetProperty("SERVER", server);
pPropertySet.SetProperty("SERVER", server);
pPropertySet.SetProperty("INSTANCE", instance);
pPropertySet.SetProperty("USER", user);
pPropertySet.SetProperty("PASSWORD", password);
pPropertySet.SetProperty("DATABASE", database);
pPropertySet.SetProperty("VERSION", version);
IWorkspaceFactory2 pWorkspaceFactory = new SdeWorkspaceFactoryClass(); try
{
pWorkSpace = pWorkspaceFactory.Open(pPropertySet, );
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return pWorkSpace;
}
/// <summary>
/// 直接连接数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnaddSDEByDriect_ItemClick(object sender, ItemClickEventArgs e)
{
IWorkspace pWorkspace;
pWorkspace = arcSDEWorkspaceOpen("", "sde:oracle11g:orcl", "sde", "sde", "", "SDE.DEFAULT");
//如果工作空间不为空,则进行加载
if (pWorkspace != null)
{
AddAllDataset(pWorkspace, mainMapControl);
} }

四、加载文本文件数据

野外测量的数据是GIS数据的一个主要来源,如GPS、全站仪等仪器测量的数据等,这类数据通常为含有X/Y坐标的Excel文件或者文本文件。

实现的思路:

1)根据Excel或者.txt文件等获取点的坐标信息。

2)根据点的坐标创建ShapeFile图层。

3)加载该shapefile图层。

具体代码:

         /// <summary>
/// 进行函数的声明,调用AxControl控件
/// </summary>
/// 定义函数,并返回值
private AxMapControl buddyMap;
public AxMapControl BuddyMap
{
get { return buddyMap; }
set { buddyMap = value; }
} /// <summary>
/// 创建一个点结构,进行点信息的存储
/// </summary>
struct CPoint
{
public string Name;
public double X;
public double Y;
}
/// <summary>
/// 定义全局变量的数组pColumns用来存储点数据
/// </summary>
List<string> pColumns = new List<string>(); public FormAddtxtData()
{
InitializeComponent();
} private void FormAddtxtData_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 打开文本格式文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.Title = "打开测量数据文件";
pOpenFileDialog.Filter = "测量坐标文件(*.txt)|*.txt";
if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
{
txtSource.Text = pOpenFileDialog.FileName;//获取显示文件名
}
}
/// <summary>
/// 将文本格式保存成shape格式,调用刺痛保存文本的函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
{
SaveFileDialog pSaveFileDialog = new SaveFileDialog();
pSaveFileDialog.Filter = "Shape 文件(*.shp)|*.shp";
if (File.Exists(txtSource.Text))
{
pSaveFileDialog.FileName = System.IO.Path.GetFileNameWithoutExtension(txtSource.Text);//返回不具有返回值的指定路径的文件名
}
if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
{
txtSave.Text = pSaveFileDialog.FileName;
} }
/// <summary>
/// 创建并实例化一个CPoint类型的数组,将所有的点信息进行 存储
/// </summary>
/// <param name="surveyDataFullName"></param>
/// <returns></returns>
private List<CPoint> GetPoints(string surveyDataFullName)
{
try
{
List<CPoint> pList = new List<CPoint>();
char[] charArray = new char[] { ',', ' ', '\t' }; //常用的分隔符为逗号、空格、制位符
//文本信息读取
FileStream fs = new FileStream(surveyDataFullName, FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string strLine = sr.ReadLine();
if (strLine != null)
{
string[] strArray = strLine.Split(charArray);
if (strArray.Length > )
{
for (int i = ; i < strArray.Length; i++)
{
pColumns.Add(strArray[i]);
}
} while ((strLine= sr.ReadLine())!=null)
{
//点信息的读取
strArray = strLine.Split(charArray);
CPoint pCPoint = new CPoint();
pCPoint.Name = strArray[].Trim();
pCPoint.X = Convert.ToDouble(strArray[]);
pCPoint.Y = Convert.ToDouble(strArray[]); pList.Add(pCPoint);
}
}
else
{
return null;
}
sr.Close();
return pList;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
/// <summary>
/// 封装函数,根据点坐标进行创建shapefile图层
/// </summary>
/// <param name="cPointList"></param>
/// <param name="filePath"></param>
/// <returns></returns>
private IFeatureLayer CreateShpFromPoints(List<CPoint> cPointList, string filePath)
{
int index = filePath.LastIndexOf('\\');
string folder = filePath.Substring(, index);
string shapeName = filePath.Substring(index + );
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFWS = (IFeatureWorkspace)pWSF.OpenFromFile(folder, ); IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit;
pFieldsEdit = (IFieldsEdit)pFields; IField pField = new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDef pGeometryDef = new GeometryDefClass();
IGeometryDefEdit pGDefEdit = (IGeometryDefEdit)pGeometryDef;
pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
//定义坐标系
ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
ISpatialReference pSpatialReference = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
pGDefEdit.SpatialReference_2 = pSpatialReference; pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField); IFeatureClass pFeatureClass;
pFeatureClass = pFWS.CreateFeatureClass(shapeName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IPoint pPoint = new PointClass();
for (int j = ; j < cPointList.Count; j++)
{
pPoint.X = cPointList[j].X;
pPoint.Y = cPointList[j].Y; IFeature pFeature = pFeatureClass.CreateFeature();
pFeature.Shape = pPoint;
pFeature.Store();
} IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.Name = shapeName;
pFeatureLayer.FeatureClass = pFeatureClass;
return pFeatureLayer;
}
/// <summary>
/// 定义一个函数进行验证数据和存储位置是否有效
/// </summary>
/// <returns></returns>
private bool ValidateTxtbox()
{
if (txtSource.Text == "" || !File.Exists(txtSource.Text))
{
MessageBox.Show("测量数据无效,请重新选择!", "提示", MessageBoxButtons.OK);
return false;
}
if (txtSave.Text == "" || System.IO.Path.GetExtension(txtSave.Text).ToLower() != ".shp")
{
MessageBox.Show("保存路径无效,请重新选择!", "提示", MessageBoxButtons.OK);
return false;
}
return true;
}
/// <summary>
/// 调用函数,将生成的shape文件加载到mapControl中
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCreat_Click(object sender, EventArgs e)
{
if (ValidateTxtbox())
{
List<CPoint> pCPointList = GetPoints(txtSource.Text);
if (pCPointList == null)
{
MessageBox.Show("所选择的文件为空,请重新选择!");
}
else
{
//实例化要素图层,进行添加
IFeatureLayer pFeatureLayer = CreateShpFromPoints(pCPointList, txtSave.Text);//传入实参数据
buddyMap.Map.AddLayer(pFeatureLayer);
this.Close();
}
} } private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
}

总结: 由上述ArcGIS Engine加载几种常用的数据源的方法,可以看出ArcGIS Engine加载空间数据一般具有以下的五个步骤:

1)创建数据对应的工作空间工厂(WorkspaceFactory)。

2)使用WorkspaceFactory创建要加载数据的工作空间Workspace。

3)使用Workspace打开并得到图层的数据集。

4)强Dataset赋值给新建图层的数据源。

5)添加图层到MapControl中进行显示。

ArcGIS Engine开发之地图基本操作(4)的更多相关文章

  1. ArcGIS Engine开发之地图基本操作(3)

    地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...

  2. ArcGIS Engine开发之地图基本操作(2)

    地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多 ...

  3. ArcGIS Engine开发之地图基本操作(1)

    ArcGIS提供的各类数据形式以及相应接口 1. 空间数据 在GIS软件中,空间数据有多种不同的形式存在.按照不同的划分标准可以分为矢量数据和栅格数据.GIS格式数据和非GIS格式数据(CAD格式). ...

  4. ArcGIS Engine开发之地图浏览

    地图的浏览功能包括缩放.移动.量测旋转等. 1.放大与缩小 无论是放大还是缩小,都是通过改变MapControl中当前视图的范围Extent属性来实现的,主要用到包络线(Envelope)类. 包络线 ...

  5. ArcGIS Engine开发之地图导出

    关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...

  6. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  7. C#,ArcGIS Engine开发入门教程

    C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674  目录(?)[+] 五实现 一 加载A ...

  8. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  9. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

随机推荐

  1. grunt配置任务

    这个指南解释了如何使用 Gruntfile 来为你的项目配置task.如果你还不知道 Gruntfile 是什么,请先阅读 快速入门 指南并看看这个Gruntfile 实例. Grunt配置 Grun ...

  2. Hadoop3 在eclipse中访问hadoop并运行WordCount实例

    前言:       毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环 ...

  3. ABP(现代ASP.NET样板开发框架)系列之21、ABP展现层——Javascript函数库

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project ...

  4. MyBatis在insert插入操作时返回主键ID的配置

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过Mapper.XML配置的方式来完成这个功能. 在 INSER ...

  5. The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files.

    参照 http://stackoverflow.com/questions/24301986/the-type-java-lang-charsequence-cannot-be-resolved-in ...

  6. CentOS 搭建openVPN

    1.安装前准备 # 关闭selinux setenforce 0 sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config # 安装open ...

  7. Android 学习资源

    下面这些资源对Android开发来说是很有帮助的! 最常用的: Android开发官方网站:http://developer.android.com/index.html 这个网站应该是Android ...

  8. 移动端HTML5音频与视频问题及解决方案

    最近在研究用视频代替动画,用视频代替精灵动画,我们称这种视频叫做交互视频. 传统的精灵动画: 磁盘空间大,下载慢,尤其是在线播放,会更慢 文件太多,在线播放的时候,太多http请求,会导致响应慢,或者 ...

  9. ashx中Response.ContentType的常用类型

    ashx中Response.ContentType的常用类型: text/plaintext/htmltext/xmlapplication/jsonimage/GIFapplication/x-cd ...

  10. 举个栗子学习JavaScript设计模式

    目录 前言 创建型模式 单例模式 构造器+原型 简单工厂模式 工厂模式 创建型模式比较 结构性模式 模块模式 外观模式 混入模式 装饰模式 适配模式 行为型模式 观察者模式 中介者模式 命令模式 责任 ...