Entries by jin.pan

权限控制的实现

     权限管理,一般指通过在系统中设置的安全策略,用户可以访问而且只能访问自己被授权的系统资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 因此很多人,常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。      本篇文章主要说的是网站的权限管理实现,通过过滤URL或控制方法执行来进行限制。      通过利用Filter,对所有进入的URI进行解析,并取得当时Session中的User信息,然后通过RBAC的机制,将此链接需要的权限与用户拥有的权限进行比较,然后进行相应的处理。这种做法有很多好处:简单,容易实现,并且对系统侵入性也不强。这里URL就是RBAC中的资源了。这样做的缺点是所有对数据的操作必须通过URL来体现,这一点在现代的程序中不太好实现。如果采用Struts, XWork或者Tapestry,采用同一个URL(浏览器看来)进行处理多项任务已不是什么稀奇的事。这时候同一个url里功能对应的角色不同,就不能通过URL过滤了。      通过AOP控制,在上一篇中就有提到,通过使用AOP可以精确控制到每一个执行方法的权限,也就是说小到一个按钮触发的业务也可以进行控制,并且由于AOP的切面管理可以对每一个细节功能做到方便的调配。不过AOP无法做到像Filter那样对网页进行过滤,只能对网页中的每一个细节功能进行控制,所以某种程度上来说Filter和AOP结合可以让权限管理得到最大的灵活度。

浅谈面向切面编程

     Aspect Oriented Programming(AOP),即面向切面编程,是前段时间比较是一个比较热门的话题,在学校老师给我们讲OOP的时候,就经常提到它。面向切面编程主要实现的目的是针对业务处理过程中的切面提取,它所面对的是某个步骤或阶段的统一处理过程,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们上星期完成的日志记录和权限管理就采用了这一技术。      我们举个简单的列子,我们现在提供一个服务修改订单信息的,但是我们希望记录有谁进行了这个操作。那我们实现了一个订单的服务接口和其实现类,同时为了要进行记录的话,那我们在实现类中就要添加其实现记录的过程。这样的话,假如我们要实现的服务有多个呢?那就要在每个实现的类都添加这些类似且重复的记录过程。这样做的话就会有点繁琐,而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。那么怎样才能把记录服务的行为与业务处理过程中分离出来呢?看起来好像就是修改订单的服务自己在进行,但却是背后日志记录对这些行为进行记录,并且修改订单的服务不知道存在这些记录过程,这就是我们要讨论AOP的目的所在。      下面介绍一些AOP的概念,方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。目标对象:包扩连接点的对象,也被称作被通知或被代理对象。      切入点的概念是AOP的关键,它使AOP区别于其他使用拦截的技术。切入点使通知独立于OO的层次选定目标, 拦截器也由此应运而生,目前我们使用的是基于JAVA的集成到Spring 中的 SpringAOP,用此来实现了日志和权限的统一管理。

primefaces 学习心得

     做了挺长一段jsf的开发了,这期间,我们用jsf的PrimeFaces实现了我们以前不敢想的UI,不得不说PrimeFaces给我们带来了意想不到的福音。 PrimeFaces是一个用于提高JSF Web应用程序开发效率的开源类库,通过它,可以让UI直接和后台对接,它提供了丰厚的ui库,简单易学的案例,方便上手,而且还省去了css和图片的设计时间,是一个很强大的开源类库。      PrimeFaces主要由三个模块组成:第一个是UI Components,PrimeFaces的 UI模块提供了拥有Rich Web用户体验的各种JSF组件,如可即时编辑的datatable、绚丽的日期选择器、便利炫彩的上传下载控件等等,如果要用javascript去实现,必当要花相当多的时间,有了FacesTrace模块,我们可以轻松的使用这些UI。PrimeFaces使用Yahoo UI库做为默认的客户端框架。PrimeFaces提供的JSF组件能够处理JavaScript Rendering,并且处理如何在服务器端与JSF集成,实现点对点连接。PrimeFaces UI组件还包括:HtmlEditor、ImageCropper、Dialog、AutoComplete、Flash based Chart等。基本上页面需要的控件都有了,最重要都是,它还支持通过Ajax更新页面,这在性能上,和用户体验上可以说是相当重要的。第二个模块是Optimus,Optimus提供简化JSF开发的解决方案。Optimus提供基于Google Guice IOC容器的注释来代替XML配置和一个XML-less Navigation Handler能够让你减少基于XML配置JSF Navigation的需要,只需要简简单单的注解,你就可以实现对页面的控制。此外Optimus还支持利用JPA实现数据持久化;只需几个标签,你就可以将DataTable的内容导出成Excel与PDF。而且它支持安全扩展。第三个FacesTrace模块,因为目前我们做的项目对FacesTrace模块还不是非常了解,这里只做简单介绍,FacesTrace模块提供跟踪JSF Web应用程序的各种工具包括:JSF LifeCycle可视化查看器;性能跟踪器; Log4J适配器;FacesMessage监听器;组件树可视化查看器等。      虽然PrimeFaces相当出彩,可惜使用的人视乎很少,很难找到资料学习,现在基本上都是靠自己用官网的资料来学习,有不少兼容性的问题,项目结束以后在和大家分享。

Java在翻译中需注意的问题

     首先先说说Java关键字,是电脑语言里事先定义的,有特别意义的标识符,通常使用的关键字,一般和前后单词不会构成有意义的语句,如 代码 char cat; , 其中char是关键字,char cat从字面翻译无意义。类似的关键字还有: abstract assert Boolean break byte case catch char class continue default double else enum extends final finally float for if implements import instanceof int interface long package private protected public return short static super switch synchronized this throw throws transient try void volatile while      虽然可以从语义上判断关键词所组合成的语句是不是代码部分,但是依然较难判断。然而以上关键字还有部分是非常容易判断是java关键字组成的代码,还是普通词汇的, 如 if 、for、while […]

浅谈组件化开发

    这段时间开始新项目的开发,这次开发我们使用的是组件化开发,把每一个功能模块分成不同的组件,实现即插即拔的效果。     目前的组件技术主要以Activex、Corba、VCL、EJB为代表,他们都实现了可拔插、可替换的功能,提供了分布式计算服务,甚至可视化控件,大大提高了开发效率和维护性。通过引入组件化的思想,安业务需求分成各个实现单元,然后将其包装成可独立部署的组件,通过组件的灵活组装,达到最大化的复用,并可以快速的应对需求变化。同时通过组件化降低系统内部的耦合度,组件化为系统运行维护期的可管理性和可维护性提供技术上的支持。     很多行业的发展都与当时的技术背景和发展状况有着直接或间接的关系,但是 软件就其本身特征而言更加具有复杂性,它从一开始应用于简单计算到现在渗透 到各行各业,与传统行业相比,无论从外延还是解决问题的复杂性,都有它的独特性。业界的技术发展在几十年经历了面向机器、面向过程、面向对象、面向组 件的发展历程,每个阶段较前一个阶段在关注点和思维层次上都有一定的升华, 都解决了某类问题,为当时的软件发展起到了重要作用。 下面说说组件化的特点:     1)组织和过程 为保证技术组件的通用性、适合度和质量,需要建立组件评审机制,负责对 技术组件的验证、评审。在流程上,需要建立技术组件立项、研发、测试、评审、 入库、推广的过程管理。     2)应用场景 在新应用系统丌发前,设计师需要根据项目特点,从技术组件库中检索出适 合的技术组件,并确定技术组件的版本,导出组件包,统一在项目中使用。为了 提高组件重用率,设计师应优先使用技术组件库提供的组件包,而不是采用代码 级复用的方式。 针对新丌发的技术组件,组件设计和开发者必须按照技术组件规范要求,提 供技术组件的源代码、二进制组件包以及自描述信息,包括适用范围、功能描述、 版本、作者、依赖关系、接口描述等。并按技术组件开发过程的要求,提交到技 术组件库中。     3)技术组件库 技术组件库是一套单独的应用,技术组件的管理是通过技术组件库来实现 的。     总之,通过组件化,可以极大的实现重用性, 提高开发效率,快速灵活应对业务需求,通过降低耦合度提升系统的可管理性, 从而降低维护成本,是一个高可靠的开发方案。 组件化开发模型

jsf的学习心得

     学习了一段时间的jsf,感觉到jsf是一个非常好的框架,只可惜在国内却有非常少的资料提供学习,现在分享这段时间我学习jsf的一点心得      Jsf是组件式的开发,组件是Struts和JSF之间最大的区别。就像Swing一样,JSF提供丰富的底层构件去开发组件然后添加到标准的组件集。那些底层构件让你很容易的生成自己的组件并且和别人共享。现在我们到处都能看到自定义组件跳出来,比如说Oracle的ADF和MyFaces,两者都提供了丰富的组件集,就像javascript日历,tree等等。      当然,组件只是一部分。典型的是,组件都和一个独立的renderer对应,这给我们带来了真正的好处(看第3条)。但是和JSF中的很多东西一样,你不一定要墨守成规。只要你愿意,你可以实现render自己的组件,虽然这样你会失去给组件加入别的renderer的能力。      你有看过Struts的标签的源代码吗?它直接生成HTML。JSF组件标签什么都不生成,它和服务器上的一对component-renderer对应。Component维护组件状态,rendered负责获得视图。重点是renderers是可插拔的,即你可以根据自己需求实现然后替代掉默认实现。比如说我在NFJS上面的Felix谈话中举例说明了怎么去实现一个自定义的label renderer。你只需要配置你的renderer,JSF就会自动在你的应用程序里面使用他。 这使得开发非常的快速便捷。      Struts是一个开源产品,然而JSF是一个标准。这个细节常常被新的JSF学习者忽略,其实这是显而易见的,因为我们有多个JSF的实现。虽然JSF还很不成熟,但是我们已经有了2个优秀的JSF实现可以选择:Sun的参考实现和Apache的MyFaces。另一方面,我们只有一个Struts。

浅谈如何解决javascript对seo的影响

前面一篇文章说了,javascript给我们带来很多的好处,但是它却是搜索爬虫的一道墙,对网站的seo非常不利。那么怎么在不影响网页效果而又对搜索引擎友好的前提下使用JavaScript,又不影响SEO效果呢?   1、要避免导航及网页链接使用JavaScript。导航和链接是搜索爬虫抓取网页的赖以生存之本,如果搜索爬虫无法抓取网页,则代表了网页不会出现在索引结果中,也就没有排名了。如果有希望蜘蛛抓取的目标页面需要转向,不要使用javascript脚本进行跳转,因为这样做的话蜘蛛完全无法获取到目标页面的地址,采用noscript标记进行目标url指定是一个好办法,因为蜘蛛能够正确识别noscript标记,并且一般情况下不会对浏览器显示产生影响。   2、尽量避免用JavaScript输出内容。特别是与关键词相关部分的内容,尽可能避免使用JavaScript来展现,否则毫无疑问是要降低关键词密度的。虽然ajax是一个好技术,尤其是在一些需要实时性要求比较高的系统中,可以很好的缓解服务器的压力,也可以实现需求时才查询取出数据内容,还可以对框架布局不产生影响,实现更炫的网页效果,但ajax的核心是通过javascript脚本来在需要时获取数据的技术,这样数据就不是在页面展示时就加载完成,那么就出现了第一项中所说的,蜘蛛获取不到这些内容,自然就无法抓取和爬行链接。本项内容可以参考“AJAX技术与SEO”和“QQ空间不能用来做SEO外链”。   3、如果上面两项无论如何都要坚持的话,也不是不行,可以做两套ui,一套有丰富的javascript供用户体验,另一套则为搜索引擎提供爬取支持,但这对维护来说就增加了非常大的难度。 以上的一些方法是消除JavaScript对搜索引擎的不利影响,搜索引擎无法对JavaScript进行识别(虽然Google目前能够做到对少量简单的JavaScript代码做出辨别,但那也应该只是Document write之类的简单代码)。那么换一个角度来说,我们完全可以利用JavaScript来过滤一些垃信息。

浅谈javascript对seo的影响

     Javascript是一种客户端脚本语言,主要目的是为了解决服务器端语言遗留的速度问题,为客户提供更流畅的浏览效果,Javascript不仅仅可以减轻系统的负担,还可以提供各种各样华丽的特效,人性化的交互,几乎所有大型网站都用到了javascript。      然而JavaScript却在SEO中是一个很头疼的问题,一方面我们在网页制作中需要使用JavaScript来实现绚丽的特效,而一方面JavaScript又会对搜索引擎的抓取分析造成不好的影响。Google的官方文档中很清楚的说明,如果在html中过多的使用 JavaScript、Cookie、会话 ID、框架、DHTML 或 Flash 等复杂功能会使搜索引擎抓取工具在抓取网站时可能会遇到问题。百度虽然没有明确的说明,但是经过大量的实践,百度也是无法对JavaScript进行识别的。这样就有一个问题,网页中过多的JavaScript代码无疑是对搜索引擎分析网页内容增加难度。如果网页中的链接已经主体内容也是由不少JavaScript组成输出的话,那么搜索引擎甚至无法顺着链接去抓取网页,也无法获取网页内容。这样的话,过多的使用JavaScript就造成了以下的影响:      1、对搜索引擎分析网页内容造成了干扰。2、严重妨碍搜索引擎抓取网页。3、影响由链接产生的网页权重分布。      总之Javascript给我们带来很多好处的时候,也对搜索引擎带来很大阻碍,所以我们要仔细考虑如何让Javascript和seo怎么更好的合作。

单例模式和简单工厂心得

     单例模式和工厂方法可以说是在软件设计模式中目前用得比较多的,目前在公司做的项目也经常会接触到,他们都实现了类的创建封装,让代码维护变得更加简单。      首先说单例模式,单例模式可以保证整个系统中一个类只有一个实例,而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源,如果只希望在系统中某个类的对象有且只能存在一个,单例模式是最好的解决方案。      对于某些系统来说,有些类只有一个实例很重要,如最常见的数据库连接配置对象。它在整个系统中只需要一个就足够了,多了就会产生很多不必要的开销,造成资源浪费。      工厂方法则非常复杂,这里只说比较简单的简单工厂模式,而感兴趣的读者可以去看看工厂方法模式。从设计模式的类型上来说,单例模式和简单工厂模式都是属于创建型模式,简单工厂模式又叫做静态工厂方法,是由一个工厂对象决定创建出哪一种产品类的实例。      简单工厂模式一般会分三个角色,第一个工厂(Creator)角色,它是负责实现创建所有实例(产品)的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。第二个抽象产品(Product)角色,为所有不同类型的产品,定义一种借口。第三个实例产品(Concrete Product)角色,是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。      单例模式和工厂方法都为实例对象的创建提供了封装特性,有利于整个软件体系结构的优化。但是这些模式亦不能乱用,比如单例模式,在一个系统中如果需要有多个实例的时候,使用单例模式甚至会出现功能错误。所以在使用设计模式的时候我们需要多方面考虑,让模式为我们带来真正意义上的优化。 简单工厂图示

浅谈设计模式

    设计模式,英文名为 Design pattern,它起源于建筑学,由Erich Gamma等人在1990年代从建筑设计领域引入到计算机科学的。它是对软件设计中普遍存在也是反复出现的各种问题,所提出的软件解决方案。     经过这么久的编码,让我越来越感觉到设计模式的重要性,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样,要是砌得不好,仅仅是想改变一下大厦房中的格局,就要把整栋大厦推倒重建,当然,这是万万不可的。     如今的设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式可重用代码、让代码更容易被他人理解、保证代码可靠性。一个好的设计,往往会包含各种各样的设计模式,它就像一个可以活动的大厦一样,自由转动大厦里面的各个房间,改变他们的格局,而不会让大厦倒塌。     现在简单介绍一下面向对象的几个原则,为什么会有这些原则?根本原因就是为了代码复用,增加可维护性。其中一项开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。而设计模式就是实现了这些原则,从而达到代码复用、增加可维护性的目的。     开闭原则:原文是:”Software entities should be open for extension,but closed for modification”。就是说模块应对扩展开放,而对修改关闭。     里氏代换原则: 如果调用的是父类的话,那么换成子类也完全可以运行,反之则不成立。     依赖倒转原则:抽象不应该依赖于细节,细节应当依赖于抽象,要针对接口编程,而不是针对实现编程。即是抽象就像大的解决方案,细节是实施的具体方法。     接口隔离原则:定制服务的例子,每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干。     遵循着这些原则,设计模式已经被人们发展出最为常用的23种设计模式,这些模式已经非常成熟,得到大多数人的认可。目前我也在学习,可以说能够掌握的也就只有四种模式而已,但仅这四种也为我带来了很多思想,灵感,往后我将我掌握的这四种模式会与大家分享。 最后推荐一部好书:《软件秘笈:设计模式那点事》