[JQuery]微软将 jQuery IntelliSense整合到Visual Studio

mikel阅读(804)

上个月,我在博客里宣布了微软将对JQuery提供支持。在过去的几个星期里,我们与JQuery开发团队合作,在Studio 2008 和 Visual Web Developer 2008 Express版本(免费的)中增加了很好的JQuery intellisense支持。现在这个支持可以下载使用了。
在VS 2008中启用jQuery Intellisense的步骤
要在VS中启用jQuery的intellisense完成,你要遵循三个步骤:
第一步: 安装VS 2008 SP1
VS 2008 SP1 在Visual Studio中加了更丰富的JavaScript intellisense支持,对很大部分的JavaScript库加了代码完成支持。
你可以在这里下载VS 2008 SP1 和 Visual Web Developer 2008 Express SP1。
第二步: 安装VS 2008 Patch KB958502以支持"-vsdoc.js"Intellisense文件
2 个星期前,我们发布了一个补丁,你可以将其运用到VS 2008 SP1 和 VWD 2008 Express SP1版本上,该补丁会导致Visual Studio在一个JavaScript库被引用时,查找是否存在一个可选的"-vsdoc.js"文件,如果存在的话,就用它来驱动 JavaScript intellisense引擎。
这些加了注释的"-vsdoc.js"文件可以包含对JavaScript方法提供了帮助文档的XML注释,以及对无法自动推断出的动态JavaScript签名的另外的代码intellisense提示。你可以在这里了解该补丁的详情。你可以在这里免费下载该补丁。
第三步: 下载jQuery-vsdoc.js文件
我们与jQuery开发团队合作编写了一个jQuery-vsdoc.js文件,该文件对串连的jQuery selector方法的JavaScript intellisense提供了帮助注释和支持。你可以在jQuery.com网站的官方下载网页上下载jQuery和jQuery-vsdoc文件:
把jquery-vsdoc.js保存到你项目中jquery.js文件所在的同一个目录中(同时确认它的命名前缀与jquery文件名匹配):
然后你可以象这样,通过一个html <script/>元素来引用标准的jquery文件:
或者也可以使用<asp:scriptmanager/> 控件来引用它,或者在一个单独的.js文件的顶部加 /// <reference/> 注释来引用它:
在完成之后,VS就会在你引用的脚本文件所在的同一个目录中寻找一个-vsdoc.js文件,如果找到的话,就会用它来做帮助和intellisense。
例如,我们可以使用jQuery来做一个基于JSON的get请求,得到该方法的intellisense(挂在$.之后):
以及 $.getJSON()方法参数的帮助/intellisense:
如果你在方法调用中嵌套回调函数的话,intellisense依旧会工作。例如,我们也许想对从服务器返回的每个JSON对象进行迭代:
对每个项,我们可以执行另一个嵌套的回调函数:
我们可以使用each回调函数动态地往列表中附加一个新图片(图片的src属性将指向返回的JSON媒体图片的URL):
然后在每个动态生成的图片上,我们可以连接一个点击事件处理函数,在点击时,会通过动画效果来消失:
注意jQuery intellisense在我们代码的每一个层次都很干净地做了提示。
JavaScript Intellisense 技巧和诀窍
Web工具开发团队的Jeff King本星期早先时候撰写了一个很棒的贴子,对有关VS 2008中JavaScript intellisense工作原理的若干常见的问题做了回答,我高度推荐阅读该文。
他 谈到的一个诀窍(我要在这里做示范)是在你想要在用户控件/部分(.ascx文件)中使用JavaScript intellisense时可以使用的一个技术。经常地,你不想要在这些文件中包括对JavaScript库的<script src=""/> 引用,这些引用往往是存在于使用了用户控件的母版页或内容网页之上的。当然,问题是,你这么做的话,在默认情形下VS是无法知道用户控件中用到了这个脚 本,因此不会为你提供intellisense 。
启用intellisense的一个方法是,在你的用户控件中加<script src=""/>元素,但在其周围加一个服务器端的<% if %> 块,在运行时其值总是为false:
在运行时,ASP.NET不会显示这个脚本标识(因为是包含在一个总是为false的if块中的),但是,VS却会运算这个<script/>标识,在用户控件中为它提供intellisense。在象用户控件这样的场景下,这是个非常有用的技术。Jeff在他的FAQ贴子和原先的jQuery intellisense贴子里还有更多细节。Rick Strahl在这里也有一篇很好的贴子,是关于使用jQuery intellisense的。
更多信息
想进一步了解jQuery的话,我建议观看Stephen Walther在PDC大会上做的《ASP.NET和jQuery》讲座。点击这里下载他的代码例程和 powerpoint讲义。
Rick Strahl也有一篇非常棒的《Introduction to jQuery》文章,讨论如何在 ASP.NET使用jQuery。Karl Seguin 在这里和这里有2篇非常好的jQuery基础教程贴子,对如何使用jQuery的一些基本知识提供了比较简短的的概述。
我也高度推荐《 jQuery in Action》一书。
希望本文对你有所帮助,
Scott
翻译:Scott Guthrie 博客中文版

[C#]方法的直接调用,反射调用与……Lambda表达式调用

mikel阅读(948)

转载:http://www.cnblogs.com/JeffreyZhao/archive/2008/11/22/invoke-method-by-lambda-expression.html
想调用一个方法很容易,直接代码调用就行,这人人都会。其次呢,还可以使用反射。不过通过反射调用的性能会远远低于直接调用——至少从绝对时间上来 看的确是这样。虽然这是个众所周知的现象,我们还是来写个程序来验证一下。比如我们现在新建一个Console应用程序,编写一个最简单的Call方法。

class Program
{
static void Main(string[] args)
{
}
public void Call(object o1, object o2, object o3) { }
}

  Call方法接受三个object参数却没有任何实现,这样我们就可以让测试专注于方法调用,而并非方法实现本身。于是我们开始编写测试代码,比较一下方法的直接调用与反射调用的性能差距:

static void Main(string[] args)
{
int times = 1000000;
Program program = new Program();
object[] parameters = new object[] { new object(), new object(), new object() };
program.Call(null, null, null); // force JIT-compile
Stopwatch watch1 = new Stopwatch();
watch1.Start();
for (int i = 0; i < times; i++)
{
program.Call(parameters[0], parameters[1], parameters[2]);
}
watch1.Stop();
Console.WriteLine(watch1.Elapsed + " (Directly invoke)");
MethodInfo methodInfo = typeof(Program).GetMethod("Call");
Stopwatch watch2 = new Stopwatch();
watch2.Start();
for (int i = 0; i < times; i++)
{
methodInfo.Invoke(program, parameters);
}
watch2.Stop();
Console.WriteLine(watch2.Elapsed + " (Reflection invoke)");
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}

  执行结果如下:

00:00:00.0135323 (Directly invoke)
00:00:05.2325120 (Reflection invoke)
Press any key to continue...

  通过各调用一百万次所花时间来看,两者在性能上具有数量级的差距。因此,很多框架在必须利用到反射的场景中,都会设法使用一些较高级的替代方案 来改善性能。例如,使用CodeDom生成代码并动态编译,或者使用Emit来直接编写IL。不过自从.NET 3.5发布了Expression相关的新特性,我们在以上的情况下又有了更方便并直观的解决方案。

  了解Expression相关特性的朋友可能知 道,System.Linq.Expressions.Expression<TDelegate>类型的对象在调用了它了Compile方 法之后将得到一个TDelegate类型的委托对象,而调用一个委托对象与直接调用一个方法的性能开销相差无几。那么对于上面的情况,我们又该得到什么样 的Delegate对象呢?为了使解决方案足够通用,我们必须将各种签名的方法统一至同样的委托类型中,如下:

public Func<object, object[], object> GetVoidDelegate()
{
Expression<Action<object, object[]>> exp = (instance, parameters) =>
((Program)instance).Call(parameters[0], parameters[1], parameters[2]);
Action<object, object[]> action = exp.Compile();
return (instance, parameters) =>
{
action(action, parameters);
return null;
};
}

  如上,我们就得到了一个Func<object, object[], object>类型的委托,这意味它接受一个object类型与object[]类型的参数,以及返回一个object类型的结果——等等,朋友们 有没有发现,这个签名与MethodInfo类型的Invoke方法完全一致?不过可喜可贺的是,我们现在调用这个委托的性能远高于通过反射来调用了。那 么对于有返回值的方法呢?那构造一个委托对象就更方便了:

public int Call(object o1, object o2) { return 0; }
public Func<object, object[], object> GetDelegate()
{
Expression<Func<object, object[], object>> exp = (instance, parameters) =>
((Program)instance).Call(parameters[0], parameters[1]);
return exp.Compile();
}

  至此,我想朋友们也已经能够轻松得出调用静态方法的委托构造方式了。可见,这个解决方案的关键在于构造一个合适的Expression<TDelegate>,那么我们现在就来编写一个DynamicExecuter类来作为一个较为完整的解决方案:

public class DynamicExecutor
{
private Func<object, object[], object> m_execute;
public DynamicExecutor(MethodInfo methodInfo)
{
this.m_execute = this.GetExecuteDelegate(methodInfo);
}
public object Execute(object instance, object[] parameters)
{
return this.m_execute(instance, parameters);
}
private Func<object, object[], object> GetExecuteDelegate(MethodInfo methodInfo)
{
// parameters to execute
ParameterExpression instanceParameter = Expression.Parameter(typeof(object), "instance");
ParameterExpression parametersParameter = Expression.Parameter(typeof(object[]), "parameters");
// build parameter list
List<Expression> parameterExpressions = new List<Expression>();
ParameterInfo[] paramInfos = methodInfo.GetParameters();
for (int i = 0; i < paramInfos.Length; i++)
{
// (Ti)parameters[i]
BinaryExpression valueObj = Expression.ArrayIndex(parametersParameter, Expression.Constant(i));
UnaryExpression valueCast = Expression.Convert(valueObj, paramInfos[i].ParameterType);
parameterExpressions.Add(valueCast);
}
// non-instance for static method, or ((TInstance)instance)
Expression instanceCast = methodInfo.IsStatic ? null :
Expression.Convert(instanceParameter, methodInfo.ReflectedType);
// static invoke or ((TInstance)instance).Method
MethodCallExpression methodCall = Expression.Call(instanceCast, methodInfo, parameterExpressions);
// ((TInstance)instance).Method((T0)parameters[0], (T1)parameters[1], ...)
if (methodCall.Type == typeof(void))
{
Expression<Action<object, object[]>> lambda = Expression.Lambda<Action<object, object[]>>(
methodCall, instanceParameter, parametersParameter);
Action<object, object[]> execute = lambda.Compile();
return (instance, parameters) =>
{
execute(instance, parameters);
return null;
};
}
else
{
UnaryExpression castMethodCall = Expression.Convert(methodCall, typeof(object));
Expression<Func<object, object[], object>> lambda = Expression.Lambda<Func<object, object[], object>>(
castMethodCall, instanceParameter, parametersParameter);
return lambda.Compile();
}
}
}

  DynamicExecutor的关键就在于GetExecuteDelegate方法中构造Expression Tree的逻辑。如果您对于一个Expression Tree的结构不太了解的话,不妨尝试一下使用Expression Tree Visualizer来 对一个现成的Expression Tree进行观察和分析。我们将一个MethodInfo对象传入DynamicExecutor的构造函数之后,就能将各组不同的实例对象和参数对象数 组传入Execute进行执行。这一切就像使用反射来进行调用一般,不过它的性能就有了明显的提高。例如我们添加更多的测试代码:

DynamicExecutor executor = new DynamicExecutor(methodInfo);
Stopwatch watch3 = new Stopwatch();
watch3.Start();
for (int i = 0; i < times; i++)
{
executor.Execute(program, parameters);
}
watch3.Stop();
Console.WriteLine(watch3.Elapsed + " (Dynamic executor)");

  现在的执行结果则是:

00:00:00.0148828 (Directly invoke)
00:00:05.2488540 (Reflection invoke)
00:00:00.0618695 (Dynamic executor)
Press any key to continue...

  事实上,Expression<TDelegate>类型的Compile方法正是使用Emit来生成委托对象。不过现在我们已经 无需将目光放在更低端的IL上,只要使用高端的API来进行Expression Tree的构造,这无疑是一种进步。不过这种方法也有一定局限性,例如我们只能对公有方法进行调用,并且除了方法外的其他类型成员,我们就无法如上例般惬 意地编写代码了。

[C#]利用虚拟方法和反射简化Alisoft API的调用

mikel阅读(950)

利用虚拟方法和反射简化Alisoft API的调用

转载:http://www.cnblogs.com/doublog/archive/2008/11/21/1338065.html

最近一直在研究Alisfot api,他的文档和帮助都让我很郁闷,可能是第一次做这种开放api的程序吧.为了简化那些烦人的参数和返回值的调用,可以利用.net的匿名委托和反射机制来达到目的,简化后代码可以如下所示:

/// <summary>

/// 此接口方法以实现得到前台展示的店铺内卖家自定义商品类目。

/// </summary>

/// <param name="Nick"></param>

/// <returns></returns>

public List<SellerCat> sellercats_list_get(string Nick)

{

SellerCatsPar parSL = new SellerCatsPar();

parSL.sip_sessionid = sip_sessionid;

parSL.nick = Nick;

return APIUtils.Result<List<SellerCat>>(parSL, (string result) =>

{

NameValueCollection par = new NameValueCollection();

par.Add("ID", "cid");

par.Add("Name", "name");

par.Add("ParentID", "parent_cid");

return new XmlHandler<SellerCat>().ListItemByXml(result, "rsp/seller_cat", par);

});

}

现在是不是简单明了,只要关注于业务就可以啦.

   

第一次用office发文章,太晚了先发一点内容测试测试.:-)

据说 还能贴图 试试

图一

图一为阿里的API文档菜单,我看了一星期,硬没找到他的api列表(中间一直在看百度搜索到的一个老界面).今天才搞明白,原来我一直在 点右边红框的文字部分,他的内容竟然也变,但是树形菜单不会下拉.只有再点左边的图片才可以.也可以说是我智商的问题,但这里面也有一个用户体验的问题. 在做系统的时候会习惯的认为用户会按照自己的思维做事情,往往一个简单的东西,不同的人就会得到不同的结果.比如这个问题.如果不是因为我继续关注,阿里 的这个api我肯定会以为他没提供而放弃找其他的啦.

[Flex]Ensemble Visual Studio 的Flex插件

mikel阅读(1018)

转载自:http://www.asflex.cn/?p=589

今天在Forbes.com上看到《Ensemble Introduces Tofino, A Visual Studio Plug-In for Flex Applications

翻译一下吧。

Flex 是一个用于开发和维护Web程序(支持大部分的浏览器,桌面和操作系统)的免费开源框架。目前,大部分的Flex开发者都使用基于Eclipse(TM) 的Adobe(R) Flex(R) Builder(TM),用来开发、调试、部署RIA程序。为了让开发者使用Visual Studio,Ensemble Tofino提供了一个.Net的解决方案,让在.Net开发环境中开发Flex成为了可能。

“我们相信Ensemble Tofino将会帮助.Net开发者,因为使用相同的开发界面而不需要手动地调用Flex编译器,从而非常容易地将Flex的优点和.Net服务器语言联合起来。”,Ensemble 的主要技术部门负责人Ray Blaak说。

Tofino提供了一个 强劲的智能化编码和调试功能,同时可以通过Visual Studio相当创建项目。同时可以在Visual Studio中运行Flex程序,支持调试断点和堆栈信息显示,并且将会在Visual Studio的错误信息列表中显示错误信息。Tofino将会通过开源的Flex框架的形式向用户发放。

“我们知道许多的 Visual Studio开发者希望使用Flex去开发同类最佳的程序,同时也希望使用他们已经非常熟悉的工具”,Adobe 的产品经理Greg DeMichillie说,”我们非常荣幸地介绍Ensemble  Tofino,因为它使得Visual Studio开发者充分地使用Flex去开发企业级应用程序”.

目前Ensemble Tofino还是第一个Beta版本,同时后续的开发版本将持续得提高开发体验。更多的信息和下载在:http://www.ensemble.com

关于Ensemble

Ensemble (www.ensemble.com) 是一个Adobe的开发伙伴,专注于需求分析,体系结构,执行,部署所有的Adobe技术。特别是在Adobe(R) LiveCycle(R), Adobe(R) Flex(R), Adobe(R) AIR(TM)和Adobe(R) Acrobat(R)的集成方案.在政府,金融服务,媒体,公共出版和制造业部署Adobe技术拥有非常丰富的经验。基于 Vancouver,British Columbia,我们满足世界上任何地方人们的需要。

Tofino(82.59MB)下载:

http://www.ensemble.com/downloadables/products/Tofino/EnsembleTofino.msi

Attention:只支持Visual Studio 2008 /Windows Vista/XP

[Flash]MAX大会新闻

mikel阅读(814)

Cocomo发布beta版
http://www.flashcomguru.com/index.cfm/2008/11/17/cocomo-public-beta
Flash Media Server 3.5正式版公布
http://www.flashcomguru.com/index.cfm/2008/11/17/fms3_5-announced
Adobe air 1.5发布
http://get.adobe.com/air/
Thermo取名为Catalyst
http://labs.adobe.com/technologies/flashcatalyst
Flash Catalyst 小组博客
http://thermoteamblog.com/
Adobe与ARM联手提升手机上网体验
http://www.cnbeta.com/article.php?sid=69982
Adobe将发布Windows Mobile版Flash Player
http://www.cnbeta.com/article.php?sid=69970
Adobe Flash视频是否能如愿出现在iPhone上?
http://www.cnbeta.com/article.php?sid=70030
ColdFusion 新的IDE
New ColdFusion IDE Announced ("Bolt")

http://www.adobe.com/go/boltprerelease
http://labs.adobe.com/wiki/index.php/Bolt
C++ To AVM : Alchemy
http://labs.adobe.com/technologies/alchemy/
Server Side ActionScript 3.0: Coming to a ColdFusion Server Near You
http://www.joeflash.ca/blog/2008/11/61.html

[SQL]Select查询原理

mikel阅读(964)

转载自:http://www.cnblogs.com/ASPNET2008/archive/2008/11/19/1336329.html   
 我并非专业DBA,但做为B/S架构的开发人员,总是离不开数据库,一般开发员只会应用SQL的四条经典语句:select ,insert,delete,update。但是我从来没有研究过它们的工作原理,这篇我想说一说select在数据库中的工作原理。B/S架构中最经 典的话题无非于三层架构,可以大概分为数据层,业务逻辑层和表示层,而数据层的作用一般都是和数据库交互,例如查询记录。
      我们经常是写好查询SQL,然后调用程序执行SQL。但是它内部的工作流程是怎样的呢?先做哪一步,然后做哪一步等,我想还有大部分朋友和我一样都不一定清楚。 

     第一步:应用程序把查询SQL语句发给服务器端执行。

                我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。

     第二步:服务器解析请求的SQL语句。

                1:SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果。   

      

                 原因:

                     1):服务器在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的计划缓存中找是否有相对应的执行计划,如果存在,就直接调用已经编译好的执行计划,节省了执行计划的编译时间。
                     2):如果所查询的行已经存在于数据缓冲存储区中,就不用查询物理文件了,而是从缓存中取数据,这样从内存中取数据就会比从硬盘上读取数据快很多,提高了查询效率.数据缓冲存储区会在后面提到。

               2:如果在SQL计划缓存中没有对应的执行计划,服务器首先会对用户请求的SQL语句进行语法效验,如果有语法错误,服务器会结束查询操作,并用返回相应的错误信息给调用它的应用程序。

                 注意:此时返回的错误信息中,只会包含基本的语法错误信息,例如select 写成selec等,错误信息中如果包含一列表中本没有的列,此时服务器是不会检查出来的,因为只是语法验证,语义是否正确放在下一步进行。
               3:语法符合后,就开始验证它的语义是否正确,例如,表名,列名,存储过程等等数据库对象是否真正存在,如果发现有不存在的,就会报错给应用程序,同时结束查询。
               4:接下来就是获得对象的解析锁,我们在查询一个表时,首先服务器会对这个对象加锁,这是为了保证数据的统一性,如果不加锁,此时有数据插入,但因为没有加锁的原因,查询已经将这条记录读入,而有的插入会因为事务的失败会回滚,就会形成脏读的现象。
               5:接下来就是对数据库用户权限的验证,SQL 语句语法,语义都正确,此时并不一定能够得到查询结果,如果数据库用户没有相应的访问权限,服务器会报出权限不足的错误给应用程序,在稍大的项目中,往往 一个项目里面会包含好几个数据库连接串,这些数据库用户具有不同的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不同的操作选取不同的用户 来执行,稍微不注意,无论你的SQL语句写的多么完善,完美无缺都没用。
              6:解析的最后一步,就是确定最终的执行计划。 当语法,语义,权限都验证后,服务器并不会马上给你返回结果,而是会针对你的SQL进行优化,选择不同的查询算法以最高效的形式返回给应用程序。例如在做 表联合查询时,服务器会根据开销成本来最终决定采用hash join,merge join ,还是loop join,采用哪一个索引会更高效等等,不过它的自动化优化是有限的,要想写出高效的查询SQL还是要优化自己的SQL查询语句。
             当确定好执行计划后,就会把这个执行计划保存到SQL计划缓存中,下次在有相同的执行请求时,就直接从计划缓存中取,避免重新编译执行计划。
  第三步:语句执行。
              服务器对SQL语句解析完成后,服务器才会知道这条语句到底表态了什么意思,接下来才会真正的执行SQL语句。
   些时分两种情况:

            1):如果查询语句所包含的数据行已经读取到数据缓冲存储区的话,服务器会直接从数据缓冲存储区中读取数据返回给应用程序,避免了从物理文件中读取,提高查询速度。

            2):如果数据行没有在数据缓冲存储区中,则会从物理文件中读取记录返回给应用程序,同时把数据行写入数据缓冲存储区中,供下次使用。
            说明:SQL缓存分好几种,这里有兴趣的朋友可以去搜索一下,有时因为缓存的存在,使得我们很难马上看出优化的结果,因为第二次执行因为有缓存的存在,会特别快速,所以一般都是先消除缓存,然后比较优化前后的性能表现,这里有几个常用的方法:
DBCC DropCLEANBUFFERS
从缓冲池中删除所有清除缓冲区。
DBCC FREEPROCCACHE
从过程缓存中删除所有元素。
DBCC FREESYSTEMCACHE

  从所有缓存中释放所有未使用的缓存条目。SQL Server 2005 数据库引擎会事先在后台清理未使用的缓存条目,以使内存可用于当前条目。但是,可以使用此命令从所有缓存中手动删除未使用的条目。

 

    这只能基本消除SQL缓存的影响,目前好像没有完全消除缓存的方案,如果大家有,请指教。
     结论:只有知道了服务执行应用程序提交的SQL的操作流程才能很好的调试我们的应用程序。
            1:确保SQL语法正确;
            2:确保SQL语义上的正确性,即对象是否存在;
            3:数据库用户是否具有相应的访问权限。

注:

   本文引用:

http://database.ctocio.com.cn/tips/210/7791210.shtml
http://tech.it168.com/a2008/0805/199/000000199573.shtml

[Flex]Java正在让位于Flex吗?

mikel阅读(840)

Java正在让位于Flex吗?

作者 Moxie Zhang译者 张龙 发布于 2008年11月15日 上午8时14分

社区
Java
主题
RIA
标签
Flex,
ActionScript

随着富Internet应用(RIA)技术的不断成熟,开发者可选择的余地也越来越大了,这样他们就不可避免地会对已有的技术如Java造成冲击。最近,游戏开发公司Sharendipitous Moments发表了一篇名为“我们正转向Flash,这就是原因”的博文,讨论了Java是否正在让位于RIA技术,如Flex。

这篇博文首先说到Java技术依然很棒:

Java语言要远远优于ActionScript,Java编译器也更加先进。Java能做的事情更多。还有,尽管Flex Builder构建在Eclipse之上,而针对Java的Eclipse开发环境已经出来好几年了。但公正的说,我们只是将800个类和将近 60,000行的Java代码转化为了ActionScript。

Sharendipitous Moments之所以转到基于Flash的开发(Flex),主要原因在于Java的品牌。该博文说到:

Java的品牌太失败了。Sun很早就鼓吹JavaFX是用来拯救Java的,但它的发布时间太长了。同时,Flash继续占据着统治地位。Silverlight也是一个竞争者,但它还需要很长一段时间才能达到Flash那样的市场占有率。

根据这篇博文所述,品牌失败导致的结果是:“如果你看到Java applet正在被加载,那么你就会在页面上随便点一个链接而转向其他页面。”

很多开发者并不认可Sharendipitous Moments的观点。正如一个开发者所说:

没人用Flex处理关键的事情。但是这篇博文的博主却不敢苟同。他们都在说Java有多么地差,Flash是多么地好。具备即时 编译JavaScript能力的浏览器即将面世。你认识到这一点了么?Flash的目标不是Java,而是完全基于浏览器的应用。同时,Java既可以应 用在服务器端,也可以应用在客户端。

然而另一些开发者与Sharendipitous Moments的立场是一样。例如,Artima Developer的高级编辑Frank Sommers说到:“我刚刚将一个规模庞大的Swing应用移植到了Flex上,整个过程让我非常满意。我真正缺少的东西就是一个好的IDE,如 IntelliJ。Flex Builder 3要想达到IntelliJ那样的高度还有很长一段路要走”。

来自Sun的Ken Russell也加入了这场争论:

我对Sharendipity(很有特点的JOGL应用之一)迁移到Flash感到很失望。我们刚在Java SE 6 Update 10中完成了对Java Plug-In的重写,这会使Java applet的部署更加可靠、强大且轻便。6u10现在可以用在Linux、Solaris及Windows上,同时Sun也正在积极地与Apple合作 以完成Mac版本。对于重新激起Java平台上的客户端开发来说,这是万里长征的第一步。

软件开发咨询师Martin Wildam的态度比较中立:

我觉得你的想法站不住脚。从一般用户的角度来看,我觉得你说的很对,因为他们很可能在看到Java starting之前就已经转到别的页面去了。但我记得Flash的加载时间更长。用户是不会认识到这一点的,因为出现在他们面前的只是不同的动画而已。 如果总是看到相同的Flex-loading图标,他们很可能也不会再等了。

Java World说到

与此同时,Java Lobby上的一篇文章对于Java开发者转到Adobe RIA平台很有帮助。但这对于可怜的JavaFX来说还不是世界末日,Artima Developer的Frank Sommers认为还在发展初期的RIA语言从Swing中借鉴了大量的东西

该博文的作者Dale Beermann对以上讨论进行了总结,他说到:“我喜欢这种对话。这种讨论是没有限制的,我渴望不同的声音。来吧,朋友”。

查看英文原文:Is Java losing Ground to Flex?

[MVC]让ASP.NET MVC页面返回不同类型的内容

mikel阅读(745)

ASP.NET MVC的controller中大部分方法返回的都是ActionResult,更确切的是ViewResult。它返回了一个View,一般情况下是一 个HTML页面。但是在某些情况下我们可能并不需要返回一个View,我们可能需要的是一个字符串,一个json或xml格式的文本,一个图片。
ActionResult是一个抽象类,我们平时比较常用的ViewResult是它的派生类,所以我们也可以写一个StringResult、 XmlResult、ImageResult来实现上面提到的需求。由于返回字符串可以有更简单的方法,直接将需要返回字符串的方法的返回值设置成 string型就可以了,JsonResult在ASP.NET MVC中已经有提供。所以下面只演示XmlResult和ImageResult。
ASP.NET MVC项目是开源的(可以在http://www.codeplex.com/aspnet下载源代码),所以我们可以参考其中ViewResult和JsonResult的代码进行改写。主要的思路是设置返回数据流HTTP Header中的Content-Type,然后将要返回的内容写入Response中。


先演示XmlResult

XmlResult的代码:

 

 1 public class XmlResult:ActionResult
 2     {
 3         // 可被序列化的内容
 4         object Data { getset; }
 5 
 6         // Data的类型
 7         Type DataType { getset; }
 8 
 9         // 构造器
10         public XmlResult(object data,Type type)
11         {
12             Data = data;
13             DataType = type;
14         }
15 
16         // 主要是重写这个方法
17         public override void ExecuteResult(ControllerContext context)
18         {
19             if (context == null)
20             {
21                 throw new ArgumentNullException("context");
22             }
23 
24             HttpResponseBase response = context.HttpContext.Response;
25 
26             // 设置 HTTP Header 的 ContentType
27             response.ContentType = "text/xml";
28 
29             if (Data != null)
30             {
31                 // 序列化 Data 并写入 Response
32                 XmlSerializer serializer = new XmlSerializer(DataType);
33                 MemoryStream ms = new MemoryStream();
34                 serializer.Serialize(ms,Data);
35                 response.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
36             }
37         }
38     }

在controller中调用它

1 public ActionResult Xml()
2         {
3             // 创建一个DemoModal对象,No属性为1,Title属性为Test
4             DemoModal dm = new DemoModal() { No = 1, Title = "Test" };
5 
6             // 序列化为XML格式显示
7             XmlResult xResult = new XmlResult(dm, dm.GetType());
8             return xResult;
9         }

 

显示出来的结果

 

下面演示的是ImageResult

ImageResult的代码

 1 public class ImageResult:ActionResult
 2     {
 3         // 图片
 4         public Image imageData;
 5 
 6         // 构造器
 7         public ImageResult(Image image)
 8         {
 9             imageData = image;
10         }
11 
12         // 主要需要重写的方法
13         public override void ExecuteResult(ControllerContext context)
14         {
15             if (context == null)
16             {
17                 throw new ArgumentNullException("context");
18             }
19 
20             HttpResponseBase response = context.HttpContext.Response;
21 
22             // 设置 HTTP Header
23             response.ContentType = "image/jpeg";
24 
25             // 将图片数据写入Response
26             imageData.Save(context.HttpContext.Response.OutputStream, ImageFormat.Jpeg);
27         }
28     }

在controller中调用

 

 1 public ActionResult Img()
 2         {
 3             // 获取博客园空间顶部的banner图片
 4             WebRequest req = WebRequest.Create("http://space.cnblogs.com/images/a4/banner.jpg");
 5             WebResponse res = req.GetResponse();
 6             Stream resStream = res.GetResponseStream();
 7             Image img = Image.FromStream(resStream);
 8 
 9             // 输出给客户端
10             ImageResult r = new ImageResult(img);
11             return r;
12         }

结果图

这个比较多用在向客户端传送验证码图片时。

 

 转载:http://www.cnblogs.com/Snowdreams/archive/2008/11/15/let-aspnet-mvc-view-return-different-type-content.html

 

[C#]BlogEngine.Net架构与源代码分析系列part15:总结篇

mikel阅读(1044)

     本文是这个系列的总结篇,在这篇文章里,仅从我个人的角度发表一下对BlogEngine.Net的一些看法。内容包括BlogEngine.Net的优缺点,性能问题,如何阅读源代码等。

     重申一下写这个系列的目的

1.使自己更加深入的理解BlogEngine.Net的架构,对BlogEngine.Net的代码能够更深刻的掌握。
2.给那些想学习BlogEngine.Net的源代码,但是不知道从何开始或者比较迷茫的朋友们一个学习指南。
3.在博客园上永远的保存下来,方便你我查看。因为这方面的资料实在太少了。

     关于如何阅读源代码

     其实BlogEngine.Net的注释已经很清晰了,但是由于它确实很大,很强 壮,我在学习它的源代码时还是走了不少弯路,曾经放弃过很多次,不过最后还是找到了感觉。BlogEngine.Net的最大特点就是麻雀虽小,五脏俱 全,从使用上看不到太多,但是它里面的东西真是很经典,设计和实现得很漂亮。我个人觉得我们在研究它时只要坚持以下几点就行了:
1.按照文章的顺序一块一块的研究:这个系列的写作顺序就是我觉得最佳的学习路线。
2.坚持住整体把握,细致入微的原则。也就是对它的源代码该宏观考虑的时候就要宏观考虑,该细细推敲的时候就要细细推敲。看代码时首先看看这段代码大概是做什么的,之后再去一行一行的看。对于弄不明白的地方,可以先放在一旁,以后你自然会知道的。
3.对于不确定的部分要一边调试一边看,就是F10,F11这样看。

     关于BlogEngine.Net的性能问题的一点看法

     BlogEngine.Net最初是一个单人博客,目前支持多人写博客,但是和 cnblogs这种社区博客还是有大区别的。其实我觉得BlogEngine.Net的市场定位也就是使用托管服务的单人博客系统。从它的实现代码中我们 可以看出对于Post等的处理方式是从持久存储设备完全填充到内存中的对象,评论中有的朋友提出这样处理的内存膨胀问题。其实我的看法是这样的,像 BlogEngine.Net这种市场定位的Blog系统中的Post再多也多不到哪去,Post中等存储的都是纯文本,对于图片,文件等大资源还是存储 在磁盘上的,这样的需求完全可以满足。再者BlogEngine.Net支持导出备份,我们完全可以在一定情况下将一些Post文本部分导出成 BlgoXML格式存储起来,之后删除一些Post,但是那些图片等依然保存不动,这样HttpHandler处理时依然有效。那么 BlogEngine.Net这样处理业务对象带来了什么好处呢?我觉得主要有以下两点:

1.控制上的灵活,数据的控制完全交给了业务对象,数据库等只是一个持久存储功能。

2.性能上的提升,BlogEngine.Net的那种搜索方式只能使用这样的业务对象数据处理方式才可以满足。

所以BlogEngine.Net在大用户量下的优势我觉得就会很明显,这也是这样的博客系统所需求的。我觉得像BlogEngine.Net这样的系统架构适合于应用在数据是动态的,数据量不是很大,但是用户量很多的系统设计中。

     BlogEngine.Net的特性和优缺点

     关于BlogEngine.Net的特性,大家可以参照一下官方的说明,表格上说明的很全,大家在阅读源代码时可以参照它,如果您弄清楚了所有这些特性的源代码,你实际上也就掌握了它。对于BlogEngine.Net的优缺点总结也都是我自己的个人看法,仅供参考,也欢迎大家讨论。

值得参考:
1.支持很多现有的XML标准格式,例如BlogXML,Apml,Rss等。
2.架构设计得很好,利用了很多面向对象设计的特性。很多地方使用了继承。
3.最大限度的利用了.Net Framework已有资源,例如Provider等。
4.很好的利用了C#的语言特性,例如泛型,特性等。
5.正则表达式,缓存等大量应用。
6.开发扩展的设计部分。Extension,Widget等扩展模型。
7.自定义的HttpHandler和HttpModule应用得很合适。
8.部分代码实现应用到了几个典型的设计模式带来了更好的解决办法。
9.Ajax的使用也很合适,达到了一定的页面效果。
10.代码分隔的很好,结构很清晰。

……

不推荐部分:
1.ExtensionManager部分还有待完善(前面有一篇文章提及过)。
2.Ajax在线预览有些地方不够完美(上文也提及过)。
行了,给BlogEngine.Net点面子,就先说这两点吧,实际上也想不出来了,因为我觉得它真是太完美了,也可能是我见识短吧。BlogEngine.Net的团队很优秀。

     结束语

     第一次写系列的文章,以前单篇文章也很少发布,现在知道写文章很不容易啊!最主要的是我的这个系列文章能给大家带来收获,哪怕一点点,我就会很高兴。

     博客园是一块圣地,我把我两周以来收获的果实种在这块圣地上,希望能给匆匆茫茫的过客带来一点收获。

     最后一句话:BlogEngine.Net真的是一件好东西!

     本系列完!祝大家学习愉快,工作顺利!

     上一篇:BlogEngine.Net架构与源代码分析系列part14:实现分析(下)——网站页面上值得参考的部分

 

     返回到目录

版权声明
作者:Thriving.country
出处:http://thriving-country.cnblogs.com/
本文版权归作者和博客园共同所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.