??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码日韩AV无码导航,亚洲国语精品自产拍在线观看 ,亚洲中文久久精品无码ww16http://m.tkk7.com/henry1451/articles/210086.htmlhenry1451henry1451Mon, 23 Jun 2008 08:18:00 GMThttp://m.tkk7.com/henry1451/articles/210086.htmlhttp://m.tkk7.com/henry1451/comments/210086.htmlhttp://m.tkk7.com/henry1451/articles/210086.html#Feedback0http://m.tkk7.com/henry1451/comments/commentRss/210086.htmlhttp://m.tkk7.com/henry1451/services/trackbacks/210086.html1?一个拦截器是?/span>xwork.xml文g中定义的一个无状?/span>Javac,它至要实现XWork?/span>com.opensymphony.xwork.interceptor.Interceptor接口。代码如下:

public interface Interceptor extends Serializable {

    void destroy();

 

    void init();

 

    String intercept(ActionInvocation invocation) throws Exception;

}

2?实现Interceptor接口的拦截器Q代码部分在interceptҎ中实现。在interceptҎ中,可以直接q回一?/span>Result字符Ԍq样整个执行直接“短\”Q这?/span>Action?/span>executeҎ也不会执行(一般很会q么用)。所以,一般都会在q个Ҏ里调用参数对?/span>invocation?/span>invokeҎQƈq回q个Ҏ执行的结果。这样会持箋执行后面的拦截器Ҏ以及Action?/span>executeҎ{?/span>

3?大部分的时候,拦截器直接?/span>WebWork的抽象类com.opensymphony.xwork.interceptor.AroundInterceptor可以了。这Ӟ需要实现它?/span>before?/span>afterҎ?/span>BeforeҎ会在Action执行之前调用Q?/span>afterҎ?/span>Action执行之后调用?/span>

4?拦截器的执行序。我们可多个拦截器放一L装成一个拦截器栈。这h截器会按照栈的顺序由上而下执行beforeҎQ所?/span>beforeҎ执行l束Q再执行Action的方法,执行Result的方法,再返回执行结果,最后再从下而上执行拦截器的afterҎ?/span>

5?拦截器的qo功能。我们通常会在应用中用一个通用的定义多个拦截器的拦截器栈。但有些ActionҎ在调用的时候,不需要要其中的部分拦截器。这Ӟ我们可以用拦截器qo功能。如果拦截器要拥有过滤功能,必须实现抽象c?/span>com.opensymphony.xwork.interceptor.MethodFilterInterceptor。这P拦截器在定义的时候或者在Action引用拦截器栈的时候,我们可以指定哪?/span>ActionҎ是需要过滤的Q哪?/span>Action是不需要过滤的?/span>

 

WebWork提供的拦截器介绍

1?自动?/span>ActionHttph数据的拦截器(Parameters Interceptor)。这个拦截器非常方便实用Q但完全自动l装对象数据Q很可能会带来安全问题。如?/span>Action不需要设|数据,那么q个Action只要实现com.opensymphony.xwork.interceptor.NoParameters接口卛_。如果是Action中部分数据需要自动设|,部分数据不允许设|,q样可以实现接口com.opensymphony.xwork.interceptor.ParameterNameAwareQ可以在q个接口?/span>acceptableParameterName(String parameterName)Ҏ中,定义我们可以接受哪些ҎQ如果允许只要让q个Ҏq回True可以了?/span>

2?q虑参数功能的拦截器Q?/span>Parameter Filter InterceptorQ。它可以全局L非法或不允许Action讉K的参数。可以很好的和上面的l装参数的拦截器一起用?/span>

3??/span>Action讄静态数据的拦截器(Static Parameters InterceptorQ。它可以?/span>Action定义的静?/span><param/>参数Q设|到Action中?/span>

4?数据验证拦截器(Validation InterceptorQ。定义之后,会调用验证文件或实现验证接口com.opensymphony.xwork.Validateable的所有验证?/span>

5?验证程处理拦截器(Workflow InterceptorQ。它和上面的拦截器一起用,处理验证的流E。如果验证通过则l前q,如果发现有验证错误消息,直接转到Action中定义的输入l果Q?/span>inputQ页面?/span>

6?cd转换错误处理拦截器(Q。它首先d得类型{换的错误消息Q主要是p|?/span>Httph参数的拦截器产生Q,如果取到错误消息Q它会将错误消息传递给实现接口com.opensymphony.xwork.ValidationAware?/span>ActionQ这h们可以将q些错误消息暴露到页面中?/span>

7?Action链拦截器Q?/span>Chaining InterceptorQ。它是用来拷贝前一?/span>Action的属性数据到当前Action中。它要求前一?/span>Action必须?/span>chain ResultQ?/span><result type="chain">Q,q样才能q行Action的数据拷贝?/span>

8?防止面重复提交Q或面重复hQ拦截器?/span>Token Interceptor?/span>Token Session Interceptor都是防止重复提交的拦截器。不同点是后者在Session存贮了最q一ơ请求的l果数据?/span>

9?文g上传的拦截器Q?/span>File Upload InterceptorQ。实现文件上传的功能。如果有人曾l手工写q文件上传程序,那一定会惊叹于这个拦截器。我们可以在q个拦截器中讑֮上传文g的大和cd限制。记得需要第三方的文件上传库的支持,只要?/span>webwork.properties中配|过Qƈ拯相应?/span>jar包就可以了?/span>

10?span>                      q度条等待拦截器Q?/span>Execute and Wait InterceptorQ。当Action的执行需要很长实际的时候,我们可以使用q个q度条等待的拦截器。它会将Action攑ֈ后台执行Q而在前端昄q度条或{待消息提示的页面?/span>

11?span>                      q有一些其它不常用的拦截器Q我们可以在WebWork文档中找刎ͼq里׃再做介绍?/span>

IoC 容器

关于IoC容器的描qͼ

1?它是一个容器。用来处理不同对象之间的依赖Q组装不同的E序元素?/span>

2?IoC全名?/span>Inversion of ControlQ即依赖反{控制。它是一U设计模式,IoC容器是Zq个模式的实现?/span>

3?有一个比IoC更适合用来命名q一原理的名词,它叫Dependency InjectionQ即依赖注入?/span>

4?有了依赖注入Q我们可以将IoC容器单理解ؓQ它是一个用来ؓ对象l装其依赖的对象的容器;也就是说对象本n不用兛_它依赖的对象Q可以是lg或者服务,反正是提供业务Ҏ的对象)的创建,初始化,生命周期{,而是由容器来控制?/span>

5?关于IoC的更多信息可以查?/span>Martin Fowler的经典文章?/span>IoC 容器?/span>Dependency Injection 模式?/span>

WebWork框架本n提供了一个基于接口的IoC容器。同?/span>WebWork框架和提供了和第三方IoC容器的集成。在WebWork的项目中Q我们可以直接?/span>Spring框架?/span>Pico框架作ؓ自己?/span>IoC容器。而且Spring?/span>WebWork官方推荐?/span>IoC容器?/span>

下面我们介l如何?/span>Spring作ؓWebWork?/span>IoC容器。在讨论如何集成Spring之前Q我们要讨论一个非常有意义的架构问题:

WebWork?/span>ActioncL否需要由Spring理Q?/span>

1?否。这?/span>Actionc还是象以前那样?/span>xwork文g中定义,我们可以通过标签<external-ref/>定义Action所依赖?/span>BeanlgQ或者根?/span>Bean的名字或cdq行自动注入?/span>

2?是?/span>ActioncLw也是有Spring来管理。在xwork定义文g中的Action class是?/span>Bean的引用,具体的类?/span>Spring?/span>Bean配置文g中定义。这样可以更好的使用Sping为我们提供的更多功能Q例如:Spring的复?/span>AOP功能Q基?/span>Acegi的权限控Ӟ{等?/span>

两种ҎQ根据需要选择一U,我个人更們֐后者。下面我们介l一?/span>Spring容器的安装步骤:

1?Spring依赖的所?/span>jar文g

2??/span>web.xml文g定义和开?/span>Spring的监听器Q代码如下:

<listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

      </listener>

3??/span>webwork.properties中设|?/span>WebWork?/span>Spring的支持:webwork.objectFactory = spring

4?可以?/span>webwork.properties中设|?/span>Beanlg的默认组装方式,默认是按?/span>Bean的名Uͼ可以选择按照cd、构造函数、自动选择{方式?/span>

 

WebWork 原理


webwork archit.png

WebWork的网站上提供了一个完整的WebWork架构图。它描述了从客户端的一ơ请求到最后服务器端响应的的整个执行过E。架构图如下Q?/span>

 

此架构图一个分Z个部分,其中五个部分分别有五中不同颜色表C?/span>

1?灰色方框。分别代表了客户端的一?/span>HttphQ和服务器端q算l束之后的一ơ响应?/span>

2?红色方框。表CZ?/span>Actionh所要经q的Servlet filtersQ?/span>Servlet qo器)。我们可以看到最后一?/span>filter是我们前面介绍?/span>WebWork的前端控制器?/span>

3?蓝色Ҏ。这?/span>WebWork框架的核心部分?/span>

1Q?一ơ请求到?/span>WebWork的前端控制器Q它首先会根据请求的URL解析出对应的action 名称Q然后去咨询ActionMapperq个action是否需要被执行?/span>

2Q?如果ActionMapper军_q个action需要被执行Q前端控制器把工作委派l?/span>ActionProxy。接着她们会咨?/span>WebWork的配|管理器Qƈd?/span>web.xml文g中定义的配置信息。接下来ActionProxy会创?/span>ActionInvocation对象?/span>

3Q?ActionInvocation?/span>Xwork原理的(Command模式Q实现部分。它会调用这?/span>Action已定义的拦截?/span>(beforeҎ)Q?/span>ActionҎQ?/span>ResultҎ?/span>

4Q?最后,看上面流E的囄方向Q它会再执行拦截器(afterҎQ?/span>Q再回到Servlet Filter部分Q最后结束ƈ传给用户一个结果响应?/span>

4?靛色Ҏ。这是拦截器部分Q在上面的拦截器章节我们已经有了详细的介l?/span>

5?黄色Ҏ。这是我们在开?/span>Web应用Ӟ需要自己开发的E序。其中包括:Actionc,面模板Q配|文?/span>xwork.xml?/span>

     

WebWork 实战和技?/span>

限于幅Q我们无法在本章节给出很多详的具体实例。其实,?/span>WebWork的代码包中,有一个非常好的演C项目—?/span>showcaseQ它用例子演CZWebWork的几乎所有特性。值得初学的朋友反复研I。我们在本章节中会截取其中的部分代码脚本?/span>

 

1?多视图支持?/span>WebWork框架天生支持多种视图技术,包括Q?/span>Jsp?/span>FreeMarker?/span>Velocity?/span>Jasper Reports?/span>XSLTQ还有其它的视图技术。这在敏捷目中特别有用。在我咨询的目中,有一个因为技术的原因Q视图技术由最先的Jsp改ؓVelocityQ后来又攚wؓFreeMarker。其中,ActioncM及后台的E序没有做Q何的改动。如果您需要一个视囑ֱ现层技术,我在q会好不犹U的向您推?/span>FreeMarker。这也是官方的推荐?/span>

关于视图技术的使用Q首先是搭徏视图技术运行的环境。然后就是编写页面脚本,最后就是在xwork.xml文g中配|?/span>Xwork配置文g中,Result?/span>type参数Q就是用来标C所使用的视图技术。在showcase目中,使用到的视图技术有Q?/span>Jsp?/span>FreeMarker?/span>Velocity?/span>Jasper Reports?/span>

 

2?Action的数据验证功能。在WebWork中,可以在三处实现数据验证功能。一、验证文Ӟ例如:ActionClass-validation.xml文gQ中定义数据验证规则。二、在Action中实?/span>com.opensymphony.xwork.Validateable接口?/span>validateҎ。三、在Action的执行方法中Q硬~码实现验证功能。当Ӟ在实现验证时Q我们尽可能的用前面两中Ҏ?/span>

关于验证的说明:

1Q、第一U验证需?#8220;validation”拦截器的支持。ƈ可以从Q意层ơ绑定验证文Ӟ可以Z?/span>Actioncȝ定一个验证文Ӟ也可以ؓ一个具体在xwork.xml文g中的Action定义l定一个验证文Ӟ可以?/span>Action的一个属性对象绑定一个验证文Ӟ甚至可以?/span>Action的父cȝ定验证文件?/span>

2Q?/span>WebWork为验证文件提供了一些标准的验证实现:例如Q字D必d写,整型?/span>E-mail地址{等。我们也可以使用表达式语a实现更复杂的数据验证?/span>

 

3?cd转换。前面外面一直提到过Q?/span>WebWork会自动从h的字W串参数中组?/span>Action需要的数据对象。这P׃存在一个类型{换的问题。如?/span>Action的字D|基本cd或是一个数据对象,WebWork会自动帮我们处理。如?/span>Action的字D|一个集合,或者我们需要特定的cd转换Q这Ӟ我们可以在类型{换的定义文gQ?/span>ClassName-conversion.propertiesQ中定义转换规则?/span>

4?一?/span>Action的多个执行方法?/span>WebWork?/span>Action是基?/span>Command模式的实玎ͼ?/span>WebWork中,除了实现Action接口?/span>execute()Ҏ之外Q?/span>Actionq可以定义多个执行方法。这些方法必要是无Ҏ参数Qƈ且返回返回字W串的方法。这h们在Url中可以用cM下面的格式访问:actionName!methodName.actionQ例?/span>user!doAdd.actionQ调?/span>user ActiondoAddҎ。在最新的WebWork中,Actioncȝ臛_以不实现Action接口?/span>

5?Action链(Action ChainingQ。在WebWork中,一ơ用戯求,可由多个Action共同完成。每?/span>Action可以只实现自己本w的功能单元Q这h们可以根据业务需要ؓ用户的一ơ请求选择一个或多个Action功能单元来实现?/span>在这L多个Action之间可以通过chain拦截器共享数据。如果请求由Action x 铑ֈAction yQ如果这?/span>y需要获?/span>x的数据,我们需要ؓAction ydchain拦截器?/span>

例如Q在showcase中就?/span>Action Chaining的应用。它?/span>ActionactionChain2”铑ֈ另外一?/span>ActionactionChain3”Q配|文件代码如下:

      < action name = "actionChain2" class = "com.opensymphony.webwork.showcase.actionchaining.ActionChain2" >

                  < result type = "chain" > actionChain3 </ result >

            </ action >

            < action name = "actionChain3" class = "com.opensymphony.webwork.showcase.actionchaining.ActionChain3" >

                  < result > /actionchaining/actionChainingResult.jsp </ result >

         </ action >

注意Q如果要?/span> chain 拦截器,是需要加?/span> actionChain3 中,而不?/span> actionChain2 ?/span>

 

6?多模块支持解x案?/span> WebWork 提供了很灉|的多模块解决ҎQ这h们可以很好的l织复杂?/span> Web 应用目?/span>

1 Q可以在 xwork.xml 文g中,?/span> include 标签包含另外的一?/span> xwork 配置文g。例如: <include file="webwork-default.xml"/>

2 Q?/span> xwork.xml 配置文g支持 package 。我们可以将一个业务模块的定义方到一?/span> package Q?/span> package 支持l承功能Q子 package 可以享有?/span> package 的所有定义?/span>

3 Q可以ؓ package 定义一个命名空间。不同的命名I间可以定义相同?/span> action 名字。命名空间会用于讉K action ?/span> URL Q基于这个命名空_我们可以实现资源权限的访问控制?/span>

 

7?doInput Ҏ。这是我们常用的技巧,有时候请求的是一个页面模板,M能ؓq个单独写一?/span> Action cdQ这时我们就可以?/span> ActionSupport ?/span> doInput ҎQ直接返回在 Actoion 中定义ؓ“ input ”?/span> result ?/span>

8?prepareҎ。如果在Action执行之前Q必要初始化一些数据。我们可以将q些初始化的代码方到prepareҎ中。这ӞActionc要实现接口com.opensymphony.xwork.PreparableQ同时这?/span>Action的定义还需?/span>PrepareInterceptor拦截器的支持?/span>

9?Action?/span>Model Driven。我们大部分的时候用得都?/span>Action?/span>Field DrivenQ即直接?/span>Action的字D作为数据模型?/span>Model Driven是专门ؓq个Action指定一个模型对象,q样有什么好处呢Q好处是在表辑ּ语言中少了一个对象名的前~。例如:前面值堆栈部分关?/span>Employee的例子,要设|雇员名Uͼ我们必须要表辑ּ语言例如Q?#8220;employee.name”Q如果这个数据是有页面输入得刎ͼ那么你就必须有一?/span>Input输入框的name?#8220;employee.name”Q因为它有关键字W?#8220;.”Q如?/span>Javascript脚本使用q个输入框的名字Q就会有错误。?/span>Model Driven之后Q这个表辑ּ可以变?#8220;name”Q省M前面?#8220;employee.”?/span>

10?span>                      Quick Start。这?/span>WebWork2.2.2中非常激动h心的Ҏ。它可以?/span>perl?/span>PHP可以快速看到程序运行结果。这样在Web开发时Q可以不用编?/span>Java源代码,也不用去做打包和部vQ就可以快速看到最新程序的q行l果Q提高开发效率。我们可以在WebWork源码解压包的根目录,输入命oQ?/span>java -jar webwork-2.2.2.jar quickstart:showcaseQ需?/span>jdk1.5的支持)Q以Quick Start模式Q运?/span>showcase目?/span>

展望 WebWork 未来

q是很多人非常关心的一个问题。特别是WebWork2.2版本发布之后Q官方宣U?/span>WebWork框架要?/span>Struts合ƈ。这让一?/span>WebWork的用户生了担忧Q合q之后,是不是就意味着自己?/span>WebWorkq方面技术和l验的积累都已浪费?已用或卛_使用WebWork的项目是不是意味着更多的风险?

{案是:完全不用担心q些?/span>WebWork?/span>Struts的合qӞ是各取所长,然后诞生Z个更加高效的Web框架。而这个框架用得就?/span>WebWork的优U技术和Struts的强大社区?/span>

合ƈ的情况如下:

1?产生一个新的项?/span>Struts Action 2.0 = WebWork2.2 + 一?/span>Struts的功能和Ҏ?/span>

2?WebWork框架会中止新功能的增加Q如果有新的版本发布都会?/span>Bug的修攏V?/span>

3?代码、框架的开发者、社区都移?/span>Struts?/span>

4?合ƈ的目标是致力于生产率的提高?/span>

5?Struts不再是一个框Ӟ它是一个社区?/span>

6?StrutsC֌中主要有两个Web框架。一个是ZAction模型?/span>Struts ActionQ另一个是Zlg模型?/span>Struts Shale?/span>

ȝ

 

WebWork是本人工L中最q一?/span>J2EE Web框架。本人开发过单纯使用Jsp?/span>JavaServlet的项目;也曾l自己开发过ZMVC?/span>Web框架Q在2002q开始?/span>Struts开发;后来也在目中分别用过Tapestry?/span>Spring MVC Web框架Q也在当今的AJAX潮流中随波逐流。上面的一些技术也都非怼UQ擅用他们Q何一个都会给您带来很多生产效率的提高。但我仍然是偏爱WebWork?/span>WebWork的与众不同,得力于它ZOGNL的强大的数据存、取方式Q得力于它那解耦的拦截器功能,得力于它那无侵入的架构设计。正是由于它Q才?/span>Web~程变得更加的自然、简单、灵zR高效?/span>



henry1451 2008-06-23 16:18 发表评论
]]>
(?Interceptor(拦截?http://m.tkk7.com/henry1451/articles/210084.htmlhenry1451henry1451Mon, 23 Jun 2008 08:17:00 GMThttp://m.tkk7.com/henry1451/articles/210084.htmlhttp://m.tkk7.com/henry1451/comments/210084.htmlhttp://m.tkk7.com/henry1451/articles/210084.html#Feedback0http://m.tkk7.com/henry1451/comments/commentRss/210084.htmlhttp://m.tkk7.com/henry1451/services/trackbacks/210084.html1?一个拦截器是?/span>xwork.xml文g中定义的一个无状?/span>Javac,它至要实现XWork?/span>com.opensymphony.xwork.interceptor.Interceptor接口。代码如下:

public interface Interceptor extends Serializable {

    void destroy();

 

    void init();

 

    String intercept(ActionInvocation invocation) throws Exception;

}

2?实现Interceptor接口的拦截器Q代码部分在interceptҎ中实现。在interceptҎ中,可以直接q回一?/span>Result字符Ԍq样整个执行直接“短\”Q这?/span>Action?/span>executeҎ也不会执行(一般很会q么用)。所以,一般都会在q个Ҏ里调用参数对?/span>invocation?/span>invokeҎQƈq回q个Ҏ执行的结果。这样会持箋执行后面的拦截器Ҏ以及Action?/span>executeҎ{?/span>

3?大部分的时候,拦截器直接?/span>WebWork的抽象类com.opensymphony.xwork.interceptor.AroundInterceptor可以了。这Ӟ需要实现它?/span>before?/span>afterҎ?/span>BeforeҎ会在Action执行之前调用Q?/span>afterҎ?/span>Action执行之后调用?/span>

4?拦截器的执行序。我们可多个拦截器放一L装成一个拦截器栈。这h截器会按照栈的顺序由上而下执行beforeҎQ所?/span>beforeҎ执行l束Q再执行Action的方法,执行Result的方法,再返回执行结果,最后再从下而上执行拦截器的afterҎ?/span>

5?拦截器的qo功能。我们通常会在应用中用一个通用的定义多个拦截器的拦截器栈。但有些ActionҎ在调用的时候,不需要要其中的部分拦截器。这Ӟ我们可以用拦截器qo功能。如果拦截器要拥有过滤功能,必须实现抽象c?/span>com.opensymphony.xwork.interceptor.MethodFilterInterceptor。这P拦截器在定义的时候或者在Action引用拦截器栈的时候,我们可以指定哪?/span>ActionҎ是需要过滤的Q哪?/span>Action是不需要过滤的?/span>

 

WebWork提供的拦截器介绍

1?自动?/span>ActionHttph数据的拦截器(Parameters Interceptor)。这个拦截器非常方便实用Q但完全自动l装对象数据Q很可能会带来安全问题。如?/span>Action不需要设|数据,那么q个Action只要实现com.opensymphony.xwork.interceptor.NoParameters接口卛_。如果是Action中部分数据需要自动设|,部分数据不允许设|,q样可以实现接口com.opensymphony.xwork.interceptor.ParameterNameAwareQ可以在q个接口?/span>acceptableParameterName(String parameterName)Ҏ中,定义我们可以接受哪些ҎQ如果允许只要让q个Ҏq回True可以了?/span>

2?q虑参数功能的拦截器Q?/span>Parameter Filter InterceptorQ。它可以全局L非法或不允许Action讉K的参数。可以很好的和上面的l装参数的拦截器一起用?/span>

3??/span>Action讄静态数据的拦截器(Static Parameters InterceptorQ。它可以?/span>Action定义的静?/span><param/>参数Q设|到Action中?/span>

4?数据验证拦截器(Validation InterceptorQ。定义之后,会调用验证文件或实现验证接口com.opensymphony.xwork.Validateable的所有验证?/span>

5?验证程处理拦截器(Workflow InterceptorQ。它和上面的拦截器一起用,处理验证的流E。如果验证通过则l前q,如果发现有验证错误消息,直接转到Action中定义的输入l果Q?/span>inputQ页面?/span>

6?cd转换错误处理拦截器(Q。它首先d得类型{换的错误消息Q主要是p|?/span>Httph参数的拦截器产生Q,如果取到错误消息Q它会将错误消息传递给实现接口com.opensymphony.xwork.ValidationAware?/span>ActionQ这h们可以将q些错误消息暴露到页面中?/span>

7?Action链拦截器Q?/span>Chaining InterceptorQ。它是用来拷贝前一?/span>Action的属性数据到当前Action中。它要求前一?/span>Action必须?/span>chain ResultQ?/span><result type="chain">Q,q样才能q行Action的数据拷贝?/span>

8?防止面重复提交Q或面重复hQ拦截器?/span>Token Interceptor?/span>Token Session Interceptor都是防止重复提交的拦截器。不同点是后者在Session存贮了最q一ơ请求的l果数据?/span>

9?文g上传的拦截器Q?/span>File Upload InterceptorQ。实现文件上传的功能。如果有人曾l手工写q文件上传程序,那一定会惊叹于这个拦截器。我们可以在q个拦截器中讑֮上传文g的大和cd限制。记得需要第三方的文件上传库的支持,只要?/span>webwork.properties中配|过Qƈ拯相应?/span>jar包就可以了?/span>

10?span>                      q度条等待拦截器Q?/span>Execute and Wait InterceptorQ。当Action的执行需要很长实际的时候,我们可以使用q个q度条等待的拦截器。它会将Action攑ֈ后台执行Q而在前端昄q度条或{待消息提示的页面?/span>

11?span>                      q有一些其它不常用的拦截器Q我们可以在WebWork文档中找刎ͼq里׃再做介绍?/span>

IoC 容器

关于IoC容器的描qͼ

1?它是一个容器。用来处理不同对象之间的依赖Q组装不同的E序元素?/span>

2?IoC全名?/span>Inversion of ControlQ即依赖反{控制。它是一U设计模式,IoC容器是Zq个模式的实现?/span>

3?有一个比IoC更适合用来命名q一原理的名词,它叫Dependency InjectionQ即依赖注入?/span>

4?有了依赖注入Q我们可以将IoC容器单理解ؓQ它是一个用来ؓ对象l装其依赖的对象的容器;也就是说对象本n不用兛_它依赖的对象Q可以是lg或者服务,反正是提供业务Ҏ的对象)的创建,初始化,生命周期{,而是由容器来控制?/span>

5?关于IoC的更多信息可以查?/span>Martin Fowler的经典文章?/span>IoC 容器?/span>Dependency Injection 模式?/span>

WebWork框架本n提供了一个基于接口的IoC容器。同?/span>WebWork框架和提供了和第三方IoC容器的集成。在WebWork的项目中Q我们可以直接?/span>Spring框架?/span>Pico框架作ؓ自己?/span>IoC容器。而且Spring?/span>WebWork官方推荐?/span>IoC容器?/span>

下面我们介l如何?/span>Spring作ؓWebWork?/span>IoC容器。在讨论如何集成Spring之前Q我们要讨论一个非常有意义的架构问题:

WebWork?/span>ActioncL否需要由Spring理Q?/span>

1?否。这?/span>Actionc还是象以前那样?/span>xwork文g中定义,我们可以通过标签<external-ref/>定义Action所依赖?/span>BeanlgQ或者根?/span>Bean的名字或cdq行自动注入?/span>

2?是?/span>ActioncLw也是有Spring来管理。在xwork定义文g中的Action class是?/span>Bean的引用,具体的类?/span>Spring?/span>Bean配置文g中定义。这样可以更好的使用Sping为我们提供的更多功能Q例如:Spring的复?/span>AOP功能Q基?/span>Acegi的权限控Ӟ{等?/span>

两种ҎQ根据需要选择一U,我个人更們֐后者。下面我们介l一?/span>Spring容器的安装步骤:

1?Spring依赖的所?/span>jar文g

2??/span>web.xml文g定义和开?/span>Spring的监听器Q代码如下:

<listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

      </listener>

3??/span>webwork.properties中设|?/span>WebWork?/span>Spring的支持:webwork.objectFactory = spring

4?可以?/span>webwork.properties中设|?/span>Beanlg的默认组装方式,默认是按?/span>Bean的名Uͼ可以选择按照cd、构造函数、自动选择{方式?/span>

 

WebWork 原理


webwork archit.png

WebWork的网站上提供了一个完整的WebWork架构图。它描述了从客户端的一ơ请求到最后服务器端响应的的整个执行过E。架构图如下Q?/span>

 

此架构图一个分Z个部分,其中五个部分分别有五中不同颜色表C?/span>

1?灰色方框。分别代表了客户端的一?/span>HttphQ和服务器端q算l束之后的一ơ响应?/span>

2?红色方框。表CZ?/span>Actionh所要经q的Servlet filtersQ?/span>Servlet qo器)。我们可以看到最后一?/span>filter是我们前面介绍?/span>WebWork的前端控制器?/span>

3?蓝色Ҏ。这?/span>WebWork框架的核心部分?/span>

1Q?一ơ请求到?/span>WebWork的前端控制器Q它首先会根据请求的URL解析出对应的action 名称Q然后去咨询ActionMapperq个action是否需要被执行?/span>

2Q?如果ActionMapper军_q个action需要被执行Q前端控制器把工作委派l?/span>ActionProxy。接着她们会咨?/span>WebWork的配|管理器Qƈd?/span>web.xml文g中定义的配置信息。接下来ActionProxy会创?/span>ActionInvocation对象?/span>

3Q?ActionInvocation?/span>Xwork原理的(Command模式Q实现部分。它会调用这?/span>Action已定义的拦截?/span>(beforeҎ)Q?/span>ActionҎQ?/span>ResultҎ?/span>

4Q?最后,看上面流E的囄方向Q它会再执行拦截器(afterҎQ?/span>Q再回到Servlet Filter部分Q最后结束ƈ传给用户一个结果响应?/span>

4?靛色Ҏ。这是拦截器部分Q在上面的拦截器章节我们已经有了详细的介l?/span>

5?黄色Ҏ。这是我们在开?/span>Web应用Ӟ需要自己开发的E序。其中包括:Actionc,面模板Q配|文?/span>xwork.xml?/span>

     

WebWork 实战和技?/span>

限于幅Q我们无法在本章节给出很多详的具体实例。其实,?/span>WebWork的代码包中,有一个非常好的演C项目—?/span>showcaseQ它用例子演CZWebWork的几乎所有特性。值得初学的朋友反复研I。我们在本章节中会截取其中的部分代码脚本?/span>

 

1?多视图支持?/span>WebWork框架天生支持多种视图技术,包括Q?/span>Jsp?/span>FreeMarker?/span>Velocity?/span>Jasper Reports?/span>XSLTQ还有其它的视图技术。这在敏捷目中特别有用。在我咨询的目中,有一个因为技术的原因Q视图技术由最先的Jsp改ؓVelocityQ后来又攚wؓFreeMarker。其中,ActioncM及后台的E序没有做Q何的改动。如果您需要一个视囑ֱ现层技术,我在q会好不犹U的向您推?/span>FreeMarker。这也是官方的推荐?/span>

关于视图技术的使用Q首先是搭徏视图技术运行的环境。然后就是编写页面脚本,最后就是在xwork.xml文g中配|?/span>Xwork配置文g中,Result?/span>type参数Q就是用来标C所使用的视图技术。在showcase目中,使用到的视图技术有Q?/span>Jsp?/span>FreeMarker?/span>Velocity?/span>Jasper Reports?/span>

 

2?Action的数据验证功能。在WebWork中,可以在三处实现数据验证功能。一、验证文Ӟ例如:ActionClass-validation.xml文gQ中定义数据验证规则。二、在Action中实?/span>com.opensymphony.xwork.Validateable接口?/span>validateҎ。三、在Action的执行方法中Q硬~码实现验证功能。当Ӟ在实现验证时Q我们尽可能的用前面两中Ҏ?/span>

关于验证的说明:

1Q、第一U验证需?#8220;validation”拦截器的支持。ƈ可以从Q意层ơ绑定验证文Ӟ可以Z?/span>Actioncȝ定一个验证文Ӟ也可以ؓ一个具体在xwork.xml文g中的Action定义l定一个验证文Ӟ可以?/span>Action的一个属性对象绑定一个验证文Ӟ甚至可以?/span>Action的父cȝ定验证文件?/span>

2Q?/span>WebWork为验证文件提供了一些标准的验证实现:例如Q字D必d写,整型?/span>E-mail地址{等。我们也可以使用表达式语a实现更复杂的数据验证?/span>

 

3?cd转换。前面外面一直提到过Q?/span>WebWork会自动从h的字W串参数中组?/span>Action需要的数据对象。这P׃存在一个类型{换的问题。如?/span>Action的字D|基本cd或是一个数据对象,WebWork会自动帮我们处理。如?/span>Action的字D|一个集合,或者我们需要特定的cd转换Q这Ӟ我们可以在类型{换的定义文gQ?/span>ClassName-conversion.propertiesQ中定义转换规则?/span>

4?一?/span>Action的多个执行方法?/span>WebWork?/span>Action是基?/span>Command模式的实玎ͼ?/span>WebWork中,除了实现Action接口?/span>execute()Ҏ之外Q?/span>Actionq可以定义多个执行方法。这些方法必要是无Ҏ参数Qƈ且返回返回字W串的方法。这h们在Url中可以用cM下面的格式访问:actionName!methodName.actionQ例?/span>user!doAdd.actionQ调?/span>user ActiondoAddҎ。在最新的WebWork中,Actioncȝ臛_以不实现Action接口?/span>

5?Action链(Action ChainingQ。在WebWork中,一ơ用戯求,可由多个Action共同完成。每?/span>Action可以只实现自己本w的功能单元Q这h们可以根据业务需要ؓ用户的一ơ请求选择一个或多个Action功能单元来实现?/span>在这L多个Action之间可以通过chain拦截器共享数据。如果请求由Action x 铑ֈAction yQ如果这?/span>y需要获?/span>x的数据,我们需要ؓAction ydchain拦截器?/span>

例如Q在showcase中就?/span>Action Chaining的应用。它?/span>ActionactionChain2”铑ֈ另外一?/span>ActionactionChain3”Q配|文件代码如下:

      < action name = "actionChain2" class = "com.opensymphony.webwork.showcase.actionchaining.ActionChain2" >

                  < result type = "chain" > actionChain3 </ result >

            </ action >

            < action name = "actionChain3" class = "com.opensymphony.webwork.showcase.actionchaining.ActionChain3" >

                  < result > /actionchaining/actionChainingResult.jsp </ result >

         </ action >

注意Q如果要?/span> chain 拦截器,是需要加?/span> actionChain3 中,而不?/span> actionChain2 ?/span>

 

6?多模块支持解x案?/span> WebWork 提供了很灉|的多模块解决ҎQ这h们可以很好的l织复杂?/span> Web 应用目?/span>

1 Q可以在 xwork.xml 文g中,?/span> include 标签包含另外的一?/span> xwork 配置文g。例如: <include file="webwork-default.xml"/>

2 Q?/span> xwork.xml 配置文g支持 package 。我们可以将一个业务模块的定义方到一?/span> package Q?/span> package 支持l承功能Q子 package 可以享有?/span> package 的所有定义?/span>

3 Q可以ؓ package 定义一个命名空间。不同的命名I间可以定义相同?/span> action 名字。命名空间会用于讉K action ?/span> URL Q基于这个命名空_我们可以实现资源权限的访问控制?/span>

 

7?doInput Ҏ。这是我们常用的技巧,有时候请求的是一个页面模板,M能ؓq个单独写一?/span> Action cdQ这时我们就可以?/span> ActionSupport ?/span> doInput ҎQ直接返回在 Actoion 中定义ؓ“ input ”?/span> result ?/span>

8?prepareҎ。如果在Action执行之前Q必要初始化一些数据。我们可以将q些初始化的代码方到prepareҎ中。这ӞActionc要实现接口com.opensymphony.xwork.PreparableQ同时这?/span>Action的定义还需?/span>PrepareInterceptor拦截器的支持?/span>

9?Action?/span>Model Driven。我们大部分的时候用得都?/span>Action?/span>Field DrivenQ即直接?/span>Action的字D作为数据模型?/span>Model Driven是专门ؓq个Action指定一个模型对象,q样有什么好处呢Q好处是在表辑ּ语言中少了一个对象名的前~。例如:前面值堆栈部分关?/span>Employee的例子,要设|雇员名Uͼ我们必须要表辑ּ语言例如Q?#8220;employee.name”Q如果这个数据是有页面输入得刎ͼ那么你就必须有一?/span>Input输入框的name?#8220;employee.name”Q因为它有关键字W?#8220;.”Q如?/span>Javascript脚本使用q个输入框的名字Q就会有错误。?/span>Model Driven之后Q这个表辑ּ可以变?#8220;name”Q省M前面?#8220;employee.”?/span>

10?span>                      Quick Start。这?/span>WebWork2.2.2中非常激动h心的Ҏ。它可以?/span>perl?/span>PHP可以快速看到程序运行结果。这样在Web开发时Q可以不用编?/span>Java源代码,也不用去做打包和部vQ就可以快速看到最新程序的q行l果Q提高开发效率。我们可以在WebWork源码解压包的根目录,输入命oQ?/span>java -jar webwork-2.2.2.jar quickstart:showcaseQ需?/span>jdk1.5的支持)Q以Quick Start模式Q运?/span>showcase目?/span>

 

 

展望 WebWork 未来

q是很多人非常关心的一个问题。特别是WebWork2.2版本发布之后Q官方宣U?/span>WebWork框架要?/span>Struts合ƈ。这让一?/span>WebWork的用户生了担忧Q合q之后,是不是就意味着自己?/span>WebWorkq方面技术和l验的积累都已浪费?已用或卛_使用WebWork的项目是不是意味着更多的风险?

{案是:完全不用担心q些?/span>WebWork?/span>Struts的合qӞ是各取所长,然后诞生Z个更加高效的Web框架。而这个框架用得就?/span>WebWork的优U技术和Struts的强大社区?/span>

合ƈ的情况如下:

1?产生一个新的项?/span>Struts Action 2.0 = WebWork2.2 + 一?/span>Struts的功能和Ҏ?/span>

2?WebWork框架会中止新功能的增加Q如果有新的版本发布都会?/span>Bug的修攏V?/span>

3?代码、框架的开发者、社区都移?/span>Struts?/span>

4?合ƈ的目标是致力于生产率的提高?/span>

5?Struts不再是一个框Ӟ它是一个社区?/span>

6?StrutsC֌中主要有两个Web框架。一个是ZAction模型?/span>Struts ActionQ另一个是Zlg模型?/span>Struts Shale?/span>

ȝ

 

WebWork是本人工L中最q一?/span>J2EE Web框架。本人开发过单纯使用Jsp?/span>JavaServlet的项目;也曾l自己开发过ZMVC?/span>Web框架Q在2002q开始?/span>Struts开发;后来也在目中分别用过Tapestry?/span>Spring MVC Web框架Q也在当今的AJAX潮流中随波逐流。上面的一些技术也都非怼UQ擅用他们Q何一个都会给您带来很多生产效率的提高。但我仍然是偏爱WebWork?/span>WebWork的与众不同,得力于它ZOGNL的强大的数据存、取方式Q得力于它那解耦的拦截器功能,得力于它那无侵入的架构设计。正是由于它Q才?/span>Web~程变得更加的自然、简单、灵zR高效?/span>



henry1451 2008-06-23 16:17 发表评论
]]>
struts2拦截器概q??http://m.tkk7.com/henry1451/articles/208521.htmlhenry1451henry1451Tue, 17 Jun 2008 01:55:00 GMThttp://m.tkk7.com/henry1451/articles/208521.htmlhttp://m.tkk7.com/henry1451/comments/208521.htmlhttp://m.tkk7.com/henry1451/articles/208521.html#Feedback0http://m.tkk7.com/henry1451/comments/commentRss/208521.htmlhttp://m.tkk7.com/henry1451/services/trackbacks/208521.html     Struts2的拦截器和Servletqo器类伹{在执行Action的executeҎ之前QStruts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的interceptҎ后,会执行Action的executeҎ?/span>

Struts2拦截器类必须从com.opensymphony.xwork2.interceptor.Interceptor接口l承Q在Intercepter接口中有如下三个Ҏ需要实玎ͼ

void destroy();
void init();
String intercept(ActionInvocation invocation) 
throws Exception;

其中interceptҎ是拦截器的核心方法,所有安装的拦截器都会调用这个方法。在Struts2中已l在struts-default.xml中预定义了一些自带的拦截器,如timer、params{。如果在<package>标签中承struts-defaultQ则当前package׃自动拥有struts-default.xml中的所有配|。代码如下:

<package name="demo" extends="struts-default" > ... </package>

?/span>struts-default.xml中有一个默认的引用Q在默认情况下(也就?/span><action>中未引用拦截器时Q会自动引用一些拦截器。这个默认的拦截器引用如下:

 

<default-interceptor-ref name="defaultStack"/>

<interceptor-stack name="defaultStack">  
   
<interceptor-ref name="exception"/>
    
<interceptor-ref name="alias"/>
    
<interceptor-ref name="servletConfig"/>
    
<interceptor-ref name="prepare"/>
    
<interceptor-ref name="i18n"/>
    
<interceptor-ref name="chain"/>
    
<interceptor-ref name="debugging"/>
    
<interceptor-ref name="profiling"/>
    
<interceptor-ref name="scopedModelDriven"/>
    
<interceptor-ref name="modelDriven"/>
    
<interceptor-ref name="fileUpload"/>
    
<interceptor-ref name="checkbox"/>
    
<interceptor-ref name="staticParams"/>
    
<interceptor-ref name="params">
        
<param name="excludeParams">dojo\..*</param>
    
</interceptor-ref>
    
<interceptor-ref name="conversionError"/>
    
<interceptor-ref name="validation">
           
<param name="excludeMethods">input,back,cancel,browse</param>
     
</interceptor-ref>
     
<interceptor-ref name="workflow">
            
<param name="excludeMethods">input,back,cancel,browse</param>
     
</interceptor-ref>
</interceptor-stack>

上面?/span>defaultStack中引用的拦截器都可以?/span><action>中不l过引用可以用(如果?/span><action>中引用了M拦截器后Q要使用?/span>defaultStack中定义的拦截器,也需要在<action>中重新引用,在后面将详细讲解Q?/span>

下面我们来看几个单的拦截器的使用Ҏ?/span>

一、记录拦截器?/span>executeҎ的执行时?/span>(timer)

???? timer?/span>Struts2中最单的拦截器,q个拦截器对应的cLcom.opensymphony.xwork2.interceptor.TimerInterceptor。它的功能是记录executeҎ和其他拦截器Q在timer后面定义的拦截器Q的interceptҎ执行的时间d。如下面的配|代码所C:

<action name="first" class="action.FirstAction">
    
<interceptor-ref name="logger"/>
    
<interceptor-ref name="timer" />
</action>

׃?/span>timer后面没有其他的拦截器定义Q因此,timer只能记录executeҎ的执行时_在访?/span>first动作Ӟ会在控制台输出类g面的一条信息:

信息: Executed action [/test/first!execute] took 16 ms.

在?/span>timer拦截器时Q需?/span>commons-logging.jar的支持。将logger引用攑ֈtimer的后面,可以记?/span>logger拦截器的interceptҎ?/span>Action?/span>executeҎ的执行时间dQ代码如下:

<action name="first" class="action.FirstAction">
    
<interceptor-ref name="timer" />
    
<interceptor-ref name="logger"/>
</action>

大家可以使用如下?/span>ActioncL试一?/span>timer拦截器:

package action;

import com.opensymphony.xwork2.ActionSupport;

public class FirstAction extends ActionSupport          

{
       
public String execute() throws Exception

       {
           Thread.sleep(
1000); // 延迟1U?/span>
          
return null;
       }

}

如果只记?/span>executeҎ的执行时_一般会输出如下的信息:

信息: Executed action [/test/first!execute] took 1000 ms.

二、通过h调用Action?/span>setterҎ(params)


   
当客L的一?/span>form向服务端提交hӞ如有一?/span>textfieldQ代码如下:

<s:form action="first" namespace="/test">
   
<s:textfield name="name"/>
   
<s:submit/>
</s:form>

在提交后Q?/span>Struts2会自动调用first动作cM?/span>setNameҎQƈ?/span>name文本框中的值通过setNameҎ的参C入。实际上Q这个操作是?/span>params拦截器完成的Q?/span>params对应的类?/span>com.opensymphony.xwork2.interceptor.ParametersInterceptor。由?/span>params已经?/span>defaultStack中定义,因此Q在未引用拦截器?/span><action>中是会自动引?/span>params的,如下面的配置代码Q在讉Kfirst动作ӞStruts2是会自动执行相应?/span>setterҎ的?/span>

<action name="first" class="action.FirstAction">

    ... ...

</action>

但如果在<action>中引用了其他的拦截器Q就必须再次引用params拦截器,Struts2才能调用相应?/span>setterҎ。如下面的配|代码所C:


<action name="first" class="action.FirstAction">
    
<interceptor-ref name="timer" />
    
<interceptor-ref name="params"/>
</action>

三、通过配置参数调用Action?/span>setterҎ(static-params)

    static-params拦截器可以通过配置<params>标签来调?/span>Actioncȝ相应?/span>setterҎQstatic-params拦截器对应的cLcom.opensymphony.xwork2.interceptor.StaticParametersInterceptor?br />     下面配置代码演示了如何用static-params拦截器:


<action name="first" class="action.FirstAction">
    
<interceptor-ref name="timer" />
    
<param name="who">比尔</param>
    
<interceptor-ref name="params"/>
    
<interceptor-ref name="static-params"/>
</action>

如果first动作使用上面的配|,在访?/span>first动作ӞStruts2会自动调?/span>setWhoҎ?#8220;比尔”作ؓ参数g?/span>setWhoҎ?/span>

四、用拦截器?/span>

Z能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈这些拦截器作ؓ一个整体来引用。拦截器栈要?/span><package>标签中?/span><interceptors>和子标签<interceptor-stack>来定义。代码如下:
<package name="demo" extends="struts-default" >
    
<interceptors>
        
<interceptor-stack name="mystack">
            
<interceptor-ref name="timer" />
            
<interceptor-ref name="logger" />
            
<interceptor-ref name="params" />
            
<interceptor-ref name="static-params" />
        
</interceptor-stack>
    
</interceptors>

    
<action name="first" class="action.FirstAction">
        
<param name="who">比尔</param>
        
<interceptor-ref name="mystack"/>            
    
</action>
</package>
 
可以象用拦截器一样用拦截器栈,如上面代码所C?

henry1451 2008-06-17 09:55 发表评论
]]>
վ֩ģ壺 þþþø߳ëƬȫ | Ƶ77777| ŷղþ99 | ÿµĻ| ŮͬavƬ߹ۿ| һһëѻƬ| ߾Ʒһ| ѹۿ| һƵ| 㶮ѹۿ| AVһ| ձŷҹƬŮԱ | þ޾Ʒ| Ļ˾ƷAV| selaobanƵѾƷ| ž޹Ʒ| ƷһƵ߹ۿ | ޵һƷ| שש| ߹ۿձһ| 3pƵѹۿ| һƵ| 7777þĻ| Ƶ69| ƵƷһ| ˳ӰԺ밴Ħ| ٸһ| ˳С˵վɫ| ޸һ| ߿Ƭ˳Ƶ| ѾƵ߹ۿ| 99þѹƷػ| þƷƵ| ޺ݺݾþۺһ77777| 99߾Ʒȫmy| ѿһ߳ëƬ| ɫۺͼ| ½һëƬƵۿ| avƬ߹ۿ| Ƶ߹ۿƵ| Ƶ߹ۿ|