[转载]分享30个应用HTML5的网站案例

mikel阅读(1104)

[转载]分享30个应用HTML5的网站案例 – 梦想天空 – 博客园.

在过去的几年,设计师们已开始关注和使用 HTML5 了,如今 HTML5 得到了更加广泛的应用。虽然说 HTML5 取代 Flash 还为时尚早,但 HTML5 将逐渐成为 Web 舞台的主角。今天,本文向大家推荐30个应用 HTML5 的网站案例,让大家感受一下 HTML5 的魅力。

NakshArt

html502

Mat Tomaszewski

html503

welcomebrand

html504

layer 51

html505

Stockholm Hairdresser

html506

Furnace

html507

Virtuti Design

html508

Lifefroots

html509

Float Left

html510

Daniel Scholten

html511

AX Visual Design Studio

html512

robedwards.org

html513

Festival Mundo

html514

The Squad

html515

S5 Style

html516

Bifter SVG Comic

html517

Fidiz

html518

Push

html519

re:play

html520

Blink Lab

html521

Joe Critchley

html522

Lexways

html523

ar-com.co.uk

html524

Kiran Owal

html501

Hallzzz

html525

Birrificio Irpino

html526

Empire State Recordings

html527

McKinney

html528

weluse

html529

Myke Preusss

html530

收集来源:

HTML5 Gallery
HTML5 Websites

(编译来源:梦想天空 原文来自:30 Examples of Websites Using HTML5

[原创]ASP.NET MVC 的RedirectToAction的用法

mikel阅读(1438)

最近项目需要涉及到跳转保存查询条件的问题,于是发现利用简单RedirectToAction(string ActionName) 无法传递参数给重定向的Action,于是查看了ASP.NET MVC的源码(项目用的 ASP.NET MVC Preview3)发现Controller中RedirectToAction方法声明源码如下:

protected internal RedirectToRouteResult RedirectToAction(string actionName) {
return RedirectToAction(actionName, (RouteValueDictionary)null);
}

protected internal RedirectToRouteResult RedirectToAction(string actionName, object values) {
return RedirectToAction(actionName, new RouteValueDictionary(values));
}

protected internal RedirectToRouteResult RedirectToAction(string actionName, RouteValueDictionary values) {
return RedirectToAction(actionName, null /* controllerName */, values);
}

项目中也使用了RedirectToAction的方法传递值的,一般都是这么使用的:

return RedirectToAction("Index",new {id=1;username="mikel"});

于是想知道上面的方法调用的是 RedirectToAction(string actionName, object values) 还是 RedirectToAction(string actionName, RouteValueDictionary values),设置断点单步调试了下,发现调用的是 RedirectToAction(string actionName, object values),而且values中是以key=value的格式存储的数据并调用RedirectToAction(string actionName, RouteValueDictionary values)执行,那么看来最终执行跳转的是RedirectToAction(actionName, null /* controllerName */, values);这个方法:

        protected internal virtual RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary values) {
            if (String.IsNullOrEmpty(actionName)) {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "actionName");
            }

            RouteValueDictionary newDict = (values != null) ? new RouteValueDictionary(values) : new RouteValueDictionary();
            newDict["action"] = actionName;
            if (!String.IsNullOrEmpty(controllerName)) {
                newDict["controller"] = controllerName;
            }
            return new RedirectToRouteResult(newDict);
        }

于是想到既然传递的是new{key=value}的对象,那就是个类的实例啊,正好项目中用的都是实体类传递条件的,那直接将实体类的对象传递给方法进行重定向就行了,具体代码如下:

    public class Test
    {
        public string id{get;set;}
        public string condition{get;set;}


    }

    public class HomeController : Controller
    {
        [CachedFilter]
        public ActionResult Index(string id)
        {
            ViewData["Title"] = "Home Page";
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            ViewData["Title"] = "About Page";
            Test t = new Test();
            t.id = "none";
            t.condition = "n";

            return RedirectToAction("Index", t);
        }
    }

这样就是实现了条件值的重定向传递,看来很多事需要认真阅读源码才能知道

[转载]Android 固件管理器桌面版 – 一键刷机

mikel阅读(772)

[转载]Android 固件管理器桌面版 – 一键刷机 – 小众软件.

Android 固件管理器 推荐给各位刷机控,一款用 AHK 写出的快捷刷机工具。@Appinn

Android 固件管理器桌面版   一键刷机[图] | 小众软件

江湖传言:爱疯用户三大爱好:游戏拍照发微博。安卓用户的三大爱好:刷机重起换电池。

不管传言是真是假,向我这样保留 Android 原生系统不 root 不刷机的用户还是有滴。当然手机是自己的,怎么玩都行。这款 Android 固件管理器桌面版 给了爱刷机测试各种 ROM 的同学很方便的选择。

首先提示:刷机有风险,行动需谨慎!

适用的机型及要求:

理论上支持所有支持 ClockWorkMod 的 Recovery 的机型。据了解绝大多数 HTC 原生 Android 机型都能支持。
手机中已刷入 ClockWorkMod 的 Recovery (可直接用本工具操作)
手机中需要安装有 SD/TF 存储卡,剩余容量必须大于要刷入的新 ROM 文件的大小(ROM 会先被传输到存储卡里)。
需要打开手机中的 “USB 调试” 选项,连接电脑时请选择”仅充电”模式。

PC 端要求:

Windows XP/Vista/7 32位(未测试 64 位系统)。
已安装 ADB 驱动,或其他带有 ADB 驱动的软件,比比如 MyHTC,豌豆荚等,但为保障操作顺利,您最好事先关闭这些软件,待完成后再开启。

Android 固件管理器桌面版所具备的功能:

  1. 一键刷入新 ROM
  2. 一键刷入 Radio 和 Recovery
  3. 一键备份/还原系统,以及管理备份项目(包括删除或重命名)
  4. 一键刷入第一屏画面
  5. 一键查看设备信息
  6. 一键进入Recovery,Fastboot模式,关机,重启 等常用的快捷操作
  7. Android固件管理器桌面版自身具备自动检查更新的功能

小众再次提醒:刷机有风险,注意先备份,请先学习在刷机。

具体见介绍页面:http://zrizhi.com/android-rom-manager-desktop-released.html

[转载]Developing Android Applications with Adobe AIR (download)

mikel阅读(1020)

[转载]Developing Android Applications with Adobe AIR (download)-RIABook.cn.

Download Developing Android Applications with Adobe AIR

简介 Book Description:

关于作者 About the Author
Veronique Brossier is Senior Flash Engineer at MTVNetworks and adjunct professor at ITP/New York University. She has worked on applications for the world of art and entertainment, including The New York Visitor Center and the 9/11 Memorial site for Local Projects, NickLab for R/Greenberg Associates, Cartoon Network Online, the Hall of Biodiversity at the American Museum of National History, and many more.

下载:
http download :

from fileserve.com
from 115.com password: www.zaneblog.info

[转载]分享8个超棒的免费高质量图标搜索引擎

mikel阅读(957)

[转载]分享8个超棒的免费高质量图标搜索引擎 – 梦想天空 – 博客园.

在工作中,我们经常需要用到图标素材。你也许能搜到很多的图标资源网站,但要找到免费的高质量图标却很难,这就是为什么我今天要与大家分享这些优秀的免费质量图标搜索引擎,相信在这些网站你能找到你要的东西。如果你知道更多更好的网站,欢迎与我们分享!

FindIcons

FindIcons 是我最喜欢的图标搜索引擎,目前已拥有超过 300,000 个图标资源。

IconFinder

Iconfinder 能帮助你快速找到需要的高质量图标,目前已拥有超过 150,000 个图标资源。

IconFinder

MrIcons

MrIcons 也是非常不错的图标搜索引擎,拥有 125,174 个图标资源。

MrIcons

Iconlet

Iconlet 是一个查找图标等图片资源的搜索引擎。

Iconlet

IconScan

这是一个用于查找 ICO 格式图标的搜索引擎,拥有超过 80,000 个图标文件。

IconScan

IconSeeker

IconSeeker 是最好的图标搜索引擎,拥有超过 50,000 张图标资源,下载格式有 PNG, ICO  和 ICNS 三种。

Icon-Seeker

Icons Search

Icons-Search 是一个帮助你查找高质量图标的在线搜索工具。

Icons-Search

VeryIcon

VeryIcom 是另外一个帮助你搜索高质量图标的网站,拥有超过 20,000 的高质量图标。

VeryIcon

(编译来源:梦想天空 改编自:8 Best Search Engines You Should Visit To Find

[转载]InfoQ: Flash务实主义(四)——Flash中的MVC

mikel阅读(1059)

[转载]InfoQ: Flash务实主义(四)——Flash中的MVC.

FLASH与传统环境的不同点

MVC最早在1979年的时候第一次被人提出。不过,当时还不存在网络应用的概念。之后当万维网诞生之后,又过了很长时间……

它并不是自诞生就开始流行的,而改变的原因很简单——因为两个极其流行的开发框架包含了这种模式,它们就是:Struts 和 Ruby on Rails。之后,模仿者蜂拥而至。所以,在人们眼里看来,实际上是先有的Struts,然后才有的MVC,也无怪乎MVC的概念会始终沾染着Web概 念,乃至和一些框架附加内容牵涉不清。

因为Struts很好用,别的不说,至少让HTML显得干净了很多。所以很多人都在用Struts,这未必是因为需要MVC模式,而是因为他们需要 Struts。因此,当环境变化后,我们不使用Struts而是在使用一些其他的框架的时候,是否还应该像以前那样使用MVC框架就成为了一个问题。因为 环境不同,即使在其他语言中使用MVC框架很普遍,也不代表在新环境里同样应该是如此。

AS3与传统语言的不同点:

  • AS3是单一语言环境,多层代码混在一起问题没那么严重。
  • AS3正常情况都是一次性编译全部代码,即使用了MVC框架还是需要一起编译。单独编译一个模块减少编译时间有别的办法,不需要依赖MVC。
  • AS3本身的事件和动态特性和一些框架的功能重复。
  • AS3目前的框架还很不成熟,没有提供比较醒目的功能。

结果是,至少,目前AS3的MVC框架比起传统语言并没有那么突出的作用,就算用了,也不会像Struts那样有质的变化。而且,至少在我看来,AS3的框架使用成本却不见得比Struts低。两者相减,结果就很麻烦了。

而且,AS3在不使用框架的时候有它自己的优势,使用框架会毁掉这些优点:

  • 有一个相对还可以的调试器,使用了框架会调试上产生麻烦,主要体现在单步调试步骤变多的问题上。
  • 阻碍使用IDE的功能。以Flex Builder为例,你可以通过Ctrl+单击(F4)跳转到指定方法的具体实现,通过搜索引用面板从方法的实现跳转到调用方法的位置。使用框架后,这些功能都会失效。
  • Flex framework相关功能会难以使用,诸如绑定。而且,Flex Builder支持拖拽式的将数据接口绑定到视图的功能,可以部分实现零代码编程,框架也会阻碍这个过程。

此外,企业应用和网站还好说,游戏还有另一种情况。游戏的结构并不同于原来的专门用于呈现数据的结构,可能也就是其中的用户界面(User Interface)部分和以前的结构比较类似,其他的诸如地图,诸如人物,无论怎么想也无法套用MVC框架,首先从效率上就说不过去。举个例子,一个项 目有3个客户端人员在开发,一个在做地图,一个在做战斗,一个在做UI。前两者都和MVC没什么关系,结果只有一个人在用MVC框架开发界面……而且,开 发前两者的时候,开发以及协作难度其实是比开发界面要高的,既然他们都搞定了,为什么开发界面的人还必须靠框架辅助才能解决这个问题?

这使得FLASH比起一般的情况,会更加不适合使用MVC框架。

不使用现有框架并非无法实现MVC

既然我在说框架不好用。那么不用框架,我们又该怎么做呢?

实际上,如果你只是想实现单纯的模型—视图—控制器(Model View Controller)分工职守,它只是一个架构模式而已。将模型和视图的代码分开,并提出控制器的代码,然后互相调用各自方法就算完事了。Model的 全部引用放在固定的位置,View的引用使用静态属性储存或者用管理类管理,Command可以作为函数或者类直接初始化并执行,亦可以通过反射。这并不 需要专门的工具类来辅助,附加成本也比较小,自然就可以适用于任何规模的项目。

当然,你可以实现一个简单的通信框架,提供必要的功能,如果你需要的话。这和使用一些专门的MVC框架需要的成本是完全不同的。

然而,我的意见则是——MVC是非常好的架构模式,不管什么样的项目都建议尝试使用,但是用框架的话,请务必谨慎。

关于最简的MVC,最近看到一个让人很囧的例子。不过这个例子对大家理解MVC是有帮助的。

这玩意的确……基本算是MVC,只差一点而已。MVC是架构模式,至少结构上要分开,即使不分文件至少要让能看得出来谁是谁(原文可没有红字),所以只需要把这些代码分成三个文件,那就可以称得上是最简的MVC了。

这是我在他的下面补充的代码。

结果是,View只关心与自己相关的Model和Command,Command只关心与自己相关的View和Model,Model谁都不关心, 这和一般情况需要的解耦目标是一致的。虽然这样并不算完全解耦,但是至少在思路和逻辑分离上是做到了,仅仅是协作方面存在问题,比如无法实现自由的并行开 发,而这个加入简单的反射也可以解决。

所以,单纯的MVC并不困难,没什么要不要放弃一说。还有就是上面只是极端例子,但就算是这种东西,比起完全不实现MVC,也至少实现了50%以上的内容。

是否使用框架应当理性对待

程序员都是理科生,应当用理科生的思考方式(当然我并没有让你们都去模仿Sheldon)。在使用MVC框架的过程中,不管是觉得好,还是差,都要考虑清楚问题的源头在哪。

觉得MVC框架不好用,降低效率,是否曾经有过平行对比的例子,你能否确认不用它效率就确实能提高?效率低有没有可能是框架之外的原因?

觉得MVC框架好用,提高效率,是否有平行对比的例子?你怎么就知道是使用了框架的功劳,而不是规范了代码结构,制定了新的协作流程,甚至是开发人员水平提高的功劳?怎么知道MVC框架并没有起了反效果?

使用了框架,看到了结果,然后根据结果的好话直接判定框架的好坏,这太武断了,作为一个理科生,我们绝对不能这样做。至于那类连比较都没有,而是以“我用了框架,项目依然完成了,没有因为用了框架而失败”这种理由来支持使用某个框架的人,我无言以对。

推荐MVC框架

我并没有完全反对使用MVC框架。这要看你的项目类型,规模,人数。满足条件的时候当然可以使用。尤其是在企业应用里,如果你有幸出现六个客户端的话,没MVC框架可能还真是会出问题。

pureMVC和Cairngorm是两个较早出现的框架,目前我不建议再使用它们。pureMVC的问题在于过于强调分离而缺乏实际功能,提供的便利很难抵消它本身的消耗,性价比较低。Cairngorm的问题则在于过于强调模型更新视图的流程,限制太多,灵活程度不够。

后出的几个框架就好多了,Mate使用了一个全局事件定义,配合FLEX写法非常简略。Swiz则是用控制反转+依赖注入,也就是Spring的做法,而且元标签注入的方式很有趣,感兴趣的可自行查阅资料。

我这里要说的是Robotlegs。这是一个和Swiz非常相似的框架,但也有一些自己的特点。首先它是基于pureMVC的,你依然可以像 pureMVC这样来使用它,对于相信pureMVC的团队它是很容易接受的代替品。他让pureMVC也同样拥有了控制反转和依赖注入,包装了大部分功 能,配置代码大大减少,而且不管用不用FLEX framework都可以很自然地使用它。

Robotlegs的教程可以看这里:

http://wenku.baidu.com/view/42a08b235901020207409c60.html

但我得提醒大家,虽然我觉得Robotlegs很便利以及有趣,但是并没有在项目里使用它,因为我的项目规模不大,而且是游戏。实际上,我甚至自己 实现了一个依赖注入框架,可以很简单的加入到现在的项目中,成本几乎为零,却依然没有去用。使用一个东西要看是否需要去用,而不是可以用就用,更不是“因 为用了没有遇到问题所以就用”。用一个东西必须有收益才可以,尤其是在明明看到有损失的时候。仅仅是用“看起来更正规”这类自我满足的理由来决定自己的行 为,太愚蠢了。

当然,如果你需要它,那就应该毫不犹豫的使用。不要受到抱怨框架的人影响,他们大部分都有自己的问题,提出的理由也未必是正确的,你并不一定会赴他们后尘——前提是你真的需要它,而且,要将使用框架需要的条件全部补齐。

就算是使用MVC框架也不需要完全解耦

解耦是一个扩展性要求,但扩展性要求并不是越多越好的。

这是一个普遍的误区。诸如使用pureMVC的人,很多都纠结于完全的解耦,以至于用了Command,在Command中改变View的时候还是必须要发一遍Notification。

Command这种类,一般都是在相关的View,Model完成后才开始编写的。比如普通的 StartupCommand,OpenWindowCommand,没有对象又如何编写?它在编写顺序上应该是,就算不是也是可以放在View和 Model之后的。那么在协作关系上,他就可以直接访问所有相关类,不需要为了这种原因而解耦。

虽然pureMVC将消息全局化了,但是消息实际上是分局部和全局的。比如一个Proxy发生变化要求所有监听某个消息的View更新,那么当然应 该发一个叫做I_AM_CHANGED的Notification,并由不同的View来监听这个消息并更新,这个就应该是全局消息。但有些消息就是局部 的,是一对一的,比如一个叫做SEND_DATA_TO_WINDOW1的消息,按它的字面意思就应该是刷新WINDOW1,那么由它来触发的 Command,就应该直接耦合 WINDOW1这个View来设置值,而不是再发个类似REFRESH_WINDOW1的消息,因为SEND_DATA_TO_WINDOW1的名字已经 确定是针对这个View了,如果最终它却没有操作这个View,那才是有问题的吧?

解耦归解藕,但是对于已经有了意义上的联系的模块,结果却不耦合,在任何时候都是没有意义的。即使需求变化,逻辑变化了,使得 SEND_DATA_TO_WINDOW1最终不是改变WINDOW1的数据,而是WINDOW2的数据,那么这个Command连带相关 Notification的名字就必须修改,也就是说,意义上的紧密联系,在实际操作上和耦合了是一回事。既然已经是这样了,再做成不耦合,给自己制造麻 烦的又有什么意义呢?

除了上面的情况,我们也要考虑,真的有必要将项目拆得那么细致么,有没有必要为了1%以下的可能性来解耦两个相关性很强的部分?比如一个叫做 ShopPanel的View和一个叫做ShopModel的Model,到底在什么情况下,ShopPanel会不去调用ShopModel,而是别的 东西?而且Panel上可能还有各种文字,使得自己意义上只能调用商店的数据。真是要调别的东西,应该重新制作一个新的View吧?而且别忘了 pureMVC是可以多个Mediator套用一个View的。这种情况下,我们直接在Mediator中耦合ShopModel,有什么不可以的?当 然,反过来,ShopModel被多个View调用的情况很普遍,所以我们不能让它来耦合ShopPanel。这些规则实际上是很明确的,是完全可以预知 的。就算预知错误,也是很容易修正的。

解耦是手段,而不是目的。盲目的最求扩展性,只会让自己的程序变成一盘散沙。正是适量的耦合,程序才能拥有一个确定的形态,才不会让人感到茫然。

普遍误解

其实现在使用框架的人群里,真的能够发挥框架长处的确实比较少,尤其是在水平层次较低的Action Script开发人员之中。一方面,这污染了框架的名声,同时也是不建议使用框架的理由之一,因为人员水平限制也是实际项目中不可回避的现实问题。

如果你决定使用MVC框架,就必须提高自己的认识。我拣几个最常见的问题来说吧。

  • 并不是用了消息通信就算用了MVC
  • 消息通信只是一个手段,只使用框架的通信功能在View之间发送消息的话,而将其他功能全部抛弃的话,直接使用事件更好,那还套一个MVC框架就是在没事找事了。

    MVC关键还是在于代码逻辑的分配,通信只是个附赠品而已。要了附赠品而扔了原来的商品——咱们买的不是小浣熊干脆面,对吧。

    但是如果你的目的就是赠品,其实也没什么。比如你就是想用的这个通信框架来发发消息,就不打算用它的MVC,又或者MVC部分是自己实现的。那么我还是建议你把消息部分干脆也自己实现了,别人的始终没有自己的好。

  • 既然用了MVC框架,就不要图省事
  • 要清楚,松散耦合不仅仅是一个形式,目的在于减少模块间的联系。因此,如果你一方面在解除两个模块之间的耦合,一方面自己又没头没脑的将其他模块的内容耦合进来,就会使得你的行为变得没有意义。

    现在一些人一方面在硬套框架,一方面又图省事而随意引入其他类,就属于这样的行为。那些类是可以引入,但你这样做,框架本身的意义就没有了。要不你就不用框架,要不就别这样干,这里只能二选一。

  • 是Mediator知道View的一切,View完全不知道Mediator,而不是相反
  • 对于使用pureMVC的同僚们,我真是不明白你们到底是怎么把这个反过来理解成“View知道Mediator的一切,而 Mediator完全不知道View”的,因为官方实例上写的很明白。估计是把mediator当成通信专用的模块类了吧。但是如果你放弃了 mediator分离View代码的特性,只是用来通信的话,至少要保留原来的通信功能,就是让Mediator依然可以直接访问View。否则既然 Mediator是用来通信的,它却不能操作View,结果还得设法和View再通信一次……

    pureMVC要求“View完全不知道Mediator”是为了能够在不修改View的情况下更换Mediator,但这种需求并不多 (多的是在Mediator不变的情况更换View,这个需要用接口或者条件判断解决),所以可以放宽点让他们互相引用,这样两者通信都能畅通。

    pureMVC实现“View完全不知道Mediator”的方法是用Mediator直接去监听View的某个组件的鼠标事件。这只需要监听一次,也不需要传递消息。Mediator存在的期间,按pureMVC的标准View应该是没有任何监听逻辑的。

扩展阅读

http://baike.baidu.com/view/31.htm

http://www.360doc.com/content/09/0804/08/163747_4655702.shtml

http://hi.baidu.com/5%B1%CF%D2%B5%D2%D4%BA%F3/blog/item/2a018366a08e54cde6113af7.html

http://hi.baidu.com/lwcandwo/blog/item/8fb4b3036d01eb8ad43f7cf4.html

http://developer.51cto.com/art/200904/120649.htm

[转载]分享10篇优秀的 jQuery 幻灯片制作教程及应用案例

mikel阅读(1020)

[转载]分享10篇优秀的 jQuery 幻灯片制作教程及应用案例 – 梦想天空 – 博客园.

JQuery 是一个非常优秀的 JavaScript 框架,使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入一些非常好的效果。幻灯片效果是常用的内容展示方式之一,这是一种在有限 的网页空间内展示系列项目时非常好的方法。今天要给大家分享的是10篇非常棒的 JQuery 幻灯片教程及16个优秀的 jQuery 幻灯片应用案例。

10篇 jQuery 幻灯片制作教程

Create Beautiful jQuery slider tutorial

jQuery Plugin – Feature List

Create an Image Rotator with Description (CSS/jQuery)

Moving Boxes

Using the Wonderful jFlow Plugin

Easy Slider 1.7 – Numeric Navigation jQuery Slider

AnythingSlider jQuery Plugin

Create a Slick and Accessible Slideshow Using jQuery

jQuery Multimedia Portfolio

Slider Gallery

16个 jQuery 幻灯片应用案例

(编译来源:梦想天空 原文来自:Examples of jQuery Sliders in Web Design, Plugins and Tutorials

[转载]android解析xml文件的方式(其二)

mikel阅读(959)

[转载]android解析xml文件的方式(其二) – 东子哥 – 博客园.

上一节中,我们使用DOM方式解析xml文档,该方式比较符合我们日常思维方式,容易上手,但是它直接把文档调入内存中,比较耗内存。在这里我们可以用另外一种方式解析xml,这个就是SAX方式。

SAX即是:Simple API for XML

SAX是基于事件驱动的。当然Android的事件机制是基于回调函数的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其他节点与内容时候也会回调一个事件。

既然涉及到事件,就有事件源,事件处理器。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法 来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以 及EntityResolver这4个接口

XMLReader通过相应事件处理器注册方法setXXXX()来完成的与ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口的连接,详细介绍请见下表:

但是我们无需都继承这4个接口,SDK为我们提供了DefaultHandler类来处理,DefaultHandler类的一些主要事件回调方法如下:

由以上可知,我们需要XmlReader 以及DefaultHandler来配合解析xml。

处理思路是:

1:创建SAXParserFactory对象

2: 根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
3:根据SAXParser解析器获取事件源对象XMLReader
4:实例化一个DefaultHandler对象

5:连接事件源对象XMLReader到事件处理类DefaultHandler中

6:调用XMLReader的parse方法从输入源中获取到的xml数据

7:通过DefaultHandler返回我们需要的数据集合。

代码如下:

View Code

重点在于DefaultHandler对象中对每一个元素节点,属性,文本内容,文档内容进行处理。

前面说过DefaultHandler是基于事件处理模型的,基本处理方式是:当SAX解析器导航到文档开始标签时回调 startDocument方法,导航到文档结束标签时回调endDocument方法。当SAX解析器导航到元素开始标签时回调 startElement方法,导航到其文本内容时回调characters方法,导航到标签结束时回调endElement方法。

根据以上的解释,我们可以得出以下处理xml文档逻辑:

1:当导航到文档开始标签时,在回调函数startDocument中,可以不做处理,当然你可以验证下UTF-8等等。

2:当导航到rivers开始标签时,在回调方法startElement中可以实例化一个集合用来存贮list,不过我们这里不用,因为在构造函数中已经实例化了。

3:导航到river开始标签时,就说明需要实例化River对象了,当然river标签中还有name ,length属性,因此实例化River后还必须取出属性值,attributes.getValue(NAME),同时赋予river对象中,同时添 加为导航到的river标签添加一个boolean为真的标识,用来说明导航到了river元素。

4:当然有river标签内还有子标签(节点),但是SAX解析器是不知道导航到什么标签的,它只懂得开始,结束而已。那么如何让它认得我们的各个 标签呢?当然需要判断了,于是可以使用回调方法startElement中的参数String localName,把我们的标签字符串与这个参数比较下,就可以了。我们还必须让SAX知道,现在导航到的是某个标签,因此添加一个true属性让 SAX解析器知道。因此

5:它还会导航到文本内标签,(就是<img></img>里面的内容),回调方法characters,我们一般在这个方法中取出就是<img></img>里面的内容,并保存。

6:当然它是一定会导航到结束标签</river> 或者</rivers>的,如果是</river>标签,记得把river对象添加进list中。如果是river中的子标 签</introduction>,就把前面设置标记导航到这个标签的boolean标记设置为false.

按照以上实现思路,可以实现如下代码:

/**导航到开始标签触发**/
public void startElement (String uri, String localName, String qName, Attributes attributes){
String tagName=localName.length()!=0?localName:qName;
tagName=tagName.toLowerCase().trim();
//如果读取的是river标签开始,则实例化River
if(tagName.equals(RIVER)){
isRiver=true;
river=new River();
/**导航到river开始节点后**/
river.setName(attributes.getValue(NAME));
river.setLength(Integer.parseInt(attributes.getValue(LENGTH)));
}
//然后读取其他节点
if(isRiver){
if(tagName.equals(INTRODUCTION)){
xintroduction=true;
}else if(tagName.equals(IMAGEURL)){
ximageurl=true;
}
}
}

/**导航到结束标签触发**/
public void endElement (String uri, String localName, String qName){
String tagName=localName.length()!=0?localName:qName;
tagName=tagName.toLowerCase().trim();

//如果读取的是river标签结束,则把River添加进集合中
if(tagName.equals(RIVER)){
isRiver=true;
rivers.add(river);
}
//然后读取其他节点
if(isRiver){
if(tagName.equals(INTRODUCTION)){
xintroduction=false;
}else if(tagName.equals(IMAGEURL)){
ximageurl=false;
}
}
}

//这里是读取到节点内容时候回调
public void characters (char[] ch, int start, int length){
//设置属性值
if(xintroduction){
//解决null问题
river.setIntroduction(river.getIntroduction()==null?"":river.getIntroduction()+new String(ch,start,length));
}else if(ximageurl){
//解决null问题
river.setImageurl(river.getImageurl()==null?"":river.getImageurl()+new String(ch,start,length));
}
}

运行结果如下:

[转载]ASP.NET MVC3 基础教程 – Web Pages 1.0

mikel阅读(783)

[转载]ASP.NET MVC3 基础教程 – Web Pages 1.0 – dotNetDR_ 深圳 点燃象征希望的烛光 – 博客园.

image

I:Web Pages 1.0中以“_”开头的特别文件(文件命名时不区分大小写)

“_appstart.cshtml” & “_pagestart.cshtml” & “_viewstart.cshtml”

_appstart.cshtml – 应用程序启动时在Global. Application_Start方法后执行
功能:用于进行App的初始化时,需要进行处理的内容.例:向数据库记录系统初始化的一些信息
功 能与Global.Application_Start类似,差别在于:Global的Start先执行,然后在到该_appStart,值得注意的是在 _appStart上下文中可以使用.NET4的dynamic新特性~~在声明中,作为属性、字段、索引器、参数、返回值或类型约束的类型。

http://msdn.microsoft.com/zh-cn/library/dd264741.aspx

code:

@{
    this.App.StartMessage = "App顺利已启动了.恭喜!哈";
    var error = this.App.Error as string;
    if (error == null)
    {
        this.App.Error = "使用dynamic新特性之前.请先赋值~";
        error = this.App.Error;
        @*
            在这里很遗憾地告诉大家.dynamic不支持智能感知
            因为编译无法100%准确得知程序的执行顺序.
            所以无法智能感知!
        *@
    }
    // 在这里可以引用 App.Error动态字段了.
}

image

code:

//--------------------------------------------
@{
    @* ~/Views/_ViewStart.cshtml *@
    Response.Write(string.Format("<h1>{0}</h1>", App.StartMessage));
    Layout = "~/Views/Shared/_Layout.cshtml";
}

image
成员来自:

at System.Web.WebPages.Razor.WebPageRazorHost

at System.Web.WebPages.ApplicationStartPage


_viewstart.cshtml – 单个View处理Request时执行
功能:或许你已经联想到了….Global的Page_Load(仅应用于View)……
执行顺序位于_appstart.cshtml之后.毕竟所除层次不同
成员来自:

at System.Web.Mvc.RazorViewEngine

综上所述得知MVC3的APP初始化顺序为:
image

(不排除本人未能发现的其他文件类型,但目前据我所知道应用最广的就这三个)
在Web Pages 1.0下,除非你显式以”_”开头命名View.否则你在请求”_”开头的页面时会遇到以下无法服务的页面提示

image

(这图在Razor语法基础时就帖过了.这里帖出来是让大家温故而知新)

关于*.cshtml生成的类名格式
绝大部分页生成的程序集格式
image

页面编译都是以单独页面编译为单个带随机字符串的程序集,当然也可以采用预编译方式将n个页编译为1个程序集

II:关于多目录下以”_”开头的特殊文件的执行顺序

_appstart.cshtml仅能存在于根目录(“~/”),
如果你在子目录下放置_appstart.cshtml文件的话.那么该文件就不会被App初始化时执行

当访问~/somepage.cshtml时.

会先执行~/_pageStart.cshtml

然后在执行 ~/somepage.cshtml
当在复杂的子目录环境下时:

~/_pageStart.cshtml

~/sub/_pageStart.cshtml

~/sub/somepage.cshtml

III:Web Pages 1.0脱离WebForms的启动原理

首先Web Pages利用特性往本身程序集上与ASP.NET挂钩
// SourceFile: AssemblyInfo.cs(System.Web.WebPages.dll)
//AttributeClass: System.Web. PreApplicationStartMethodAttribute
//特性介绍:为ASP.NET 其他Provide提供扩展
//参数1: ASP.NET Provide的类型
//参数2:运行的方法名
//Source:
[assembly: PreApplicationStartMethod(typeof(System.Web.WebPages.PreApplicationStartCode), “Start”)] //Line: 15

然后我们在这里可以看到Web Pages的ASP.NET Provide是.Web.WebPages.PreApplicationStartCode
启动方法是Start

public static void Start() {
    // Even though ASP.NET will only call each PreAppStart once, we sometimes internally call one
    // another PreAppStart to ensure that things get initialized in the right order. ASP.NET does
    // order so we have to guard against multiple calls.
    // All Start calls are made on same thread, so no lock needed here.
    if (_startWasCalled) {
        return;
    }
    _startWasCalled = true; //设置Start方法已被调用
    WebPageHttpHandler.RegisterExtension("cshtml");//注册扩展
    WebPageHttpHandler.RegisterExtension("vbhtml");//注册扩展
    // Turn off the string resource behavior which would not work in our simple base page
    PageParser.EnableLongStringsAsResources = false;//优化选项
    DynamicModuleUtility.RegisterModule(typeof(WebPageHttpModule));//重点在这里了.~~注册了一个WebPageHttpModule
    ScopeStorage.CurrentProvider = new AspNetRequestScopeStorageProvider();
    //ASP.NET Web Pages的RequestScopeStorageProvider
}

IV:附录:Global执行顺序

当WebApp开始运行时

Application_Start

Application_BeginRequest

Application_AuthenticateRequest

Session_Start
当WebApp终止运行时

Session_End

Application_End
当一个Request入站时

Application_BeginRequest

Application_AuthenticateRequest 过后到达*.cshtml

当在*.cshtml throw new Exception();时

Application_BeginRequest

Application_AuthenticateRequest

Application_Error(在throw处转至,不会执行*.cshtml的throw后的下文)
例:
@{

Throw new Exception();//仅做示例

//下文不会被执行,而直接跳到Application_Error终止Response
}

V:有经验的看官,或许已经知道了.可以在*.cshtml中做IoC(Unity 2.0有提供)来变Themes换布局等.

更深入点,你可以dynamic创建*.cshtml文件~~实现按需创建Web页~HOHO~~~

@* MVC3一个新的Web开发革命正式诞生 *@

声明: 本文版权归作者和博客园共有,转载必须保留此段声明。

[转载]android解析xml文件的方式(其一)

mikel阅读(999)

[转载]android解析xml文件的方式(其一) – 东子哥 – 博客园.

在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在Android中如何解析xml文件数据呢?

通常有三种方式:DOM,SAX,PULL

在这一节中我们使用DOM方式来处理。

DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大呢?手机CPU处理能力当然不能与PC机器比,因此在处理效率方面就相对差了,当然这是对于其他方式处理xml文档而言。

解析xml文档,当然必须有xml文档文件啦,我自己胡乱弄了一个river,放在assets目录.如下:

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



灵渠在广西壮族自治区兴安县境内,是世界上最古老的运河之一,有着“世界古代水利建筑明珠”的美誉。灵渠古称秦凿渠、零渠、陡河、兴安运河,于公元前214年凿成通航,距今已2217年,仍然发挥着功用。


http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg



胶莱运河南起黄海灵山海口,北抵渤海三山岛,流经现胶南、胶州、平度、高密、昌邑和莱州等,全长200公里,流域面积达5400平方公里,南北贯穿山东半岛,沟通黄渤两海。胶莱运河自平度姚家村东的分水岭南北分流。南流由麻湾口入胶州湾,为南胶莱河,长30公里。北流由海仓口入莱州湾,为北胶莱河,长100余公里。


http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg



位于淮河下游江苏省北部,西起洪泽湖边的高良涧,流经洪泽,青浦、淮安,阜宁、射阳,滨海等六县(区),东至扁担港口入海的大型人工河道。全长168km。


http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg


那么如何处理呢?

具体思路是:

*首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例
*然后利用DocumentBuilderFactory创建DocumentBuilder

*然后加载XML文档(Document),
* 然后获取文档的根结点(Element),
* 然后获取根结点中所有子节点的列表(NodeList),
* 然后使用再获取子节点列表中的需要读取的结点。

当然我们观察节点,我需要用一个River对象来保存数据,抽象出River类

public class River implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public String getImageurl() {
return imageurl;
}
public void setImageurl(String imageurl) {
this.imageurl = imageurl;
}
private int length;
private String introduction;
private String imageurl;
}

下面我们就开始读取xml文档对象,并添加进List中:代码如下:

我们这里是使用assets中的river.xml文件,那么就需要读取这个xml文件,返回输入流。

读取方法为:inputStream=this.context.getResources().getAssets().open(fileName); 参数是xml文件路径,当然默认的是assets目录为根目录。

然后可以用DocumentBuilder对象的parse方法解析输入流,并返回document对象,然后再遍历doument对象的节点属性。

//获取全部河流数据
/**
* 参数fileName:为xml文档路径
*/
public List getRiversFromXml(String fileName){
List rivers=new ArrayList();
DocumentBuilderFactory factory=null;
DocumentBuilder builder=null;
Document document=null;
InputStream inputStream=null;
//首先找到xml文件
factory=DocumentBuilderFactory.newInstance();
try {
//找到xml,并加载文档
builder=factory.newDocumentBuilder();
inputStream=this.context.getResources().getAssets().open(fileName);
document=builder.parse(inputStream);
//找到根Element
Element root=document.getDocumentElement();
NodeList nodes=root.getElementsByTagName(RIVER);
//遍历根节点所有子节点,rivers 下所有river
River river=null;
for(int i=0;i river=new River();
//获取river元素节点
Element riverElement=(Element)(nodes.item(i));
//获取river中name属性值
river.setName(riverElement.getAttribute(NAME));
river.setLength(Integer.parseInt(riverElement.getAttribute(LENGTH)));
//获取river下introduction标签
Element introduction=(Element)riverElement.getElementsByTagName(INTRODUCTION).item(0);
river.setIntroduction(introduction.getFirstChild().getNodeValue());
Element imageUrl=(Element)riverElement.getElementsByTagName(IMAGEURL).item(0);
river.setImageurl(imageUrl.getFirstChild().getNodeValue());
rivers.add(river);
}
}catch (IOException e){
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}finally{
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return rivers;
}

在这里添加到List中, 然后我们使用ListView将他们显示出来。如图所示: