[JQuery]Jquery弹出层插件Thickbox使用心得

mikel阅读(857)

Jquery弹出层插件Thickbox使用心得

   前段时间在建设银行项目上用EXT完整做了个单页系统,太赶了,没有记录下任何东西,现在都忘了,怪可惜的。这次项目用JQuery做js的东西。主要用了个弹出层控件thickbox,自己也扩展和修改了一下。这里就记下来,也提供大家下载,希望对大家有用吧。

  thickbox官方网站(上面有例子和基本的使用方法):http://JQuery.com/demo/thickbox/

  就我使用过程中,thickbox常见问题:

  1。跨iframe的弹出层。

   症状:每次thickbox都只在frame中弹出,而不会整个屏幕覆盖

  原因和解决方法:

          thickbox使用tb_show()函数在body后面加入弹出层。可以使用window.top.tb_show()把弹出层加到页面上。我的tihickbox插件中修改如下:在tb_init()中把tb_show(t,a,g)替换如下

  if(a.indexOf('TB_iniframe'!= 1
     {  
          window.top.tb_show(t,a,g);  
     }  
     
else  
     {  
      tb_show(t,a,g);  
     }  

 这样只只要在原来的链接上加入TB_iniframe=true即可,如div.aspx?height=180&width=400&TB_iframe=true&TB_iniframe=true&modal=true

   2.thickbox只支持一层弹出,不可支持多层弹出。

       修改过的控件已经支持(不足:ie6下失效弹出层失效了,占时没解决,哈哈)

  3. 弹出层关闭后,文本框无法聚焦。

    症状:关闭弹出层后,原来页面上的文本框无法聚焦

    原因和解决方法:这个的原因不好说,很多人都认为是ie本身的bug。是由于iframe没有移除,即使移除了。内存上也么有清除造成的。 这也是我猜的。哈哈。解决方法是在tb_remove()中先手动移除iframe然后,在强制做垃圾回收,至少我是可以啦。哈哈。代码如下:

 1function tb_remove() {
 2    var seq=PopSeq();
 3     $("#TB_imageOff"+seq).unbind("click");
 4     $("#TB_closeWindowButton" + seq).unbind("click");
 5
 6     $("#TB_window" + seq).fadeOut("fast", function() {
 7         ///手动移除ifrmae,IE的一个bug
 8         $('#TB_iframeContent' + seq).remove();
 9         $('#TB_window' + seq + ',#TB_overlay' + seq + ',#TB_HideSelect' + seq).trigger("unload").unbind().remove();
10        ///自己调用垃圾回收,强制清楚iframe内存,解决文本框无法输入问题。
11         CollectGarbage();
12     }
);
13    if (typeof document.body.style.maxHeight == "undefined"{//if IE 6
14        $("body","html").css({height: "auto", width: "auto"});
15        $("html").css("overflow","");
16    }

17    document.onkeydown = "";
18    document.onkeyup = "";
19    return false;
20}

 

 4.在ASP.NET中如何动态设置需要的参数和关闭弹出层。

症状:thickbox提供的例子都是需要在input后a的class加thickbox,而且参数什么都是固定的。 而我们传递的参数一般需要动态。

解决方法,使用ASP.NET ajax,不多说了。直接看代码吧。

封装一个popup类,

 1public class Popup
 2{
 3    /// <summary>
 4    /// show the pop up div
 5    /// </summary>
 6    /// <param name="panel">container the button</param>
 7    /// <param name="url"></param>

 8    public static void ShowPopup(UpdatePanel panel, string url)
 9    {
10        ScriptManager.RegisterClientScriptBlock(panel, panel.GetType(), "ShowPopup""ShowPopup('" + url + "')"true);
11    }

12
13    /// <summary>
14    /// 
15    /// </summary>
16    /// <param name="panel"></param>
17    /// <param name="page">request page</param>

18    public static void ClosePopup(UpdatePanel panel)
19    {
20
21        string js = " self.parent.tb_remove();";
22
23       ScriptManager.RegisterClientScriptBlock(panel, panel.GetType(),"closepopup", js, true);
24    }

25}

 需要的js

1function ShowPopup(url) {
2    window.top.tb_show(null, url, false);
3
4}

 页面上例子

1///add按钮需要放在updatepanel里面   
2 protected void btnAdd_Click(object sender, EventArgs e)
3    {
4///自己组参数
5        string url = "aa.aspx?height=180&width=400&Type="+ddlType.SelectedItem.Value;
6        url += "&TB_iframe=true&TB_iniframe=true&modal=true";
7        Popup.ShowPopup(this.upButtons, url);
8    }

[MVC]融合思想:深入探索S#arp架构

mikel阅读(995)

开发Web应用程序是痛苦的。无论是组织与测试AJAX脚本,还是在无状态环境下模拟状态,开发Web应用程序需要在计划和开发的各个阶段中,全神贯注,专心致志。Web开发人员还要面对开发中的诸多挑战,例如对象与关系的不匹配;在纷繁复杂的选项中选择最合适的工具提高开发效率;在项目中应用良好的架构,在保证代码具有可维护性的同时,不至于影响项目的交付。种种问题都使得开发形势变得越发严峻。

一切都在发展之中。不断涌现出的技术与技能虽然正在逐步解决这些开发中的难题,但没有任何一个可以单独扮演银弹的角色。但是通过对各种技术的权衡,精心挑选技术与技能,还是可以在不牺牲质量的前提下,大幅度地提高开发效率与可维护性。本文关注于Web开发的主流发展方向,通过使用S#arp架构,这是基于ASP.NET MVC的一个框架,荟萃了这些技术与技能的精华,从而为客户贡献价值。

赢得关键阶段的技术趋势

如果要用一个词来描述软件开发这个行业,毫无疑问,这个词语就是“变化”。比起那些历史久远的学科如土木工程学,我们这个行业不过是刚刚兴起,还处于萌芽状态。我们正在成长,而成长的烦恼就是行业自身经历的大量变化,而且看起来这样的变化还会持续一段时间。

这种变化可谓屡见不鲜。一个例子是项目管理方法学,由于其走向误区而带来的惨痛经历,它经历了大起大落,从一棵冉冉升起的“明星”,迅速衰落至默默无闻。另一个例子是有关技术的兴衰,长江后浪推前浪,新技术总是后来居上,取代旧的技术。以ASP.NET中的MVP(Model View Presenter)模式为例,该设计模式虽然为ASP.NET引入了更好的可测试性,但却增加了复杂程度。最近,微软引入了ASP.NET MVC用 来取代ASP.NET,它将之前ASP.NET实现的可测试性提升了一个新的台阶。由于要考虑.NET web开发的可测试性,MVP模式总是将控制器逻辑放在ASP.NET页面后面的代码(code behind)中,而ASP.NET MVC则抛弃了MVP的这种做法。这并不是说MVP隐含的原则到现在已经无效,而是随着这项技术的出现,通过使用适当的关注分离,可以更好的简化MVP实 现可测试性的目标。

因此,虽然软件行业仍然变化莫测,但技术发展的特定趋势与设计理念,仍然构成了开发与交付高质量可维护项目的基础。或许,这些理念的实现会随着时间 的推移而发生变化,但理念本身却是成功软件的坚实基础,能够持续地影响着软件开发。下面,我将简要地回顾这些设计理念,它们在关键阶段所获得的成功,已被 开发社区所广泛接受,因而对未来的软件开发产生了深远的影响。

抽象的基础功能

在不久之前,我还在为一个新对象编写CRUD功 能而被搞得焦头烂额。这项工作就像重新粉刷我的房子一样,费力而不讨好。充斥的大量重复代码,也成为了错误的多发地带。从编写存储过程与ADO.NET的 适配器,到测试片断的JavaScript验证代码,我发现我每天都将大把精力投入到了这些基础功能细节的实现上,以至于在我写完这些代码之后,巴不得赶 尽将它们抛诸脑外。

范式的转换在过去十年间已经发展成熟,其中关于基础功能的实现细节,属于最底层的工作,最好能够交给专门的工具来完成。面临的挑战是需要为这项工作找到合适的工具,既要允许软件忽略这些实现细节,又要保证基础功能可以使用。NHibernate是 这类工具的典范。它能够处理普通的.NET对象与关系数据库之间的持久化。采用这种方式,它就能够让对象自身完全忽略如何实现持久化,又能够解决对象与关 系之间的不匹配。而且,它不需要编写任何一行ADO.NET代码或者存储过程。NHibernate是一个非常棒的工具,更重要的是它实现了一个远大目 标,通过提供一个固定的解决方案,避免乏味而又琐碎的基础功能实现。要知道,这些实现在过去可是开发活动的重要组成部分。

随着时间的推移,软件行业引入了大量成熟的工具与技术,对这些乏味无趣的基础设施构建进行抽象,然后在开发完成后再进行设置。例如,随着NHibernate的逐渐成熟,那些附加的插件,例如Fluent NHibernate具有自动映射的能力,完全能够减轻管理数据访问的负担。这一现象印证了Douglas Hofstandter著作Gödel, Escher, Bach中提到的预言,即:采用合理的抽象是软件开发的发展之道,需大力提倡。

松散耦合

遗留软件系统最常见的毒瘤是紧耦合。(我在这儿使用的“遗留”一词,指的是那些其他开发人员强加给你的破烂软件,或者是你自己在很多年前开发的破旧 系统)紧耦合的例子多不胜数,例如两个对象之间存在双向依赖;具体依赖于服务的对象如数据访问对象;还有在单元测试中,如果依赖的服务断开或不可用,就无 法测试服务的行为。紧耦合会导致脆弱的代码,使代码难以测试。修改紧耦合的代码,会让开发人员视如畏途,不战而降,甚至逃之夭夭。毫无疑问,一个成功软件 的关键就是松散耦合。

维基百科将松散耦合解释为“两个或多个系统之间的弹性关系。”因此,松散耦合带来的好处就是你能够修改编程关系的任何一方,却不会影响另外一方。举例说明,在我看来,没有哪个设计模式能够比接口隔离,别名为依赖倒置(不要与依赖注入混为一谈)更能够说明松散耦合的思想了。该技术通常会用于将数据访问层从领域层中分离。

例如,在一个MVC应用程序中,控制器或者应用服务需 要与数据访问的仓储(repository)对象通信,以获取数据库中的项目个数。(本例中的仓储指的是“服务”)要满足这一需求,最简单的办法是让控制 器建立一个新的仓储对象的实例。换句话说,控制器创建了一个指向仓储对象的具体依赖;例如通过new关键字。遗憾的是,这种方法会导致紧耦合的诸多不良后 果:

  • 没有真实的数据库支持对仓储的查询,就很难对控制器进行单元测试。要求真实的数据库,会导致单元测试变得脆弱,一旦数据被前 一次运行的测试所修改,就会带来问题。在测试控制器逻辑时,我们应集中关注验证控制器的行为,而不是它所依赖的仓储对象能否成功地与数据库进行通信。此 外,测试一个“真实的服务”,例如在刚才提及的例子中,与真实数据库通信的仓储服务,会使单元测试的运行变得像老牛拉破车一般的缓慢;结果会让开发人员停 止运行单元测试,从而损害了代码的质量。
  • 如果不修改实例化服务的控制器,就难以替换服务(仓储服务)的实现细节。假如你希 望将仓储从ADO.NET改为支持Web Service,由于包含了一个与前者之间的具体依赖,如果不对实例化以及使用它的控制器进行大量修改,就无法轻易地将其替换为后者。在多数情形下,一旦 变化发生,就会导致霰弹式修改——这是说明这一问题的另一种坏味道。
  • 无法确定控制器实际拥有的服务依赖的个数。换句话说,如果控制器正在调用一些服务依赖的创建功能,则开发人员很难确定其逻辑边界,或职责范围。作为替代,控制器的依赖可以通过其构造函数传入,这样就能够使开发人员更容易理解控制器的整个职责范围。

替代方案是把服务依赖作为控制器构造函数的参数。这种做法带来的关键改善就是控制器只需要了解服务依赖的接口,而不是具体的实现。为了进一步说明,可以比较下列两段在ASP.NET MVC应用程序中的控制器代码。

如下的控制器直接创建了它的服务依赖CustomerRepository,也就相应拥有了一个具体的依赖:

public class CustomerController {

   public CustomerController() {}

   public ActionResult Index() {

      CustomerRepository customerRepository = new CustomerRepository();

      return View(customerRepository.GetAll());

   }

}

相反,如下的控制器则将服务依赖作为接口参数传递给它的构造函数。也就是它与服务依赖形成了松耦合关系。

public class CustomerController {

   public CustomerController(ICustomerRepository customerRepository) {

      this.customerRepository = customerRepository;

   }

   public ActionResult Index() {

      return View(customerRepository.GetAll());

   }

   private ICustomerRepository customerRepository;

}

对比紧耦合的缺陷,这种清晰的分离方式带来了诸多好处:

  • 领域层对于如何创建仓储对象以及它的实现细节一无所知,它只需调用公开暴露的接口。因此,它不需要修改控制器自身,就能很容易地更换数据访问的实现细节(例如从ADO.NET切换到Web Service)。这基于一个假定,两者实现的接口是相同的。
  • 依赖于接口而不是具体实现,在单元测试时更容易将仓储的测试替身(test double)对象注入。这就保证了单元测试能够快速运行,避免维护数据库中的测试数据,从而将测试的注意力放到控制器的行为上,而不是与数据库的集成。

这里并没有详细阐述依赖注入必须支持一个分离的接口和其它松耦合技术。更详细的讨论请参考文章依赖注入实现松耦合。(注意,在这篇文章中描述的“仿(mock)”对象实际上是“桩(stub)”对象。它与“测试替身(test double)”的术语来源于Martin Fowler的Mocks不是Stubs)。此外,将服务依赖重构到接口隔离一文详细地介绍了如何将设计转为接口隔离设计模式。

测试驱动开发

简而言之,测试驱动开发(TDD)能够有效交付高质量、可维护的软件,全面地简化设计。作为一项开发技术,测试驱动开发绝不会是昙花一现;它受到了越来越多的吹捧,是能够决定软件开发成败的关键,推动了我们这个行业逐渐走向成熟。

TDD隐含的基本思想是带着疑问开始软件开发,在开发过程中要不停地询问系统。例如,倘若你正在开发一个银行系统,可能需要询问系统,它有能力成功 处理客户的存款业务吗?关键之处在于要在实现行为细节之前提出问题。随之而来的好处就是在编写系统之前,它能够让开发者将注意力放到系统要求的行为上。

若要遵循测试驱动开发的指导原则,需按照如下步骤进行编码:

  1. 假设目标对象以及要求的行为已经存在,编写测试。
  2. 编译解决方案,此时会看到编译失败。
  3. 编写足够的代码使程序通过编译。
  4. 运行单元测试,测试失败。
  5. 编写足够的代码使得单元测试通过。
  6. 若有必要,进行重构

测试驱动开发虽然没有什么变化,但在日常的开发活动中对它的应用却还在发展之中。例如,测试驱动开发最近的发展方向是行为驱动开发;该方法试图弥补“代码编写的技术语言与商务运用中的领域语言之间”的鸿沟。换句话说,行为驱动开发将TDD与后面介绍的领域驱动设计(或者是与你喜欢的其它方法)结合了起来。

领域驱动设计

从近日的发展趋势来看,领域驱动设计(DDD)可 谓风光无限。该方法将软件开发的注意力放在了领域与领域逻辑上,而不是技术以及支持技术方案的关系数据库模型。和行为驱动设计一样,DDD提出了大量的技 术与模式,以改善客户与开发团队的协作关系,在描述语言上达成一致。理想情况下,客户应该能够理解DDD应用程序的领域层,而编码逻辑也能够完整地反映客 户的业务逻辑。

我试验了各种方法,得出的结论是:领域驱动设计是早期编程方法的一种自然进化,例如针对数据库数据进行模型驱动开发,其对应的模型可以视为应用程序的核心,要做的工作就是操作数据。(Castle ActiveRecordADO.NET实体框架都是非常稳定和优秀的模型驱动设计工具。)相反,在DDD中,数据库则被视为一种必要的基础设施细节,能够支持领域及相关逻辑。事实上,正所谓“万法皆空”,在DDD中本来就没有数据库。虽然,领域驱动设计需要数据库,但关键在于领域对于持久化机制(实现数据存储与获取的机制)应该是一无所知的。

而且,领域驱动设计不仅仅是将数据持久化从领域中分离出来。它的主要目的是让领域对象自身拥有领域行为。例如,我们不能分离出 CustomerAccountLogic类,并由它来决定CustomerAccount是否取决于付款日期,而是要求CustomerAccount 自身维护这一信息。采用这种方式,领域的行为是与模型自身是合二为一的。

以上介绍仅仅是运用DDD进行软件开发技术的冰山一角。若要了解领域驱动设计的更多信息,可以阅读文档领域驱动设计快速入门,它是Eric Evans经典著作《领域驱动设计》的简明摘要。

在S#arp架构中融入这些思想

每个项目都其独特的需求,也没有哪个框架能够尽善尽美,对于开发Web应用程序而言,这是机会与挑战共存的局面。但是在面临众多选择时,开发人员很 难做出判断,哪些工具和技术适合给定的项目,并让开发中通常遇到的挑战能够迎刃而解。例如,如果你正在寻觅一个.NET依赖注入工具——或者说控制反转容器——可以选择Spring.NET(它远远不只是提供IoC功能)、UnityCastle WindsorNinjectStructureMap,以及更多。这还只是对于IoC的选择!让事情变得更糟糕的是,我们需要明智地规划,恰如其分地在架构中权衡各种工具与技术,这是一项极具挑战的工作。

在.NET Web开发中,至少在当前还缺乏一个通用的架构与基础,可以在程序开发中对各种技术与技巧进行最优组合,根据已经被证实的实践来选择最近的技术,以及由开源社区开发的优质工具。S#arp架构正是基于这样的前提应运而生。开源的S#arp架构试图利用本文介绍的业已证明行之有效的实践,谨慎地选择工具以提高开发效率,保证系统高质高量,以及良好的可维护性。

S#arp架构使用的工具与技术如下所示:

选择的这些技术与工具表明,虽然软件开发没有奇妙的银弹,但选择一个稳定的开发实践,并结合适当的工具,就能带来巨大的价值。

领域驱动架构将它们串联在一起

我认为,被封装到S#arp架构中的关键思想,就是颠倒领域与数据访问层之间关系的一种技术。在通常的应用架构中,尤其是与微软推荐的架构紧密相关的,其依赖关系都是从表示层开始自上而下,依赖于业务层,最后依赖于数据层。虽然这是对实现细节的过度简化,但它通常会建议将数据层作为最底层,被其他层依赖;这正是根据设计进行模型驱动。

虽然模型驱动方式自有其优势,也适用于众多解决方案,但却不符合本文提出的领域驱动的目标。让领域直接依赖于数据层,会造成另一种弊端,就是引入领 域对象与数据访问代码之间的双向依赖。我的前任教授Lang博士说道,只有不断犯错误,最后才能成为这个领域的专家。我正在努力成为一名专家,我已经认识 到领域对象与数据访问代码之间存在的双向依赖,它们正是麻烦的渊薮。(这个深刻教训使我在成为专家的道路上能够登堂入室。)

那么,我们该如何冲破这重重迷雾,让设计清晰地呈现这些思想呢?解决之道就是明确地分离各种应用关注点,颠倒领域与数据访问层之间的关系,也就是在 领域层定义分离的接口,让数据访问层进行实现。采用这种方式,则应用程序的所有层都只依赖于数据访问(或其它外部服务)层的接口,从而保证对实现细节的一 无所知。这会让设计变得松散耦合,更易于进行单元测试,而在项目开发的维护阶段,系统会变得更加地稳定。

下图演示了S#arp架构所主张的体系架构,使用接口隔离模式反转了传统的领域与数据访问层之间的依赖关系。每个box表示一个单独的物理程序集,箭头则表示了依赖关系及其依赖方向。

ddd

注意,图中的数据层定义了仓储的具体实现细节,它依赖于核心的领域层。在核心层中,除了定义领域模型和逻辑,还定义了仓储接口,该接口可以被其他各 层所调用,例如应用服务层会与仓储通信,这就保证了它独立于其实现细节。某些建议认为表示层(在图上方的YourProject.Web)不应直接依赖于 领域层。作为替代,可以引入数据传输对象(DTO),从而在数据传递给视图展现时,更好地将领域层从表示层中分离。

怎么做?

我们工作的底线是,软件交付专家们必须及时交付解决方案,且要符合客户的需求,并具有高质量和可维护性。很多实践都经过了千锤百炼,所谓“前人栽 树,后人乘凉”,在个人的应用程序中,我们不必重新创造,只需求助于经过验证而又真实的设计模式,以及基本工具的实现,就能够解决开发中的常见问题,例如 数据持久化和单元测试。真正的挑战在于要合理地制定计划,事先做出权衡,既要提高开发效率,又不能扼杀我们的能力,企图以创新的方式去迎合不切实际的需求 是不可取的。我希望本文所描述的技术与工具,以及S#arp架构对它们的组合,足以说明,虽然条条道路都能够通罗马,然而前车之鉴,若要避免重蹈覆辙,就必须从一开始就要汲取经验教训,并要有足够的智慧来赢得一个稳定的开端。

了解更多信息

S#arp架构项目已经开发了接近一年的时间,它为快速开发稳定的领域驱动程序提供了简单但又强大的架构基础。你可以从http://code.google.com/p/sharp-architecture下载S#arp架构的RC版本。1.0的GA版则与ASP.NET MVC 1.0密切相关。S#arp架构的论坛欢迎大家踊跃发言,畅谈自己的体验。

关于作者

http://devlicio.us

若要提到编写优美的软件,那么Billy McCafferty可以说是经验老到,久经沙场,偏生他又一味追求编程的罗曼蒂克,以至于无可救药。Billy目前身兼两职,一方面他负责管理一家小规模的培训与咨询公司Codai(很快会推出新的网站),同时又在Parsons Brinckerhoff带领开发人员与架构师团队。在发布S#arp架构1.0版本之后,Billy的生活又将重回正规,在不久的ALT.NET以及其他开发大会上,你能够见到他的身影。

[Tools]MyEclipse 7.0 破解版下载

mikel阅读(581)

MyEclipse7.0 下载地址:downloads.myeclipseide.com/downloads/products/eworkbench/7.0M1/MyEclipse_7.0M1_E3.4.0_Installer.exe
http://downloads.myeclipseide.com/downloads/products/eworkbench/7.0M1/MyEclipse_7.0M1_E3.4.0_Installer.exe
1、建立java Project,任意取个名字就行。
2、建立一个名字为MyEclipseGen的类文件,内容见附件。
3、运行该代码,在控制台中会出现:
please input register name:
×××××(你的name)
即生成序列号:
4、进入myeclipse,输入Subscriber和Subscription code即可。
附件:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class MyEclipseGen {
private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";
public String getSerial(String userId, String licenseNum) {
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.add(1, 3);
cal.add(6, -1);
java.text.NumberFormat nf = new java.text.DecimalFormat("000");
licenseNum = nf.format(Integer.valueOf(licenseNum));
String verTime = new StringBuilder("-").append(
new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime()))
.append("0").toString();
String type = "YE3MP-";
String need = new StringBuilder(userId.substring(0, 1)).append(type)
.append("300").append(licenseNum).append(verTime).toString();
String dx = new StringBuilder(need).append(LL).append(userId)
.toString();
int suf = this.decode(dx);
String code = new StringBuilder(need).append(String.valueOf(suf))
.toString();
return this.change(code);
}
private int decode(String s) {
int i;
char[] ac;
int j;
int k;
i = 0;
ac = s.toCharArray();
j = 0;
k = ac.length;
while (j < k) {
i = (31 * i) + ac[j];
j++;
}
return Math.abs(i);
}
private String change(String s) {
byte[] abyte0;
char[] ac;
int i;
int k;
int j;
abyte0 = s.getBytes();
ac = new char[s.length()];
i = 0;
k = abyte0.length;
while (i < k) {
j = abyte0[i];
if ((j >= 48) && (j <= 57)) {
j = (((j – 48) + 5) % 10) + 48;
} else if ((j >= 65) && (j <= 90)) {
j = (((j – 65) + 13) % 26) + 65;
} else if ((j >= 97) && (j <= 122)) {
j = (((j – 97) + 13) % 26) + 97;
}
ac[i] = (char) j;
i++;
}
return String.valueOf(ac);
}
public MyEclipseGen() {
super();
}
public static void main(String[] args) {
try {
System.out.println("please input register name:");
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String userId = null;
userId = reader.readLine();
MyEclipseGen myeclipsegen = new MyEclipseGen();
String res = myeclipsegen.getSerial(userId, "5");
System.out.println("Serial:" + res);
reader.readLine();
} catch (IOException ex) {
}
}
}
我运行后的结果:
please input register name:
sorc
Serial:fLR8ZC-855550-6654585354305964
注:private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";
此段代码常量不可变更 否则注册码无效

[MVC]在MVC下用XML实现breadcrumbs导航栏

mikel阅读(923)

转载:http://www.cnblogs.com/conan77/archive/2009/06/24/1509927.html

先看下样子image

像这种导航栏(breadcrumbs)在mvc下我们来实现他。我们采用XML来实现这个功能。

1.首先做个准备,我们编写rounting规则(顺便提一句,我们要用到rounting功能,所以规则必须写正确,不然出不来喔)

代码如下

 public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"inner",                                              // Route name
"resume/test/inner/{action}/{id}",                           // URL with parameters
new { controller = "inner", action = "Index", id = "" }  // Parameter defaults
);
routes.MapRoute(
"test",                                              // Route name
"resume/test/{action}/{id}",                           // URL with parameters
new { controller = "test", action = "Index", id = "" }  // Parameter defaults
);
routes.MapRoute(
"Default",                                              // Route name
"{controller}/{action}/{id}",                           // URL with parameters
new { controller = "Home", action = "Index", id = "" },
new { controller = "^(?!(test|inner)).*$", action = "^(?!test).*$" }
);
}

我们加了两个规则

/resume/test

和/resume/test/inner

2.编写用到的XML文件,注意是树形结构的

在models写个Navigator.xml

<?xml version="1.0" encoding="utf-8" ?>
<node Title="首页"  Description="潘峰的网站" Action="Index" Controller="Home">
<node Title="简历" Description="在线简历" Action="Index" Controller="Resume">
<node Title="Test" Description="Test" Action="Index" Controller="test">
<node Title="inner" Description="inner" Action="Index" Controller="inner">
</node>
</node>
</node>
</node> 

3.编写我们的类文件来实现Navigator

在models写个navigatorHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Xml.Linq;
using System.Web.Routing;
using System.Web.Mvc;
using System.IO;
using System.Text;
namespace conansoft.Helpers
{
public static class MenuHelper
{
private static HttpServerUtilityBase Server = null;
private static HttpRequestBase Request = null;
private static UrlHelper Url = null;
private static RouteValueDictionary RouteDictionary = null;
public static string Navigator(this HtmlHelper helper)
{
Server = helper.ViewContext.RequestContext.HttpContext.Server;
Request = helper.ViewContext.RequestContext.HttpContext.Request;
Url = new UrlHelper(helper.ViewContext.RequestContext);
RouteDictionary = helper.ViewContext.RequestContext.RouteData.Values;
string xmlPath = Server.MapPath(Url.Content("~/Models/Navigator.xml"));
XDocument doc = XDocument.Load(xmlPath);
XElement node = FindNode(doc.Root);
StringBuilder sb = new StringBuilder();
Stack<XElement> s = new Stack<XElement>();
while (node != null)
{
s.Push(node);
node = node.Parent;
}
//输出breadcrumbs.可以自行修改使之符合你的要求
while (s.Count() != 0)
{
node = s.Pop();
if (UrlEqual(node))
{
sb.AppendLine(string.Format("<li title='{1}'>{0}</li>", node.Attribute("Title").Value, node.Attribute("Description").Value));
}
else
{
sb.AppendLine(string.Format("<li><a href='{1}' title='{2}'>{0}</a></li>", node.Attribute("Title").Value,
Url.Action(node.Attribute("Action").Value, node.Attribute("Controller").Value),
node.Attribute("Description").Value));
sb.AppendLine("<span style='color:Black;font-weight:bold;'> > </span>");
}
}
return sb.ToString();
}
/// <summary>
/// 查找当前节点
/// </summary>
/// <param name="e">当前节点</param>
/// <returns>找到返回,找不到为空</returns>
private static XElement FindNode(XElement e)
{
XElement result = e;
if (UrlEqual(e))
{
return e;
}
else
{
if (e.HasElements)
{
foreach (XElement ee in e.Elements())
{
result = FindNode(ee);
}
}
else
{
return null;
}
return result;
}
}
/// <summary>
/// Url是否相等
/// </summary>
/// <param name="e">节点</param>
private static bool UrlEqual(XElement e)
{
string url1 = Url.Action(e.Attribute("Action").Value, e.Attribute("Controller").Value).ToLower();
string url2 = Url.RouteUrl(RouteDictionary).ToLower();
return url1 == url2;
}
}
}

解释一下我们利用xml文件来实现breadcrumbs,并且我们用action和controller来判断是否为当前路径[UrlEqual]

在网页中加入

  <%=Html.Navigator() %>

好了效果如下image

我的网站

image

image

[API]淘宝开放平台重装上阵

mikel阅读(1012)

淘宝开放平台( Taobao Open Platform, TOP ) ,面向第三方的开放式电子商务服务基础服务框架,重装上阵。前一段时间提前接触了一点这个项目,真是个非常有想象空间的事情。

可以肯定的是,这是"大淘宝"战略的一个重要环节。从最初的 Taobao.com 一个站点,现在是一个平台,将来再到一个更大的商业生态系统

Taobao TOP 蓝图
(上图出处)

去年下半年淘宝有过一次尝试("淘园"项目),与上次的初步尝试截然不同的是,这次已经不再通过阿里软件这一层进行接入,从开发者使用角度上看,减 少了交互环节,更加直接方便。此外,可供使用的应用程序接口愈加丰富,更贴近用户使用习惯。随着开发者社区的成熟和开发者规模的扩大,淘宝提供平台化的支 持也是可以想见的事情。

对于所有的开放平台开发者来说,最关心的问题莫过于盈利模式。现在 TOP 关于盈利模式主要有两种形式:一是淘宝客佣金模式,再一个是淘宝插件分成模式。还是比较清晰的。就我个人而言,更倾向于前者的模式。也期待淘宝运营人员能够根据实际情况制定更加有利于开发者的策略,积极促进与开发者之间的互动。胜,在于人。

与其在一些 SNS 网站捣鼓那些游戏插件,还不如来开发电子商务第三方应用呢。你说呢?

[IIS]详解DNS安装及配置多个二级域名的二种方法(图文教程)

mikel阅读(1274)

最近为了调试程序,配置了本地的DNS服务器,我们要模拟网上的域名环境,发现还有很多的朋友不太了解,所以发一个图文教程简单的介绍下DNS正向区域设置的二级域名的两种方法,如果有什么不对的地方还望网友们指正批评!谢谢!不废话了,贴图先!

第一步:windows 2003中DNS的安装:

      

1.1这个步骤要花上一点点时间,大家耐心等下,不同的机器,速度可能不太一样!

1.2按图中操作后选反DNS服务器点击下一步

1.4到这里DNS服务器就安装好了,接下来的是一个向导添加一个"正向查找区域"了

1.5这张图主要说明一下是,区域名称就是我们要设置的域名!也就是不带主机头的后面那部分了!

1.6DNS安装的机器需要有一个固定的ip地址,不能自动获取,所以我们设置一下“网络连接”将我们的ip 地址输入进去,DNS服务器首选改成本机,这个地方会被强制使用本机的DNS服务器的,因为服务就装在这台机器上!

第二步:“DNS服务器”的配置

2.1下面配置我们刚才添加的"kfoo.com"这个域的“正向查找区域”,这一步,我们为这个域添加几个主机头用来测试!

下面是创建出来的主机头

2.3创建好了主机头,我们去cmd里面去确认下,会发现,指向已经成功!

第三步:IIS站点的配置

上面我们把“默认站点”端口号“80”的站点设置到了http://www.kfoo.com/

——————————————————————————————————————

上面这个要注意,站点的端口是“81”

——————————————————————————————————————

我们发现,这个地方这样设置了,但是只有http://www.kfoo.com/这个可以访问,而product.kfoo.com这个域名是没法访问的!为什么呢!?原来要加上product这个站点的“81”端口号!这样和我们预想的肯定不是一回事,那怎么办呢!?解决方法有三种!!(这里谢谢“木鱼”的指证,我之前把事情弄复杂了,这个地方那么就有三种方法)按木鱼说的最简单的方法就是,把product这个站点的端口修改下,也修改成"80"端口即可!

其它的两种方法还是放在这吧,下面选讲麻烦的,再讲简单的:

第一种方法:为网卡设置多ip绑定来解决上面的问题,操作如下图!(注:这里用多ip应该还可以解决多域名泛解析的情况!)

——————————————————————————————————————

——————————————————————————————————————

设置好了,但是我们的DNS也要相应的更改一下了!就是把之前的指向换成我们新加入的ip地址"192.168.0.253"

 

——————————————————————————————————————

IIS中"product"站点,我们也要作相应的更改,如图,我们要将站点的"81"端口设置到"80",ip分配到我们刚增加的"192.168.0.253",好了,OK!

第一种方法就是这样的,试下,是不是都可以访问了!接下来就看简单好用的第二种方法了!一张图说明问题!

第二种方法:看下图:

——————————————————————————————————————

——————————————————————————————————————

按第二种方法设置的话,设置好hosts文件之后,我们的DNS中设置的主机头都指向到一个ip就可以了!IIS中的设置也比较简单,所有的站点都用80的端口,主机头就按照hosts文件和DNS中设置的配置就可以了,

[Web]Web OS雏形—Opera Unite初体验 从 博客园新闻频道

mikel阅读(858)

     最近,Opera公司发布了自己的新产品Opera 10,它最大的特色是引入了一个新的技术Opera Unite。

      Opera Unite 一种在线协作技术,允许您使用电脑直接与他人共享您的数据 – 如文件、照片或者音乐。Opera Unite 技术基于 Opera 浏览器中简单而精密的服务器程序实现共享数据和服务等功能。

     使用 Opera Unite,您不再需要花费时间上传您需要共享的内容。直接共享自己硬盘上的内容,而不需要第三方共享服务器。

  Opera Unite 彻底的扩大了您的线上活动范围。Opera Unite 借力于当今先进的硬件和流畅的网络连接,赋予所有人定义网络未来面貌的能力。

  Opera Unite 服务

  Opera Unite 服务使您可以扩展您浏览器的功能以共享文件。这些服务范围广泛,从发布信息/聊天的社会性网络工具到文件、照片和音乐共享。用它可以快捷的与朋友共享内容 – 无需上传 – 而别人可以直接访问您的开放的那部分硬盘。
一、下载Opera Unite

下载地址:http://unite.opera.com/

      

二、配置个性化主页

进入浏览器,首先要注册自己的Opera账号

注册后,它就会让你输入个性化计算机名,也就相当于Opera中的个人主页

以我自己的为例:

登陆后,会出现一个侧边栏:

你可以看到Opera Unite目前已经提供了File Sharing(文件共享)、Fridge(留言板)、Media Player(媒体播放器)、Photo Sharing(照片共享)、The Lounge(聊天室)和Web Server(网络服务器)等六项功能。

以Fridge(留言板)为例,我们启动留言板服务,然后ADD Note:

马上就去考六级了,今天就先介绍到这,大家发现什么新的东西要来分享哦!

[MVC]一个基于Asp.Net MVC的权限方案

mikel阅读(878)

    最近这段时间博客园有几位同学在探讨通用的权限方案,偶闲来无事,也来凑凑热闹,下面简单说一下我的简单解决方案,基于AOP的。由于使用了ASP.NET MVC 开发,可能需要先对MVC有些了解,思路都是差不多的。

1.数据结构

Mad_Popedom为权限表,Control记录控制器名,Action记录动作名。
Mad_Role为角色表。

2.权限控制的实现
此处使用比较简单AOP方式,用MVC的Filter实现,代码如下

Code

解释一下,上面的代码就是在执行前,先获取登录用户可以运行的Controller-Action,然后和当前需要执行的Controller-Action比较,如存在,即通过,否则为没有权限执行。

3.为动作添加权限
为简单起见,对于Controller层我是独立出来一个类库的,好处是等会为角色添加权限的时候我们不需要手动输入,只要反射dll就可以了。

如图所示,凡需要权限控制的函数,只需要添加[SupportFilter]特性就可以了,当然这种方式只能控制到Action级。

4.为角色额添加权限
这个比较简单,只需要把角色和权限关联起来就可以了,这里我是用反射Controller层dll实现。
Web.config

Global.asax.cs

Madnet.Controllers.Test即为Controller层的dll

5.结束
上面4步即已完成基本的权限控制。可以在此基础上加上用户组,用户,菜单等管理,可实现”用户-角色-权限”的自由组合,一个简单的通用后台大概就是这样了。


—————————————————————————————-
文章发表于:http://www.madcn.net/?p=454

[Flex]ActionScript 3网站构建框架

mikel阅读(899)

开发基于RIA的网站有很多种方法。对于和多媒体内容息息相关的业务和个人来说,Flash形式的网站尤其动人。Fosfr是一个ActionScript 3网站构建框架,专门用来创建Flash网站。InfoQ采访了Fosfr的创始人——Jeff DePascale,以深入了解Fosfr。 

Q. 是什么驱使你开始开发这个Fosfr框架的? 

A. 我大部分工作都跟小型网站开发相关。Fosfr最早是为了保证各网站的版本能保持一致。最初,AS2中有组特别的类严格控制站点的构建,Fosfr作为 AS3框架主要是以前面提到的那个类库为基础来扩展,给我所有的Flash构建——无论是小型网站,还是独立的SWF,或者是其它项目——提供了稳定、一 致的基础。 

Q. 你为什么觉得会有AS3(或者说Flash)网站的需求? 

A. 目前有两种对立的看法,一部分认为Flash有益于互联网的发展,另一部分人认为Flash只是让整个网络充斥着用户体验很烂而又无法被检索到的网站。就 我个人认为,每个技术都有各自发展的天地,非要说某种技术在像互联网这样迥异的媒体中比另一种技术更适合,未免有些误导。Flash有缺点吗?当然 有,SEO方面就是其中一个非常大的缺点。Flash有没有被用到一些不合适的场合?当然也有。但是,如果能有效应用它的长处的话,Flash能提供强大 的富用户体验, 

Q. 你能概括下Fosfr的基本构架吗? 

A. Fosfr的整体实现是一个三层SWF结构。一个是核心层,或者说是主SWF。这个核心层包含了预加载器,可以看作是项目的宿体。核心层之上是shell SWF,这里包含了所有通用的网站元素,诸如导航栏、脚注等等。最后,那些可变内容则放在子SWF文件中。 

Fosfr的优点还在于它有用于生成文档的类库。Fosfr提供自定义文档类,所有.as文件都能得到扩展(包括外部类);它提供直至自动生成文档 这个层次的自定义方法,这些方法可以是为了调试、跟踪、导航,也可以是为了访问Fosfr的其它控件,比方说cookies、url信息等等。项目的任何 一个地方,你都能直接索引到fosfr对象,快速访问到框架的任何一个方面,可以访问到加载在项目中的所有SWF。 

整个项目由一个外部XML配置文件来驱动,根据这个配置文件,能构从该xml文件本身直接访问Fosfr主要控件的所有属性。借助于自动生成文档的 类库的后台工作,只需要在每个.as文件中添加几行简单的代码就能实例化整个框架。只要几分钟,你就能得到可以立刻运行的一个功能完善的网站了。 

Fosfr还能和Prequel集成使用,Prequel是我开发的一个预加载API;Fosfr还能集成SWFAddress,完全自动完成,不需要任何手动处理。通过Fosfr创建文档的类库来开发结合SWFAddress的子SWF的自定义功能会非常容易。 

另外,如果你只需要一个SWF文件和一个对应的预加载器,那么可以只实现Fosfr的核心文件和shell文件,可以省去其中的导航 /SWFAddress功能;或者通过框架中的FosfrLite创建一个独立的SWF。FosfrLite也可以选择使用XML配置文件。 

Q. Fosfr能和已有的CMS甚至诸如Wordpress这样的日志平台集成吗? 

A. Fosfr的XML配置文件包含了一个专门针对自定义网站元素的结点。CMS或XML编辑插件直接与这部分xml配置交互的话,能够很容易操作在 Fosfr上创建的任何SWF文件的各个方面。目前还没有给Wordpress及类似平台专门开发插件的计划,但我会在以后的开发中实现此类集成。 

Q. 开发Fosfr,你用的是什么开发工具?还有,Fosfr和Flex有关吗?要是没有,以后会把这两者结合起来吗? 

A. 开发Fosfr,我用的是FlashDevelop,这也是这段日子以来一直在用的开发工具。在调试方面,我结合采用了集成在Fosfr当中自定义调试器和Flash播放器的标准调试器。目前我还没有任何计划要把Fosfr集成到Flex当中的计划。 

Q. 你对Fosfr的前景有何规划? 

A. 目前,Fosfr的版本上处于0.8。在推出1.0版本之前,我计划完成处理自定义事件和事件提醒的系统,在调试器上再多加一些功能,而且希望到时候还能 集成我正在抓紧开发的、更新、更强壮的Prequel版本。处于开发阶段、尚未结合在公共发布当中的模块还有tab管理和音频管理。我还计划开发另外的文 档管理类库来捆绑papervision3D站点的创建。1.0及其之后的版本将囊括这些特性,而且会不断添加新功能。就眼前来说,更重要的是确定什么是 目前要完成的,要编写快速入门指南,最好还要创建一个AIR应用把XML配置文件转变为向导。我希望开发人员能在半个小时以内就能轻松掌握Fosfr,而 且我觉得Fosfr能大幅度缩短产品的开发周期,这无疑是它的一大优势。但是如果没有快速入门指南和向导的话,这个优势也很难实现。Fosfr非常有用, 能够极大地缩短开发周期,但前提是你要懂得怎么去使用这个工具。我在不了解如何使用某个API的前提下直接去用这个API,还确实遇到过很多问题。 Fosfr在1.0之后就不会有这些问题。所以编写指南是目前最迫切的一件事。之后,我会发布完全值得信赖的1.0版本,会尝试让公众关注到这个项目,目 前我有意识地尽量把关注度控制到最小。 

Q. 为什么要把这个开发框架叫作“Fosfr”? 

A. 从技术上来说,它的全称是“Flash Open Source Framework”。然而,由于之前SWFObject和SWFFit因为名字当中有“Flash”这个词,在注册商标的时候遇到很多问题,所以现在严 格采用Fosfr。另外,这个名字厅听上去也很酷。 

InfoQ会关注并且追踪报道Fosfr的开发进度。

查看英文原文:ActionScript 3 Site Framework – Fosfr

[Lucene]Lucene.net 系列四 --- index 下

mikel阅读(901)

本文将介绍有关索引并发控制的问题,以结束对Lucene.net建立索引问题的讨论.
1. 允许任意多的读操作并发.即可以有任意多的用户在同一时间对同一份索引做查询工作.
2. 允许任意多的读操作在索引被正在被修改的时候进行.即哪怕索引正在被优化,添加删除文档,这时也是允许用户对索引进行查询工作. (it’s so cool.)
3. 同一时间只允许一个对索引修改的操作.即同一时间只允许IndexWriter或IndexReader打开同一份索引.不能允许两个同时打开一份索引.
Lucene提供了几种对索引进行读写的操作.添加文档到索引,从索引中删除文档,优化索引,合并Segments.这些都是对索引进行写操作的方法. 查询的时候就会读取索引的内容.
有关索引并发的问题是一个比较重要的问题,而且是Lucene的初学者容易忽略的问题,当索引被破坏,或者程序突然出现异常的时候初学者往往不知道是自己的误操作造成的.
下面让我们看看Lucene是如何处理索引文件的并发控制的.
首先记住一下三点准则:
1. 允许任意多的读操作并发.即可以有任意多的用户在同一时间对同一份索引做查询工作.
2. 允许任意多的读操作在索引被正在被修改的时候进行.即哪怕索引正在被优化,添加删除文档,这时也是允许用户对索引进行查询工作. (it’s so cool.)
3. 同一时间只允许一个对索引修改的操作.即同一时间只允许IndexWriter或IndexReader打开同一份索引.不能允许两个同时打开一份索引.
第一个准则很容易理解,第二个准则说明Lucene对并发的操作支持还是不错的.第三个准则也很正常,不过需要 注意的是第三个准则只是表明IndexWriter和IndexReader不能并存,而没有反对在多线程中利用同一个IndexWriter对索引进行 修改.这个功能可是经常用到的,所以不要以为它是不允许的.不过这个时候的并发就需要你自己加以控制,以免出现冲突.
(注: 在前面的系列中已说过IndexReader不是对Index进行读操作,而是从索引中删除docuemnt时使用的对象)
有关这三个原则在实际使用Lucene API时候的体现,让我们先看看下面这张表:
表中列出了有关索引的主要读写操作.其中空白处表示X轴的操作和Y轴的操作允许并发.
而X处表明X轴的操作和Y轴的操作不允许同时进行.
比如Add document到索引的时候不允许同时从索引中删除document.
其实以上这张表就是前面三个准则的体现.Add Optimize Merge操作都是由IndexWriter来做的.而Delete则是通过IndexReader完成.所以表中空白处正是第一条和第二条准则的体现,而X(冲突)处正是第三个原则的具体表现.
为了在不了解并发控制的情况下对Lucene API的乱用. Lucene提供了基于文件的锁机制以确保索引文件不会被破坏.
当你对index 进行修改的时候, 比如添加删除文档的时候就会产生 ***write.lock文件,而当你从segment进行读取信息或者合并segments的时候就会产生***commit.lock文件.在默认 情况下,这些文件是放在系统临时文件夹下的. 简而言之, write.lock文件存在的时间比较长,也就是对index进行修改的锁时间比较长,而commit.lock存在的时间往往很短.具体情况见下表.
如果索引存在于server, 很多clients想访问的时候,自然希望能看到其他用户的锁文件,这时把锁文件放到系统临时文件夹就不好了.此时可以通过配置文件来改变锁文件存放的位置.
比如在一个ASP.NET的应用下,你就可以象下面这样利用web.config文件来实现你的目的.
<configuration>
    <appSettings>
        <add key="Lucene.Net.lockdir" value="c:yourdir" />
    </appSettings>
</configuration>
不仅如此,在某些情况下比如你的索引文件存放在一个CD-ROM中,这时根本就无法对索引进行修改,也就不存在所谓的并发冲突,这种情况下你甚至可以讲锁文件的机制取消掉.同样通过配置文件.
<configuration>
    <appSettings>
        <add key="disableLuceneLocks" value="true" />
    </appSettings>
</configuration>
不过请注意不要乱用此功能,不然你的索引文件将不再受到安全的保护.
下面用一个例子说明锁机制的体现.
using System;
using System.IO;
using Lucene.Net.Analysis;
using Lucene.Net.Index;
using Lucene.Net.Store;
using NUnit.Framework;
using Directory = Lucene.Net.Store.Directory;
[TestFixture]
public class LockTest
{
private Directory dir;
[SetUp]
public void Init()
{
String indexDir = "index";
dir = FSDirectory.GetDirectory(indexDir, true);
}
[Test]
[ExpectedException(typeof(IOException))]
public void WriteLock()
{
IndexWriter writer1 = null;
IndexWriter writer2 = null;
try
{
   writer1 = new IndexWriter(dir, new SimpleAnalyzer(), true);
   writer2 = new IndexWriter(dir, new SimpleAnalyzer(), true);
  
}
catch (IOException e)
{
   Console.Out.WriteLine(e.StackTrace);
}
finally
{
   writer1.Close();
   Assert.IsNull(writer2);
}
}
[Test]
public void CommitLock()
{
IndexReader reader1 = null;
IndexReader reader2 = null;
try
{
   IndexWriter writer = new IndexWriter(dir, new SimpleAnalyzer(),
                                        true);
   writer.Close();
   reader1 = IndexReader.Open(dir);
   reader2 = IndexReader.Open(dir);
}
finally
{
   reader1.Close();
   reader2.Close();
}
}
}
不过很令人失望的是在Lucene(Java)中应该收到的异常在dotLucene(1.4.3)我却没有捕获到.随后我在dotLucene的论坛上问了一下,至今尚未有解答.这也是开源项目的无奈了吧.