posts - 6,comments - 0,trackbacks - 0

关键字: spatial oracle

转载:老鼠嘴里的大米http://blog.sina.com.cn/fatway

一、Oracle Spatial简介

    Oracle 支持自定义的数据类型,可以用数组,结构体或者带有构造函数,功能函数的类来定义自己的对象类型。这样的对象类型可以用于属性列的数据类型,也可以用来创建对象表。而Oracle Spatial也正是基于此种特性所开发的一套空间数据处理系统。
    Spatial 的自定义数据类型有很多,全部在MDSYS方案下,经常使用到的是SDO_GEOMETRY类型。SDO_GEOMETRY表示一个几何对象,可以是点、线、面、多点、多线、多面或混合对象。
    Spatial 在此数据类型的基础上,实现了R树空间索引和四叉树空间索引,还以SQL函数的形式实现了多种空间分析功能。

 


二、测试表的建立与应用(点类型)

 

-- 创建测试用表
CREATE TABLE "SPATIALTEST" (
 "ID" VARCHAR2(20) NOT NULL,
 "NAME" VARCHAR2(100),
 "ADDRESS" VARCHAR2(200),
 "TELEPHONE" VARCHAR2(50),
 "LOCATION" "MDSYS"."SDO_GEOMETRY"
)LOGGING;

 

-- 创建主键约束
ALTER TABLE "SPATIALTEST"
 ADD CONSTRAINT "PK_SPATIAL" PRIMARY KEY("ID");

 

-- 根据用户表填写空间元数据
INSERT INTO USER_SDO_GEOM_METADATA
  VALUES(
  'SPATIALTEST',
  'location',
  MDSYS.SDO_DIM_ARRAY(
   MDSYS.SDO_DIM_ELEMENT('Longitude',-180,180,10),
   MDSYS.SDO_DIM_ELEMENT('Latitude',-90,90,10)
  ),
  8307
 );

 

-- 建立空间索引
CREATE INDEX SPATIAL_IDX
 ON SPATIALTEST(location)
 INDEXTYPE IS MDSYS.SPATIAL_INDEX;

 

-- 导入测试数据
INSERT INTO "SPATIALTEST"
 VALUES(
  'dbeb7ea11eaf2b53a9b7',
  '小肥羊(天河店)',
  '广州市天河区天寿路25号',
  '020-38217746',
  MDSYS.SDO_GEOMETRY(
   2001,
   8307,
   MDSYS.SDO_POINT_TYPE(113.3293658, 23.14338586, 0),
   NULL,
   NULL
  )
 );


INSERT INTO "SPATIALTEST"
 VALUES(
  'ef8393ef6273a72b2f70',
  '山东老家',
  '广州市越秀区合群一马路43号',
  '020-87778983',
  MDSYS.SDO_GEOMETRY(
   2001,
   8307,
   MDSYS.SDO_POINT_TYPE(113.2932474, 23.11883515, 0),
   NULL,
   NULL
  )
 );

 

--其他

INSERT INTO cola_markets VALUES(
 2,
 'cola_b',
 MDSYS.SDO_GEOMETRY(
  2003,  -- 2-dimensional polygon
  NULL,
  NULL,
  MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)
  MDSYS.SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1)
 )
);

 

-- 属性信息查询
SQL> select location from spatialtest;

LOCATION(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(113.329366, 23.1433859, 0), NULL, NULL)

SQL> select s.location.SDO_POINT.x langtitude from spatialtest s;

LANGTITUDE
----------
113.329366

 

-- 空间分析查询(113.2359818,23.16937253)周边十公里信息5条
SELECT
  B.id id, B.name name, B.dist dist
FROM (
  SELECT
    A.id id, A.name name, SDO_GEOM.SDO_DISTANCE(A.location,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.2359818,23.16937253,0),NULL,NULL),1) dist
  FROM
    spatialtest A
  WHERE
    SDO_WITHIN_DISTANCE(A.LOCATION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.2359818,23.16937253,0),NULL,NULL),'distance=10000') = 'TRUE'
  ORDER BY A.name
  ) B
WHERE
  ROWNUM <= 5
;

 

-- 空间分析查询(113.2359818,23.16937253)附近的5条信息
SELECT
  A.id id, A.name name,A.location.SDO_POINT.x langtitude, A.location.SDO_POINT.y latitude,MDSYS.SDO_NN_DISTANCE(1) distance
FROM
  spatialtest A
WHERE
  SDO_NN(A.LOCATION,MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(113.2359818,23.16937253,0),null,null),'SDO_NUM_RES=5',1) = 'TRUE'
;

 

-- Return the topological difference of two geometries.
SELECT SDO_GEOM.SDO_DIFFERENCE(c_a.shape, m.diminfo, c_c.shape, m.diminfo)
  FROM cola_markets c_a, cola_markets c_c, user_sdo_geom_metadata m
  WHERE m.table_name = 'COLA_MARKETS' AND m.column_name = 'SHAPE'
  AND c_a.name = 'cola_a' AND c_c.name = 'cola_c';

 


三、MDYSYS.SDO_GEOMETRY结构

 

CREATE TYPE SDO_GEOMETRY AS OBJECT(
  SDO_GTYPE NUMBER,       //表示几何实体的类型
  SDO_SRID NUMBER,       //用来表示坐标系(空间参考坐标系),与几何实体关联
  SDO_POINT MDSYS.SDO_POINT_TYPE,  //使用X,Y,Z属性值来定义对象类型

                   //它们都是NUMBER类型,
                   //如果SDO_GEOMETRY的SDO_ELEM_INFO及SDO_ORDINATES数组为
                   //空则SDO_POINT为非空,X和Y值就是点几何实体的坐标值
  SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, //使用变长NUMBER型数组来表示。
                   //该属性将告知如何解释SDO_ORDINATES里边的坐标值;
  SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY   //存储坐标值

                   //形成空间对象的边界
);

 

MDSYS.SDO_GEOMETRY <--> OCCI 对照模型:


四、Oracle Spatial 几个自定义函数(转帖)

--------------------------------------

 --得到线对象的终止点X坐标
create or replace function GetEndNodeX(coords in SDO_ORDINATE_ARRAY) return varchar2 is
  Result varchar2(100);
begin
  if coords.count > 0 then
    Result := to_char(coords(coords.count-1));
  end if;
  return(Result);
end GetEndNodeX;

 

 --得到线对象的终止点的Y坐标
create or replace function GetEndNodeY(coords in SDO_ORDINATE_ARRAY ) return varchar2 is
  Result varchar2(100);
begin
    if coords.count > 0 then
    Result := to_char(coords(coords.count));
  end if;
  return(Result);
end GetEndNodeY;

 

 --得到线对象的终止点坐标 X,Y 形式
create or replace function GetEndNodeXY(coords in SDO_ORDINATE_ARRAY) return varchar2 is
  Result varchar2(200);
begin
  if coords.count > 0 then
    Result := to_char(coords(coords.count-1)) || ',' || to_char(coords(coords.count));
  end if;
  return(Result);
end GetEndNodeXY;

 

 --得到线对象的起始点X坐标
create or replace function GetStartNodeX(coords in SDO_ORDINATE_ARRAY) return varchar2 is
  Result varchar2(100);
begin
  if coords.count > 0 then
   Result := to_char(coords(1));
  end if;
  return(Result);
end GetStartNodeX;

 

 --得到线对象的起始点的Y坐标
create or replace function GetStartNodeY(coords in SDO_ORDINATE_ARRAY) return varchar2 is
  Result varchar2(100);
begin
  if coords.count > 0 then
   Result := to_char(coords(2));
  end if;
  return(Result);
end GetStartNodeY;

 

 --得到线对象的起始点XY坐标
create or replace function GetStartNodeXY(coords in SDO_ORDINATE_ARRAY) return varchar2 is
  Result varchar2(200);
begin
  if coords.count > 0 then
     Result := to_char(coords(1))||','||to_char(coords(2));
  end if;
  return(Result);
end GetStartNodeXY;

 

 --把X,Y坐标转换成MDSYS.SDO_GEOMETRY的点对象
create or replace function To_Geomerty_Point(x in number,y in number ) return MDSYS.SDO_GEOMETRY is
  Result MDSYS.SDO_GEOMETRY;
begin

Result := MDSYS.SDO_GEOMETRY(2001,
                      8307,
                      null,
                      MDSYS.SDO_ELEM_INFO_ARRAY(1, 1, 1),
                      MDSYS.SDO_ORDINATE_ARRAY(x, y));

return(Result);
end To_Geomerty_Point;

 


--------------------------------------------------------------------------
-------------------查询及测试语句---------------------------------------

--求线路的长度
  select c.routename, sdo_geom.sdo_length(c.geoloc,m.DIMINFO,'unit=KM')
  from tgs_route c,user_sdo_geom_metadata m

select * from tg_routev2

select a.geoloc.SDO_ORDINATES from tgs_route a
  where routename = '宣武-6-1'

select GetStartNodeXY(a.geoloc.SDO_ORDINATES) from tgs_route a
 where routename = '宣武-6-1'

select GetEndNodeXY(a.geoloc.SDO_ORDINATES) from tgs_route a
 where routename = '宣武-6-1'

 

--计算线路的起始点和终止点坐标
 create table routeNodeXY as
 select a.routename,
        GetStartNodeX(a.geoloc.SDO_ORDINATES) X1,
        GetStartNodeY(a.geoloc.SDO_ORDINATES) Y1,
        GetEndNodeX(a.geoloc.SDO_ORDINATES) X2,
        GetEndNodeY(a.geoloc.SDO_ORDINATES) Y2
   from tgs_route a

 

--更新tg_routev2 中的线起始点 终止点坐标
 alter table routeNodeXY add primary key(routename)

update (select a.*,b.* from tg_routev2 a,routeNodeXY b
 where a.routename = b.routename)
 set node1x = x1,node1y = Y1,node2x = X2,node2y = Y2
 where node1x is null

 

select sdo_geom.sdo_distance( from dual
 --物流中心坐标
 --116.635056
 --39.869170

 

--node1距离物流中心的  “南北直角折线”  距离
 select a.routename,
        (sdo_geom.sdo_distance(To_Geomerty_Point(a.node1x, a.node1y),
                               To_Geomerty_Point(116.635056, a.node1y),
                               0.005,
                               'unit=KM') +
        sdo_geom.sdo_distance(To_Geomerty_Point(a.node1x, a.node1y),
                               To_Geomerty_Point(a.node1x, 39.869170),
                               0.005,
                               'unit=KM')) dis1
   from tg_routev2 a
  order by dis1

 

--node2距离物流中心的  “南北直角折线”  距离
 select a.routename,
        (sdo_geom.sdo_distance(To_Geomerty_Point(a.node2x, a.node2y),
                               To_Geomerty_Point(116.635056, a.node1y),
                               0.005,
                               'unit=KM') +
        sdo_geom.sdo_distance(To_Geomerty_Point(a.node2x, a.node2y),
                               To_Geomerty_Point(a.node1x, 39.869170),
                               0.005,
                               'unit=KM')) dis2
   from tg_routev2 a
  order by dis2

 

--更新node1Distance 和 node2Distance  即线路起始点、终止点距离物流中心的  “南北直角折线”  距离
update

    tg_routev2
set

    node1Distance = (sdo_geom.sdo_distance(To_Geomerty_Point(node1x, node1y), To_Geomerty_Point(116.635056, node1y), 0.005, 'unit=KM')

  + sdo_geom.sdo_distance(To_Geomerty_Point(node1x, node1y), To_Geomerty_Point(node1x, 39.869170), 0.005, 'unit=KM')),
    node2Distance = (sdo_geom.sdo_distance(To_Geomerty_Point(node2x, node2y), To_Geomerty_Point(116.635056, node2y), 0.005, 'unit=KM')

  + sdo_geom.sdo_distance(To_Geomerty_Point(node2x, node2y), To_Geomerty_Point(node2x, 39.869170), 0.005, 'unit=KM'))
where

    node1Distance is null;

posted @ 2009-07-28 17:36 遇女心静 阅读(136) 评论(0) 编辑

摘要:
本文从视图、控制器、模型三个方面简要介绍了在Asp.net环境下,经典MVC设计模式的实现,并讨论了MVC设计模式的扩展,最后对MVC的优点及不足之处进行了分析。

关键词:设计模式、视图、控制器、模型

  ASP.NET是微软最新推出的新型体系结构.NET框架的一部分,它为构造新一代动态网站和基于网络的分布式应用提供了强有力的支持。与以前 的 Web 开发模型相比,ASP.NET 提供了许多重要的优点例如: 简易性;安全性;可管理性等。而且与基于过程的ASP页面技术相比,面向对象技术在ASP.NET中得到了完全实现。用传统ASP技术建立的Web应用实 例中,在页面中同时实现显示,业务逻辑和流程控制,这从工程化的角度考虑,它有许多不足之处。用户界面承担着向用户显示问题模型和与用户进行操作和I/O 交互的作用。用户希望保持交互操作界面的相对稳定,但更希望根据需要改变和调整显示的内容和形式。在.NET框架下ASP.NET技术结合MVC设计模式 很好地解决了上述问题。

  1 MVC设计模式简介

  MVC由Trygve Reenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础。MVC结构是为那些需要为同样的数据提供多个视 图的应用程序而设计的,它很好的实现了数据层与表示层的分离。MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定系统各部分间 的组织关系。对于界面设计可变性的需求,MVC(Model-View-Controller)把交互系统的组成分解成模型、视图、控制器三种部件。

  视图部件把表示模型数据及逻辑关系和状态的信息以特定形式展示给用户。它从模型获得显示信息,对于相同的信息可以有多个不同的显示形式或视图。

  控制器部件是处理用户与软件的交互操作的,其职责是控制提供模型中任何变化的传播,确保用户界面于模型间的对应联系;它接受用户的输入,将输入反馈给模型,进而实现对模型的计算控制,是使模型和视图协调工作的部件。

  模型部件保存由视图显示,由控制器控制的数据;它封装了问题的核心数据、逻辑和功能的计算关系,它独立于具体的界面表达和I/O操作。

模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映 到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控 制器三者之间的关系和各自的主要功能,如图1所示。



  2 MVC设计模式的实现

  ASP.NET提供了一个很好的实现这种经典设计模式的类似环境。开发者通过在ASPX页面中开发 用户接口来实现视图;控制器的功能在逻辑功能代码(.cs)中实现;模型通常对应应用系统的业务部分。在ASP.NET中实现这种设计而提供的一个多层系 统,较经典的ASP结构实现的系统来说有明显的优点。将用户显示(视图)从动作(控制器)中分离出来,提高了代码的重用性。将数据(模型)从对其操作的动 作(控制器)分离出来可以让你设计一个与后台存储数据无关的系统。就MVC结构的本质而言,它是一种解决耦合系统问题的方法。

  2.1 视图

  视图是模型的表示,它提供用户交互界面。使用多个包含单显示页面的用户部件,复杂的Web页面可以展示来自多个数据源的内容,并且网页人员,美工能独自参与这些Web页面的开发和维护。

   在ASP.NET下,视图的实现很简单。可以像开发WINDOWS界面一样直接在集成开发环境下通过拖动控件来完成页面开发本。本文中介绍每一个页面都 采用复合视图的形式即:一个页面由多个子视图(用户部件)组成;子视图可以是最简单HTML 控件、服务器控件或多个控件嵌套构而成的Web自定义控件。页面都由模板定义,模板定义了页面的布局,用户部件的标签和数目,用户指定一个模板,平台根据 这些信息自动创建页面。针对静态的模板内容,如页面上的站点导航,菜单,友好链接,这些使用缺省的模板内容配置;针对动态的模板内容(主要是业务内容), 由于用户的请求不同,只能使用后期绑定,并且针对用户的不同,用户部件的显示内容进行过滤。使用由用户部件根据模板配置组成的组合页面,它增强了可重用 性,并原型化了站点的布局。

  视图部分大致处理流程如下:首先,页面模板定义了页面的布局;页面配置文件定义视图标签的具体内容(用户部 件);然后,由页面布局策略类初始化并加载页面;每个用户部件根据它自己的配置进行初始化,加载校验器并设置参数,以及事件的委托等;用户提交后,通过了 表示层的校验,用户部件把数据自动提交给业务实体即模型。

  这一部分主要定义了WEB页面基类PageBase;页面布局策略类 PageLayout,完成页面布局,用于加载用户部件到页面;用户部件基类UserControlBase即用户部件框架,用于动态加载检验部件,以及 实现用户部件的个性化。为了实现WEB应用的灵活性,视图部分也用到了许多配置文件例如:置文件有模板配置、页面配置、路径配置、验证配置等。

  2.2 控制器

   为了能够控制和协调每个用户跨越多个请求的处理,控制机制应该以集中的方式进行管理。因此,为了达到集中管理的目的引入了控制器。应用程序的控制器集中 从客户端接收请求(典型情况下是一个运行浏览器的用户),决定执行什么商业逻辑功能,然后将产生下一步用户界面的责任委派给一个适当的视图组件。

   用控制器提供一个控制和处理请求的集中入口点,它负责接收、截取并处理用户请求;并将请求委托给分发者类,根据当前状态和业务操作的结果决定向客户呈现 的视图。在这一部分主要定义了HttpReqDispatcher(分发者类)、HttpCapture(请求捕获者类)、Controller(控制器 类)等,它们相互配合来完成控制器的功能。请求捕获者类捕获HTTP请求并转发给控制器类。控制器类是系统中处理所有请求的最初入口点。控制器完成一些必 要的处理后把请求委托给分发者类;分发者类分发者负责视图的管理和导航,它管理将选择哪个视图提供给用户,并提供给分发资源控制。在这一部分分别采用了分 发者、策略、工厂方法、适配器等设计模式。

  为了使请求捕获者类自动捕获用户请求并进行处理,ASP.NET 提供低级别的请求/响应 API,使开发人员能够使用 .NET 框架类为传入的 HTTP 请求提供服务。为此,必须创作支持 System.Web.IHTTPHandler 接口和实现 ProcessRequest() 方法的类即:请求捕获者类,并在web.config 的 <httphandlers> 节中添加类。ASP.NET 收到的每个传入 HTTP 请求最终由实现 IHTTPHandler 的类的特定实例来处理。IHttpHandlerFactory 提供了处理 IHttpHandler 实例 URL 请求的实际解析的结构。HTTP 处理程序和工厂在 ASP.NET 配置中声明为 web.config 文件的一部分。ASP.NET 定义了一个 <httphandlers> 配置节,在其中可以添加和移除处理程序和工厂。子目录继承 HttpHandlerFactory 和 HttpHandler 的设置。 HTTP 处理程序和工厂是 ASP.NET 页框架的主体。工厂将每个请求分配给一个处理程序,后者处理该请求。 例如,在全局 machine.config 文件中,ASP.NET 将所有对 ASPx 文件的请求映射到 HttpCapture类:

<httphandlers>
...
<add verb="*" path="*.ASPx" type="Sys.UI.HttpCapture, Sys.UI"/>
...
</httphandlers>

  2.3 模型

   MVC系统中的模型从概念上可以分为两类――系统的内部状态和改变系统状态的动作。模型是你所有的商业逻辑代码片段所在。本文为模型提供了业务实体对象 和业务处理对象:所有的业务处理对象都是从ProcessBase类派生的子类。业务处理对象封装了具体的处理逻辑,调用业务逻辑模型,并且把响应提交到 合适的视图组件以产生响应。业务实体对象可以通过定义属性描述客户端表单数据。所有业务实体对象都EntityBase派生子类对象,业务处理对象可以直 接对它进行读写,而不再需要和request、response对象进行数据交互。通过业务实体对象实现了对视图和模型之间交互的支持。实现时把"做什么 "(业务处理)和"如何做"(业务实体)分离。这样可以实现业务逻辑的重用。由于各个应用的具体业务是不同的,这里不再列举其具体代码实例。


3 MVC设计模式的扩展

  通过在ASP.NET中的MVC模式编写的,具有极其良好的可扩展性。它可以轻松实现以下功能:

  ①实现一个模型的多个视图;

  ②采用多个控制器;

  ③当模型改变时,所有视图将自动刷新;

  ④所有的控制器将相互独立工作。

   这就是MVC模式的好处,只需在以前的程序上稍作修改或增加新的类,即可轻松增加许多程序功能。以前开发的许多类可以重用,而程序结构根本不再需要改 变,各类之间相互独立,便于团体开发,提高开发效率。下面讨论如何实现一个模型、两个视图和一个控制器的程序。其中模型类及视图类根本不需要改变,与前面 的完全一样,这就是面向对象编程的好处。对于控制器中的类,只需要增加另一个视图,并与模型发生关联即可。该模式下视图、控制器、模型三者之间的示意图如 图2所示。

  同样也可以实现其它形式的MVC例如:一个模型、两个视图和两个控制器。从上面可以看出,通过MVC模式实现的应用程序具有极其良好的可扩展性,是ASP.NET面向对象编程的未来方向。

4 MVC设计模式的优点及不足之处

  4.1 MVC的优点

  MVC的优点体现在以下几个方面:

  (1) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。

  (2) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。

  (3) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。

  (4) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。

  4.2 MVC的不足之处

  MVC的不足体现在以下几个方面:

  (1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

  (2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

  (3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

  (4) 目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。

  5 结束语

   与软件所处理问题的内在模型相比较,用户界面是需要经常发生变化的,采用MVC设计模式可以在满足对界面要求的同时,使软件的计算模型独立于界面的构 成。也可以基于此模型建立大型分布式应用程序框架。本文介绍了MVC设计模式的原理;MVC设计模式三个组成构件(模型部件、视图部件和控制部件)以及在 ASP.NET环境下实现基于MVC的应

posted @ 2009-05-06 17:52 遇女心静 阅读(34) 评论(0) 编辑

 

posted @ 2009-04-17 11:41 遇女心静 阅读(41) 评论(0) 编辑
问题为: public class myclass { public string A private sting _B public string getval { get { retrun _B ;} set { _B = value; } } } 我是个初学者。请问 myclass.A 和 myclass.getval 不是一样用么?有什么本质上的区别,类属性的概念有点多余呀?请前辈指点一下。谢谢 答案: 首先,你的myclass.A和myclass.getval使用方法是错的,A和getval都是非静态的,虽然他们是公有的,但需要实例化myclass后才能使用,即使你表达的意思是new myclass().A,但作为程序员必须要持严谨的态度,尽量少出错,为了规范,公有数据和操作成员的名字第一个字母一般是大写(你应该也知道,否则你就不会写A和_B)。 正题: A是数据成员(变量),getval是操作成员(特殊的方法) 一个变量只能用来存储数据 一个方法只能用来对数据成员的进行操作 而且你的问题也很牵强 你应该这么问: public string B public string GetVal { get{ return B;} set{ B=value;} } 至少我觉得这样才符合你的本意,这样才涉及到了真正的数据安全,因为B是个公有变量,在类的外部可以任意更改,为了防止因用户任意更改 而导致程序出现异常,就要对B进行限制,所以就出现了属性,其实自定义变量已经默认实现了属性,只是简答的读写而已,我们定义的属性要在读写的基础上加上更多限制,以后你学的多了就会发现,很多东西都是为了数据安全而加入的,说白了就是限制,例如接口,接口中的方法你必须(注意是必须,强制性的)要实现 对你的问题我举个例子: 比如银行的自动取款机。 你在取钱的时候最少取多少,做多取多少都有限制,这就是用属性实现的,当然实现方法也不仅仅只有属性,你还可以在用户输入的时候来检查,但这样写维护的时候会非常困难,因为你要到类的外部去找这个检查过程。 其实单纯写程序一点不难,难得是如何设计程序,使代码简洁易读而效率又最高,如何保证程序的安全运行(也就是数据安全),建议你在学到一定程度的时候买一本程序设计的书看看,绝对大有好处
posted @ 2009-04-02 16:56 遇女心静 阅读(126) 评论(0) 编辑

document 文挡对象详解(JavaScript脚本语言描述).2007/08/10 22:12注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写,否则会提示你一个错误信息 "引用的元素为空或者不是对象"]
========================================================================
对象属性:

document.title                 //设置文档标题等价于HTML的<title>标签
document.bgColor               //设置页面背景色
document.fgColor               //设置前景色(文本颜色)
document.linkColor             //未点击过的链接颜色
document.alinkColor            //激活链接(焦点在此链接上)的颜色
document.vlinkColor            //已点击过的链接颜色
document.URL                   //设置URL属性从而在同一窗口打开另一网页
document.fileCreatedDate       //文件建立日期,只读属性
document.fileModifiedDate      //文件修改日期,只读属性
document.fileSize              //文件大小,只读属性
document.cookie                //设置和读出cookie
document.charset               //设置字符集 简体中文:gb2312
----------------------------
常用对象方法:

document.write()                      //动态向页面写入内容
document.createElement(Tag)           //创建一个html标签对象
document.getElementById(ID)           //获得指定ID值的对象
document.getElementsByName(Name)      //获得指定Name值的对象
document.body.appendChild(oTag)
========================================================================
body-主体子对象

document.body                   //指定文档主体的开始和结束等价于<body></body>
document.body.bgColor           //设置或获取对象后面的背景颜色
document.body.link              //未点击过的链接颜色
document.body.alink             //激活链接(焦点在此链接上)的颜色
document.body.vlink             //已点击过的链接颜色
document.body.text              //文本色
document.body.innerText         //设置<body>...</body>之间的文本
document.body.innerHTML         //设置<body>...</body>之间的HTML代码
document.body.topMargin         //页面上边距
document.body.leftMargin        //页面左边距
document.body.rightMargin       //页面右边距
document.body.bottomMargin      //页面下边距
document.body.background        //背景图片
document.body.appendChild(oTag) //动态生成一个HTML对象
----------------------------
常用对象事件:

document.body.onclick="func()"              //鼠标指针单击对象是触发
document.body.onmouseover="func()"          //鼠标指针移到对象时触发
document.body.onmouseout="func()"           //鼠标指针移出对象时触发
========================================================================
location-位置子对象:

document.location.hash          // #号后的部分
document.location.host          // 域名+端口号
document.location.hostname      // 域名
document.location.href          // 完整URL
document.location.pathname      // 目录部分
document.location.port          // 端口号
document.location.protocol      // 网络协议(http:)
document.location.search        // ?号后的部分
----------------------------
常用对象事件:

documeny.location.reload()          //刷新网页
document.location.reload(URL)       //打开新的网页
document.location.assign(URL)       //打开新的网页
document.location.replace(URL)      //打开新的网页
========================================================================
selection-选区子对象
document.selection
========================================================================
images集合(页面中的图象):
----------------------------
a)通过集合引用
document.images                 //对应页面上的<img>标签
document.images.length          //对应页面上<img>标签的个数
document.images[0]              //第1个<img>标签          
document.images[i]              //第i-1个<img>标签
----------------------------
b)通过nane属性直接引用
<img name="oImage">
document.images.oImage          //document.images.name属性
----------------------------
c)引用图片的src属性
document.images.oImage.src      //document.images.name属性.src
----------------------------
d)创建一个图象
var oImage
oImage = new Image()
document.images.oImage.src="1.jpg"
同时在页面上建立一个<img>标签与之对应就可以显示
----------------------------
示例代码(动态创建图象):
<html>
<img name=oImage>
<script language="javascript">
       var oImage
       oImage = new Image()
       document.images.oImage.src="1.jpg"
</script>
</html>

<html>
<script language="javascript">
       oImage=document.caeateElement("IMG")
       oImage.src="1.jpg"
       document.body.appendChild(oImage)
</script>
</html>
========================================================================
forms集合(页面中的表单):
----------------------------
a)通过集合引用
document.forms                     //对应页面上的<form>标签
document.forms.length              //对应页面上<form>标签的个数
document.forms[0]                  //第1个<form>标签
document.forms[i]                  //第i-1个<form>标签
document.forms[i].length           //第i-1个<form>中的控件数
document.forms[i].elements[j]      //第i-1个<form>中第j-1个控件
----------------------------
b)通过标签name属性直接引用
<form name="Myform"><input name="myctrl"></form>
document.Myform.myctrl             //document.表单名.控件名
----------------------------
c)访问表单的属性
document.forms[i].name             //对应<form name>属性
document.forms[i].action           //对应<form action>属性
document.forms[i].encoding         //对应<form enctype>属性
document.forms[i].target           //对应<form target>属性
document.forms[i].appendChild(oTag) //动态插入一个控件
----------------------------
示例代码(form):
<html>
<!--Text控件相关Script-->
<form name="Myform">
<input type="text" name="oText">
<input type="password" name="oPswd">
<form>
<script language="javascript">
//获取文本密码框的值
document.write(document.Myform.oText.value)
document.write(document.Myform.oPswd.value)
</script>
</html>
----------------------------
示例代码(checkbox)1:
<html>
<!--checkbox,radio控件相关script-->
<form name="Myform">
<input type="checkbox" name="chk" value="1">1    
<input type="checkbox" name="chk" value="2">2    
</form>    
<script language="javascript">    
function fun(){    
      //遍历checkbox控件的值并判断是否选中    
      var length    
      length=document.forms[0].chk.length    
      for(i=0;i<length;i++){    
      v=document.forms[0].chk[i].value    
      b=document.forms[0].chk[i].checked    
      if(b)    
        alert(v=v+"被选中")    
      else    
        alert(v=v+"未选中")   
      }    
      }    
</script>     
<a href=# onclick="fun()">ddd</a>                     
</html>
----------------------------
示例代码(checkbox)2:
<SCRIPT LANGUAGE="JavaScript">
<!--
// 2006-3-1 JavaScript 得到所有的checkbox的选中值
function getSelectedInfoRows(k)
{
var temp = "";
alert("k=="+k);
var obj = eval("document.form"+k);
for ( var i=0; i<document.form1.elements.length; i++ )
{
   var e = document.form1.elements[i];
   if ( (e.type=='checkbox')&&(!e.disabled) )
   {
    if ( e.checked )
    {
     temp += temp==""? e.value: "," + e.value ;
    }
   }
   if(temp=="")
   {
    //alert("temp=="+temp);
    obj.select.value = "0";
   }
   else
   {
    //alert("temp=="+temp);
    obj.select.value=temp;
   }

}
return temp;
}
//-->
</SCRIPT>
----------------------------
示例代码(Select):
<html>
<!--Select控件相关Script-->
<form name="Myform">
<select name="oSelect">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</form>

<script language="javascript">
       //遍历select控件的option项
       var length
       length=document.Myform.oSelect.length
       for(i=0;i<length;i++)
       document.write(document.Myform.oSelect[i].value)
</script>

<script language="javascript">
       //遍历option项并且判断某个option是否被选中
       for(i=0;i<document.Myform.oSelect.length;i++){
       if(document.Myform.oSelect[i].selected!=true)
       document.write(document.Myform.oSelect[i].value)
       else
       document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")  
       }
</script>

<script language="javascript">
       //根据SelectedIndex打印出选中的option
       //(0到document.Myform.oSelect.length-1)
       i=document.Myform.oSelect.selectedIndex
       document.write(document.Myform.oSelect[i].value)
</script>

<script language="javascript">
       //动态增加select控件的option项
       var oOption = document.createElement("OPTION");
       oOption.text="4";
       oOption.value="4";
       document.Myform.oSelect.add(oOption);
</script>
<html>
========================================================================
Div集合(页面中的层):
<Div id="oDiv">Text</Div>
document.all.oDiv                                  //引用图层oDiv               
document.all.oDiv.style.display=""                 //图层设置为可视
document.all.oDiv.style.display="none"             //图层设置为隐藏
document.getElementId("oDiv")                      //通过getElementId引用对象
document.getElementId("oDiv").style=""
document.getElementId("oDiv").display="none"
/*document.all表示document中所有对象的集合
只有ie支持此属性,因此也用来判断浏览器的种类*/
----------------------------
图层对象的4个属性
document.getElementById("ID").innerText      //动态输出文本
document.getElementById("ID").innerHTML      //动态输出HTML
document.getElementById("ID").outerText      //同innerText
document.getElementById("ID").outerHTML      //同innerHTML
----------------------------
示例代码:
<html>
<script language="javascript">
function change(){
document.all.oDiv.style.display="none"
}
</script>
<Div id="oDiv" onclick="change()">Text</Div>
</html>

<html>
<script language="javascript">
function changeText(){
document.getElementById("oDiv").innerText="NewText"
}
</script>
<Div id="oDiv" onmouseover="changeText()">Text</Div>
</html

posted @ 2009-03-16 18:59 遇女心静 阅读(140) 评论(0) 编辑
【转载】
js文件常见的有两种用法。
1.在网页里使用:一般不能直接打开,只有配合网页使用,如果是想破解某网站的在线电影等,仅从js文件入手可能性不大,建议使用专门的抓取工具,如wpe,抓取网络封包,再对封包分析,js可以使用记事本编辑。
2.在单机使用,一般可以用来做为一个可执行程序直接双击就可以运行,当然前提是计算机没有安装网页设计软件 .代码就是其编程码
1.document.write(""); 输出语句  
2.JS中的注释为//  
3.传统的HTML文档顺序是:document->html->(head,body)  
4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)  
5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或&#118alue)  
6.一个小写转大写的&#106s: document.getElementById("output").&#118alue = document.getElementById("input").&#118alue.toUpperCase();  
7.JS中的值类型:String,Number,Boolean,Null,Object,Function  
8.JS中的字符型转换成数值型:parseInt(),parseFloat()  
9.JS中的数字转换成字符型:(""+变量)  
10.JS中的取字符串长度是:(length)  
11.JS中的字符与字符相连接使用+号.  
12.JS中的比较操作符有:==等于,!=不等于,>,>=,<.<=  
13.JS中声明变量使用:var来进行声明  
14.JS中的判断语句结构:if(condition){}else{}  
15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop}  
16.循环中止的命令是:break  
17.JS中的函数定义:function functionName([parameter],...){statement[s]}  
18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替.  
19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self  
20.状态栏的设置:window.status="字符";  
21.弹出提示信息:window.alert("字符");  
22.弹出确认框:window.confirm();  
23.弹出输入提示框:window.prompt();  
24.指定当前显示链接的位置:window.location.href="URL"  
25.取出窗体中的所有表单的数量:document.forms.length  
26.关闭文档的输出流:document.close();  
27.字符串追加连接符:+=  
28.创建一个文档元素:document.createElement(),document.createTextNode()  
29.得到元素的方法:document.getElementById()  
30.设置表单中所有文本型的成员的值为空:  
var form = window.document.forms[0]  
for (var i = 0; i<form.elements.length;i++){  
       if (form.elements.type == "text"){  
           form.elements.&#118alue = "";  
       
 
31.复选按钮在JS中判断是否选中:document.forms[0].checkThis.checked (checked属性代表为是否选中返回TRUE或FALSE)  
32.单选按钮组(单选按钮的名称必须相同):取单选按钮组的长度document.forms[0].groupName.length  
33.单选按钮组判断是否被选中也是用checked.  
34.下拉列表框的值:document.forms[0].selectName.options[n].&#118alue (n有时用下拉列表框名称加上.selectedIndex来确定被选中的值)  
35.字符串的定义:var myString = new String("This is lightsword");  
36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase();  
37.返回字符串2在字符串1中出现的位置:String1.indexOf("String2")!=-1则说明没找到.  
38.取字符串中指定位置的一个字符:StringA.charAt(9);  
39.取出字符串中指定起点和终点的子字符串:stringA.substring(2,6);  
40.数学函数:Math.PI(返回圆周率),Math.SQRT2(返回开方),Math.max(&#118alue1,&#118alue2)返回两个数中的最在值,Math.pow(&#118alue1,10)返回&#118alue1的十次方,Math.round(&#118alue1)四舍五入函数,Math.floor(Math.random()*(n+1))返回随机数  
41.定义日期型变量:var today = new Date();  
42.日期函数列表:dateObj.getTime()得到时间,dateObj.getYear()得到年份,dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期几,dateObj.getHours()得到小时,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTime(&#118alue)设置时间,dateObj.setYear(val)设置年,dateObj.setMonth(val)设置月,dateObj.setDate(val)设置日,dateObj.setDay(val)设置星期几,dateObj.setHours设置小时,dateObj.setMinutes(val)设置分,dateObj.setSeconds(val)设置秒    [注意:此日期时间从0开始计]  
43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName  
44.parent代表父亲对象,top代表最顶端对象  
45.打开子窗口的父窗口为:opener  
46.表示当前所属的位置:this  
47.当在超链接中调用JS函数时用:(&#106ava****** :)来开头后面加函数名  
48.在老的浏览器中不执行此&#106s:<!--        //-->  
49.引用一个文件式的&#106s:<****** type="text/&#106ava******" src="aaa.js"></******>  
50.指定在不支持脚本的浏览器显示的HTML:<no******></no******>  
51.当超链和&#111nCLICK事件都有时,则老版本的浏览器转向a.html,否则转向b.html.例:<a href="a.html" &#111nclick="location.href=’b.html’;return false">dfsadf</a>  
52.JS的内建对象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError  
53.JS中的换行:\n  
54.窗口全屏大小:<******>function fullScreen(){ this.moveTo(0,0);this.outerWidth=screen.availWidth;this.outerHeight=screen.availHeight;}window.maximize=fullScreen;</******>  
55.JS中的all代表其下层的全部元素  
56.JS中的焦点顺序:document.getElementByid("表单元素").tabIndex = 1  
57.innerHTML的值是表单元素的值:如<p id="para">"how are <em>you</em>"</p>,则innerHTML的值就是:how are <em>you</em>  
58.innerTEXT的值和上面的一样,只不过不会把<em>这种标记显示出来.  
59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状态.  
60.isDisabled判断是否为禁止状态.disabled设置禁止状态  
61.length取得长度,返回整型数值  
62.addBehavior()是一种JS调用的外部函数文件其扩展名为.htc  
63.window.focus()使当前的窗口在所有窗口之前.  
64.blur()指失去焦点.与FOCUS()相反.  
65.select()指元素为选中状态.  
66.防止用户对文本框中输入文本:onfocus="this.blur()"  
67.取出该元素在页面中出现的数量:document.all.tags("div(或其它HTML标记符)").length  
68.JS中分为两种窗体输出:模态和非模态.window.showModaldialog(),window.showModeless()  
69.状态栏文字的设置:window.status=’文字’,默认的状态栏文字设置:window.defaultStatus = ’文字.’;  
70.添加到收藏夹:external.AddFavorite("http://www.dannyg.com/";;,"jaskdlf");  
71.JS中遇到脚本错误时不做任何操作:window.&#111nerror = doNothing; 指定错误句柄的语法为:window.&#111nerror = handleError;  
72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener...的多重继续.  
73.JS中的self指的是当前的窗口  
74.JS中状态栏显示内容:window.status="内容"  
75.JS中的top指的是框架集中最顶层的框架  
76.JS中关闭当前的窗口:window.close();  
77.JS中提出是否确认的框:if(confirm("Are you sure?")){alert("ok");}else{alert("Not Ok");}  
78.JS中的窗口重定向:window.navigate("http://www.sina.com.cn/";;);  
79.JS中的打印:window.print()  
80.JS中的提示输入框:window.prompt("message","defaultReply");  
81.JS中的窗口滚动条:window.scroll(x,y)  
82.JS中的窗口滚动到位置:window.scrollby  
83.JS中设置时间间隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout  
84.JS中的模态显示在IE4+行,在NN中不行:showModalDialog("URL"[,arguments][,features]);  
85.JS中的退出之前使用的句柄:function verifyClose(){event.return&#118alue="we really like you and hope you will stay longer.";}}    window.onbeforeunload=verifyClose;  
86.当窗体第一次调用时使用的文件句柄:onload()  
87.当窗体关闭时调用的文件句柄:onunload()  
88.window.location的属性: protocol(http:),hostname(www.example.com),port(80),host(www.example.com:80),pathname("/a/a.html"),hash("#giantGizmo",指跳转到相应的锚记),href(全部的信息)  
89.window.location.reload()刷新当前页面.  
90.window.history.back()返回上一页,window.history.forward()返回下一页,window.history.go(返回第几页,也可以使用访问过的URL)  
91.document.write()不换行的输出,document.writeln()换行输出  
92.document.body.noWrap=true;防止链接文字折行.  
93.变量名.charAt(第几位),取该变量的第几位的字符.  
94."abc".charCodeAt(第几个),返回第几个字符的ASCii码值.  
95.字符串连接:string.concat(string2),或用+=进行连接  
96.变量.indexOf("字符",起始位置),返回第一个出现的位置(从0开始计算)  
97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置.  
98.string.match(regExpression),判断字符是否匹配.  
99.string.replace(regExpression,replaceString)替换现有字符串.  
100.string.split(分隔符)返回一个数组存储值.  
101.string.substr(start[,length])取从第几位到指定长度的字符串.  
102.string.toLowerCase()使字符串全部变为小写.  
103.string.toUpperCase()使全部字符变为大写.  
104.parseInt(string[,radix(代表进制)])强制转换成整型.  
105.parseFloat(string[,radix])强制转换成浮点型.  
106.isNaN(变量):测试是否为数值型.  
107.定义常量的关键字:const,定义变量的关键字:var  
java****** 常用验证 - []
posted @ 2009-03-16 18:57 遇女心静 阅读(364) 评论(0) 编辑
仅列出标题