<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>struts2</title>
    <description>喜欢Struts2的朋友可以加入哦。</description>
    <link>http://struts2.group.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>struts2的namespace</title>
        <author>hilliate</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xiaofeng.javaeye.com">hilliate</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/211954" style="color:red;">http://struts2.group.javaeye.com/group/blog/211954</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>至于命名空间的作用，个人理解是适合让你的程序模块化，不同的模块可以使用不同的命名空间，如果你的小程序小到没有模块之分，那么命名空间就可以不用了。</p>
<p>不同的模块肯定将页面放在不同文件夹下，所以根据你的文件夹来配置命名空间就好了。</p>
<p>如果请求为/login.action，则命名空间为&ldquo;/&rdquo;，struts2会在此命名空间中查找名为login的action，如果找不到，将会出现&ldquo;<strong>There is no Action mapped for action name</strong>&rdquo;这样的错误。</p>
<p>如果请求为/sites/search/searchFile.action，将命名空间配置成&ldquo;/search&rdquo;即可。</p>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/211954#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 23:55:27 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/211954</link>
        <guid>http://struts2.group.javaeye.com/group/blog/211954</guid>
      </item>
      <item>
        <title>第三方仓库系统与ERP库存系统</title>
        <author>samuelray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://samuelray.javaeye.com">samuelray</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/211772" style="color:red;">http://struts2.group.javaeye.com/group/blog/211772</a>&nbsp;
          发表时间: 2008年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ERP中的仓储系统与第三方物流的仓储系统的差别<br />ERP中的仓储系统面向的是第一方或可能的第二方物流,通常既包括采购来的物料,也包括生产之后的成品/半成品配送.通常ERP中的仓储系统功能比较倾向于简单实用,与生产紧密结合,并不需要考虑太多的扩展性与兼容性.而做为第三方物流企业,这些都是必须要考虑的需求之一.同时,也有大量的3PL面向生产型企业,也就是ERP中仓储业务被外包给专业的物流公司,但要求物流公司提供良好的接口,保证接收到的数据的有效,准确,快速.<br /><br />ERP对物料,成品/半成品的管理会达到精细化,而3PL则没有这方面的固定要求.3PL不会关心BOM,不关心有多少损耗,不关心入/出库的是物料还是成品/半成品,她只关心货品对不对,数量对不对,货品的属性对不对.但是企业一定关心使用了多少物料,生产出多少的成品/关成品,产生了多少的不良品.<br /><br />ERP对出入库的类型定义与3PL的定义不同.ERP中可能存在的出入库类型有物料,成品,半成品,不良品,返工等类型,而对于3PL来讲,只有普通的出入库和退货(货主退给供应商),退仓(销售商退给货主)的情况.<br /><br />ERP对库存的性质分类与3PL定义不同.ERP中对库存货品有多种性质的划分,用于统计和分析,合理调配资源,安排采购,生产和销售计划.而对3PL来讲,根本不涉及这些内容,只要你及时发指令过来,我就立马开始工作.我只配合你的工作,前提是你要做好计划.<br /><br />ERP对仓库类型的定义与3PL定义不同.我见过的ERP不多,不过大都把仓库按存放货品的性质分类:成品库,物料库,不良品库,维修库等.实际上有些3PL也是这么划分的.这种划分方式对ERP来讲可能不是问题,但对3PL就不太合适了.按照这种划分方式,仓库的在物理上也必须划分出一些区域来做存放不同性质的货品,那么仓库的利用率自然而然就不会太高.如果采用库存性质本身的特性来解决这个问题,无疑会高效很多.不论是在哪个货位上,都可以存放任何性质的货品,同是系统提供根据不同性质查询库存的功能.<br /><br />存在差异的原因是因为企业和3PL对仓储的定义不同,现实在也有一些3PL在为生产型企业提供物流服务,但往往不能完全满足企业的要求.相信会有越来越多的3PL加入到这个阵营中来,对这方面的系统需求也相应会产生.
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/211772#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jul 2008 22:26:42 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/211772</link>
        <guid>http://struts2.group.javaeye.com/group/blog/211772</guid>
      </item>
      <item>
        <title>Struts2的拦截器总结</title>
        <author>zhuxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhuxinyu.javaeye.com">zhuxinyu</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/211161" style="color:red;">http://struts2.group.javaeye.com/group/blog/211161</a>&nbsp;
          发表时间: 2008年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Struts2中的拦截器和servelt中的过滤器是非常的相似的。如果学过过滤器的话，肯定能够感觉的到，尽管有些微的不同。<br />拦截器的作用主要就是拦截东西，拦截什么呢？当然是'action'了，在执行'action'之前 拦截器会起作用，执行一些预先处理的代码，<br />接着区执行action中相关的方法，之后，流程又会回到拦截器里面，接着去执行后续的一些操作。<br /><br />先看配置，这些配置都是在struts.xml里面的。配置相当简单，不过底层都是很复杂的。在这章之前，我专门看了下动态代理，感觉真的是开发者花了不少的心血，<br /><br />首先先建一个包，放我们的interceptor。<br />过滤器和拦截器是非常相似的，public interface Filter类里面有三个方法：<br />init（FilterConfig filterConfig），destroy(),doFilter(ServletRequest request,ServletResponse response,FilterChain chain),<br />这里面的doFilter（）方法是最重要的，在struts2中就相当于拦截的那个方法。<br /><br />先写一个拦截器，在struts2中要实现一个接口 这个接口是什么呢？在哪呢？是webwork是我们以前听的最多的关于拦截器的框架，<br />struts2用了其中一个核心的东西，这个东西在是什么呢？是xwork恩，有了它才可以拦截，好了我们在哪找呢？<br />在com.opensymphony.xwork2.interceptor中找，里面有个Interceptor 这是个接口，里面也有三个方法，<br />有init，destroy和intercept三个方法，而在struts2里面的所有的拦截器都继承这个接口！<br /><br />就依照这个接口写一个拦截器类，呵呵！<br />package com.interceptor;<br />import com.opensymphony.xwork2.ActionInvocation;<br />import com.opensymphony.xwork2.interceptor.Interceptor;<br /><br />public class MyInterceptor implements Interceptor{<br />    private String hello;//一定要写<br />    get和set方法<br />    public void destroy() {<br />       System.out.println("destory");<br />    }<br />    public void init() {<br />       System.out.println("init");<br />    }<br />    public String intercept(ActionInvocation invoker) throws Exception {<br />       System.out.println("intercept");<br />       String result=invoker.invoke();<br />    //  System.out.println("finish1");<br />       return result;<br />    }<br />}<br /><br />为了看这些是怎么实现的，加入了一些打印！<br />Intercept方法返回一个字符串，这个里面最重要的是ActionInvocation 也是个抽象的接口，里面有个invoke() 方法<br />          作用：Invokes the next step in processing this ActionInvocation. 即调用下一个拦截器，如果有的话！<br />为了，让struts2知道我们写了个拦截器，就在struts。Xml中配置一下。<br />&lt;package name="struts2" extends="struts-default"><br />&lt;interceptors><br />	   &lt;interceptor name="myinterceptor" class="com.interceptor.MyInterceptor"><br />              &lt;param name="hello">world&lt;/param><br />           &lt;/interceptor><br />&lt;/interceptors><br /><br />注释：action是写的一个注册页面，也可以随便用个action 在这个点上是不影响需要检验结果的<br /><br />&lt;action name="register" class="com.test.action.RegisterAction" ><br />           &lt;result name="input">/register.jsp&lt;/result><br />           &lt;result name="success">/success.jsp&lt;/result><br />&lt;/package><br /><br />好了到了这里 拦截器也配置好了，但是拦截器是拦截action的，怎么才能让action被拦截呢？<br />一般的情况下，放在result后面 怎么写呢？好了，如下：<br />&lt;interceptor-ref name="myinterceptor"><br />&lt;/interceptor-ref><br /><br />这样就可以让aciton被拦截了，到此，好了，可以运行程序了：<br /> 输出结果是：启动服务器init被打出<br /> 运行后提交action 输出intercept <br />这个就是初步的一个拦截器。<br /><br /> <br /><br />=======在此可能出现一个问题，是什么呢？如果就我们做的登陆而言，当然登陆大家都做的很多了，可以想一下，有数据转换，有验证数据是否符合我们的要求====<br /><br />Ok 如果按照上述运行的话，当数据转换，验证出错的时候，就不会有提示，为什么呢？ 这里就和struts2的默认拦截器有关系！<br /><br />这里可以打开一个文件看一下，看了就会明白，是什么文件呢？struts-default。Xml<br />这里定义的很多的东西，和我们的程序相关的非常紧密<br />首先这里有个<br />&lt;package name="struts-default" abstract="true">和struts.Xml里面的<br />&lt;package name="struts2" extends="struts-default">有什么一样呢？很明显可以猜到struts.Xml中继承的就是default。Xml中的struts-default。<br />这个里面还有个&lt;interceptors>和&lt;/interceptors>这个是定义拦截器的，仔细看可以发现里面有个validation 如此可以猜想，<br />validation 也是定义的一个拦截器，可是最后当登陆出错后没有提示信息呢？肯定是相关的东西没有执行，以前的执行了，现在没执行，<br />在新加了个拦截器后，这样说明了，是被覆盖了，这个是我仅能想到的！结果就是这个样子的。那么我们手工的添加一个默认的可以吗？<br />答案是可以的！添加如下！<br /><br />接着上面result后面添加一个把！<br />&lt;interceptor-ref name="defaultStack">&lt;/interceptor-ref><br /><br />这样还可以说明：如果我们没有添加拦截器的话，默认的拦截器会自动添加到里面。<br /><br /><br />拦截器栈<br />过滤器可以组成过滤器链，就是可以有多个过滤器来去过滤一个组件，拦截器也是，只不过是叫拦截器栈（相当于串拦截器）。<br />拦截器栈先把拦截器逐个执行，接着执行action方法，之后又按照相反的顺序回到最后的一个拦截器，再回到视图。<br /><br />拦截器栈是怎么构成的呢？继续看struts-default.Xml这个文件！里面有这些东西：<br />            &lt;interceptor-stack name="defaultStack"><br />                &lt;interceptor-ref name="static-params"/><br />                &lt;interceptor-ref name="params"/><br />                &lt;interceptor-ref name="conversionError"/><br />            &lt;/interceptor-stack><br /><br />	  &lt;interceptor-stack name="validationWorkflowStack"><br />                &lt;interceptor-ref name="defaultStack"/><br />                &lt;interceptor-ref name="validation"/><br />                &lt;interceptor-ref name="workflow"/><br />           &lt;/interceptor-stack><br /><br />这里面看见了 栈是什么样的结构，是由很多个预先定义好的拦截器构成，而且也可以再加上拦截器栈组成，就如此就组成了！<br /><br /> <br /><br />还有这行代码：<br />&lt;default-class-ref class="com.opensymphony.xwork2.ActionSupport" /><br />这个是定义默认的拦截器，竟然是默认的当然只可能有一个！是把！<br /><br />好了，到了这里，就来有进一步学习struts2的拦截器把！让我们自己配置自己的拦截器栈！<br />在开始 的时候我们添加的第一个myinterceptor拦截器的时候我添加了一个参数<br /><br />&lt;param name="hello">world&lt;/param> 这里我们可以通过配置文件，给拦截器添加一个参数，那这个在拦截器中怎么取得的呢？<br />了解过滤器的朋友都知道，里面有个init（FilterConfig filterConfig）方法这样可以取值，而在struts2中没有这么麻烦，做法吗，<br />上面其实已经给出来了！<br />private String hello;<br />    get和set方法<br /><br />写个变量，然后加上get和set方法，当然变量的名字必须和设定的参数是相同的，这个是赋值成功的前提条件<br /><br />此时，运行，成功输出：world   这里的参数使用是在定义拦截器的时候，还有一种是在使用拦截器的时候添加参数。怎么做呢？<br /><br />定义拦截器的情况：<br /><br />&lt;interceptor name="myinterceptor" class="com.interceptor.MyInterceptor"><br />              &lt;param name="hello">world&lt;/param><br />&lt;/interceptor><br /><br />使用拦截器的时候的情况：<br />&lt;interceptor-ref name="myinterceptor"><br />              &lt;param name="hello">zhuxinyu&lt;/param><br />&lt;/interceptor-ref><br /><br />这下知道了吗，还有，当出现如上引用的时候给同样的参数设置了不同的值，会显示那一个呢，在运行的时候？<br />结果是：zhuxinyu  很明显 覆盖了第一个  结论是：使用的时候比定义的时候更加厉害，这叫撒，县官不如现管！<br />好了，把这些零散的东西搞完了，真的开始解决更多的知识！<br /><br />拦截器栈，在struts2里面，其实是把拦截器和拦截器栈一样的对待。可以把拦截器栈当作一个拦截器看待，同样的引用。<br />现在定义一个拦截器栈把！<br /><br />同样在&lt;interceptors> &lt;/interceptors>里面定义<br /><br />&lt;interceptor-stack name="mystack"><br />           &lt;interceptor-ref name="myinterceptor">&lt;/interceptor-ref><br />           &lt;interceptor-ref name="defaultStack">&lt;/interceptor-ref><br />&lt;/interceptor-stack><br /><br />看见了没，一个引用第一次定义的myinterceptor拦截器，一个引用默认的拦截器，怎么引用呢，和开始的一个样，呵呵！<br /><br />&lt;interceptor-ref name=" mystack "><br />&lt;/interceptor-ref><br /><br />呵呵 ，这样看是不是比刚才简单呢？把两次引用换成一次！运行结果呢？和上次一样，而且都成功！<br /><br />当然我们也可以自己定义一个默认的拦截器，这样在程序中怎么做呢？呵呵，定义如下<br />&lt;default-interceptor-ref name="mystack">&lt;/default-interceptor-ref><br />这里引用的就是上面的mystack拦截器，这样在程序中如果不在action中加入拦截器，它同样可以执行相应的工作，<br />前面已经说过了，如果不加入任何拦截器的引用，它将把默认的拦截器加入。<br /> <br /><br />我们在做拦截器的时候，刚才实现了Interceptor接口，里面有三个方法，但是一般的情况下init（）和destroy()方法我们用不上，<br />最关心的就是intercept(ActionInvocation invoker){}方法，所以怎么办呢？其实，struts2给我们提供了一个简化的拦截器类，这个是什么呢？<br /><br />MethodFilterInterceptor  这是一个抽象的类，里面实现了init（）和destroy()方法，所以只要我们继承这个类，就不用再多写这两个方法！<br /><br />为了验证是对的，就写了个方法，实现如下：<br /><br />public class MyInterceptor2 extends AbstractInterceptor{ <br />  protected String doIntercept(ActionInvocation invocation) throws Exception {<br />       System.out.println("my interceptor2");<br />       String result=invocation.invoke();<br />       return result;<br />    }<br />}<br /><br />就是这样一个简单的东西，呵呵，把它和其他的拦截器一样的配置，运行，呵呵就可以出来结果了！<br />当然在这里还需要指出一点，你安放的拦截器的顺序，其实也就是拦截器执行的顺序！但是拦截器，不只是在执行execute（）方法之前要执行，<br />而且在execute（）方法之后也要执行。给出如下两个拦截器说明：<br /><br />1<br />public String intercept(ActionInvocation invoker) throws Exception {<br />       System.out.println("intercept1");<br />       String result=invoker.invoke();<br />       System.out.println("finish1");<br />       return result;<br />    }<br /><br />2<br /><br />public String intercept(ActionInvocation invoker) throws Exception {<br />       System.out.println("intercept2");<br />       String result=invoker.invoke();<br />       System.out.println("finish2");<br />       return result;<br />    }<br /><br />在配置顺序也是一二，结果会输出什么呢？<br /><br />intercept1  intercept2 finish2  finish1  这里执行拦截器的过程是正着来的，回来的时候是反着的。就像你要进一个很多门的房间一样。<br />进去一个，开一个门，为了让自己能回来的方便一些，这个打开的门就不要关着了，当你把所有的门进去了后，然后回来，再逐个关门。<br />这样的过程就像是这个拦截器执行的过程。<br /><br />最后讲一个方法过滤拦截器，顾名思义，过滤的是方法。其实在struts2中可以在一个action类中写很多个与aciton的execute方法类似的方法。<br />只要在struts。Xml中的action添加一个属性就可以了这个属性是method比如：<br /><br />&lt;action name="register"class="com.test.action.RegisterAction" method="test">当然在action类中也有个test（）方法<br /><br />这个拦截器可以细化到拦截到具体的哪一个方法。如果不是方法过滤拦截器 哪么它可能将与execute（）方法类似的方法都执行。<br />比如说上面的test（）方法。如此这样照成很多的不必要。于是这种拦截器就显的格外的重要。<br />在这个类继承后实现的不是inteceptor（）方法而是doIntercept（），可是做好这个类后如何配置继承MethodFilterInterceptor这个类呢？<br />如下（为了实现过滤方法加入了几个参数，其他的都相同）：<br /><br />&lt;interceptor-ref name="myinterceptor2"><br />              &lt;param name="includeMethods">execute,test&lt;/param><br />&lt;/interceptor-ref><br /><br />includeMethods  包含execute,test这两个方法，结果执行了这个拦截器，如果改成excludeMethods ，就不会执行了，也可以再加下面的一个参数<br />&lt;param name="excludeMethods">execute,test&lt;/param><br />不排除execute,test这两个方法 可是又加入又排除到底执行吗？答案是执行的，必定结果是最能说明问题的！呵呵！
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/211161#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jul 2008 16:21:04 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/211161</link>
        <guid>http://struts2.group.javaeye.com/group/blog/211161</guid>
      </item>
      <item>
        <title>sssssssssssssssssssssssssssss</title>
        <author>dhaigang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dhaigang.javaeye.com">dhaigang</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/210911" style="color:red;">http://struts2.group.javaeye.com/group/blog/210911</a>&nbsp;
          发表时间: 2008年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="/images/smiles/icon_redface.gif"/><img src="/images/smiles/icon_arrow.gif"/><img src="/images/smiles/icon_idea.gif"/><img src="/images/smiles/icon_exclaim.gif"/><img src="/images/smiles/icon_twisted.gif"/><img src="/images/smiles/icon_razz.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/210911#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jul 2008 09:35:03 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/210911</link>
        <guid>http://struts2.group.javaeye.com/group/blog/210911</guid>
      </item>
      <item>
        <title>Struts2的struts-2.0.dtd</title>
        <author>gddzmr</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gddzmr.javaeye.com">gddzmr</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/210423" style="color:red;">http://struts2.group.javaeye.com/group/blog/210423</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!-- START SNIPPET: strutsDtd --&gt;

&lt;!--
   Struts configuration DTD.
   Use the following DOCTYPE
   
   &lt;!DOCTYPE struts PUBLIC 
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd"&gt;
--&gt;

&lt;!ELEMENT struts (package|include|bean|constant)*&gt;

&lt;!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, global-results?, global-exception-mappings?, action*)&gt;
&lt;!ATTLIST package
    name CDATA #REQUIRED
    extends CDATA #IMPLIED
    namespace CDATA #IMPLIED
    abstract CDATA #IMPLIED
    externalReferenceResolver NMTOKEN #IMPLIED
&gt;

&lt;!ELEMENT result-types (result-type+)&gt;

&lt;!ELEMENT result-type (param*)&gt;
&lt;!ATTLIST result-type
    name CDATA #REQUIRED
    class CDATA #REQUIRED
    default (true|false) "false"
&gt;

&lt;!ELEMENT interceptors (interceptor|interceptor-stack)+&gt;

&lt;!ELEMENT interceptor (param*)&gt;
&lt;!ATTLIST interceptor
    name CDATA #REQUIRED
    class CDATA #REQUIRED
&gt;

&lt;!ELEMENT interceptor-stack (interceptor-ref+)&gt;
&lt;!ATTLIST interceptor-stack
    name CDATA #REQUIRED
&gt;

&lt;!ELEMENT interceptor-ref (param*)&gt;
&lt;!ATTLIST interceptor-ref
    name CDATA #REQUIRED
&gt;

&lt;!ELEMENT default-interceptor-ref (param*)&gt;
&lt;!ATTLIST default-interceptor-ref
    name CDATA #REQUIRED
&gt;

&lt;!ELEMENT default-action-ref (param*)&gt;
&lt;!ATTLIST default-action-ref
    name CDATA #REQUIRED
&gt;

&lt;!ELEMENT global-results (result+)&gt;

&lt;!ELEMENT global-exception-mappings (exception-mapping+)&gt;

&lt;!ELEMENT action (param|result|interceptor-ref|exception-mapping)*&gt;
&lt;!ATTLIST action
    name CDATA #REQUIRED
    class CDATA #IMPLIED
    method CDATA #IMPLIED
    converter CDATA #IMPLIED
&gt;

&lt;!ELEMENT param (#PCDATA)&gt;
&lt;!ATTLIST param
    name CDATA #REQUIRED
&gt;

&lt;!ELEMENT result (#PCDATA|param)*&gt;
&lt;!ATTLIST result
    name CDATA #IMPLIED
    type CDATA #IMPLIED
&gt;

&lt;!ELEMENT exception-mapping (#PCDATA|param)*&gt;
&lt;!ATTLIST exception-mapping
    name CDATA #IMPLIED
    exception CDATA #REQUIRED
    result CDATA #REQUIRED
&gt;

&lt;!ELEMENT include (#PCDATA)&gt;
&lt;!ATTLIST include
    file CDATA #REQUIRED
&gt;

&lt;!ELEMENT bean (#PCDATA)&gt;
&lt;!ATTLIST bean
    type CDATA #IMPLIED
    name CDATA #IMPLIED
    class CDATA #REQUIRED
    scope CDATA #IMPLIED
    static CDATA #IMPLIED
    optional CDATA #IMPLIED
&gt;

&lt;!ELEMENT constant (#PCDATA)&gt;
&lt;!ATTLIST constant
    name CDATA #REQUIRED
    value CDATA #REQUIRED    
&gt;

&lt;!-- END SNIPPET: strutsDtd --&gt;

</pre>
<p>&nbsp;有兴趣的朋友可以看一看</p>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/210423#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 10:37:24 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/210423</link>
        <guid>http://struts2.group.javaeye.com/group/blog/210423</guid>
      </item>
      <item>
        <title>java反射机制</title>
        <author>weidewei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wishlife.javaeye.com">weidewei</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/209885" style="color:red;">http://struts2.group.javaeye.com/group/blog/209885</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          java反射机制测试 <br /><br /><pre name="code" class="java">package com.infowarelab.java.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTester {
	@SuppressWarnings("unchecked")
	public Object copy(Object object) throws Exception {
		// 获得对象类型
		Class classType = object.getClass();
		System.out.println("" + classType.getName()); // 通过默认构造方法创建一个新的对象
		Object objectCopy = classType.getConstructor(new Class[] {})
				.newInstance(new Object[] {}); // 获得对象的所有属性
		Field fields[] = classType.getDeclaredFields();
		for (int i = 0; i &lt; fields.length; i++) {
			Field field = fields[i];
			String fieldName = field.getName();
			String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字
			String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字
			String setMethodName = "set" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法
			Method getMethod = classType.getMethod(getMethodName,
					new Class[] {}); // 获得和属性对应的setXXX()方法
			Method setMethod = classType.getMethod(setMethodName,
					new Class[] { field.getType() }); // 调用原对象的getXXX()方法
			Object value = getMethod.invoke(object, new Object[] {});
			System.out.println(fieldName + ":" + value); // 调用拷贝对象的setXXX()方法
			setMethod.invoke(objectCopy, new Object[] { value });
		}
		return objectCopy;
	}

	public static void main(String[] args) throws Exception {
		Customer customer = new Customer("lunzi", 26);
		customer.setId(new Long(1));
		Customer customerCopy = (Customer) new ReflectTester().copy(customer);
		System.out.println("Copy information:" + customerCopy.getName() + " "
				+ customerCopy.getAge());
	}
}

class Customer {
	private long id;

	private String name;

	private int age;

	public Customer() {
	}

	public Customer(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/209885#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 18:23:29 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/209885</link>
        <guid>http://struts2.group.javaeye.com/group/blog/209885</guid>
      </item>
      <item>
        <title>jsp\struts1.2\struts2 中文件上传</title>
        <author>houzi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jj-chris.javaeye.com">houzi</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/208781" style="color:red;">http://struts2.group.javaeye.com/group/blog/208781</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚刚做了三个文件上传的Demo<br />a.在jsp中简单利用Commons-fileupload组件实现 <br />b.在struts1.2中实现<br />c.在sturts2中实现<br />现在把Code与大家分享一下..<br />注:此为三个简单Demo,仅供练习用,并没有做太多上传限制<br />如有兴趣可以自行查看相关文档说明<br /><br />一.<strong>在JSP环境中利用Commons-fileupload组件实现文件上传</strong><br />   1.页面upload.jsp清单如下:<br /><pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&lt;html>
  &lt;head>
    &lt;title>The FileUpload Demo&lt;/title>
  &lt;/head>
  
  &lt;body>
    &lt;form action="UploadFile" method="post" enctype="multipart/form-data">
    	&lt;p>&lt;input type="text" name="fileinfo" value="">文件介绍&lt;/p>
    	&lt;p>&lt;input type="file" name="myfile" value="浏览文件">&lt;/p>
    	&lt;p>&lt;input type="submit" value="上 传">&lt;/p>
    &lt;/form>
  &lt;/body>
&lt;/html></pre><br />注意:在上传表单中,既有普通文本域也有文件上传域<br /><br />2.FileUplaodServlet.java清单如下:<br /><pre name="code" class="java">package org.chris.fileupload;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.*;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUplaodServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("UTF-8");
		
		//文件的上传部分
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		
		if(isMultipart)
		{
			try {
				FileItemFactory factory = new DiskFileItemFactory();
				ServletFileUpload fileload = new ServletFileUpload(factory);
				
//				 设置最大文件尺寸，这里是4MB    
				fileload.setSizeMax(4194304);
				List&lt;FileItem> files = fileload.parseRequest(request);
				Iterator&lt;FileItem> iterator = files.iterator();	
				while(iterator.hasNext())
				{
					FileItem item = iterator.next();
					if(item.isFormField())
					{
						String name = item.getFieldName();
						String value = item.getString();
						System.out.println("表单域名为: " + name + "值为: " + value);
					}else
					{
						//获得获得文件名，此文件名包括路径
						String filename = item.getName();
						if(filename != null)
						{
							File file = new File(filename);
							//如果此文件存在
							if(file.exists()){
								File filetoserver = new File("d:\\upload\\",file.getName());
								item.write(filetoserver);
								System.out.println("文件 " + filetoserver.getName() + " 上传成功!!");
							}
						}
					}
				}
			} catch (Exception e) {
				System.out.println(e.getStackTrace());
			}
		}
	}
}
</pre><br />3.web.xml清单如下:<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	&lt;servlet>
		&lt;servlet-name>UploadFileServlet&lt;/servlet-name>
		&lt;servlet-class>
			org.chris.fileupload.FileUplaodServlet
		&lt;/servlet-class>
	&lt;/servlet>

	&lt;servlet-mapping>
		&lt;servlet-name>UploadFileServlet&lt;/servlet-name>
		&lt;url-pattern>/UploadFile&lt;/url-pattern>
	&lt;/servlet-mapping>
	
	&lt;welcome-file-list>
		&lt;welcome-file>/Index.jsp&lt;/welcome-file>
	&lt;/welcome-file-list>
	
&lt;/web-app>
</pre><br /><br />二.在strut1.2中实现<br />1.上传页面file.jsp 清单如下:<br /><pre name="code" class="java">&lt;%@ page language="java" pageEncoding="ISO-8859-1"%>
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> 
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
 
&lt;html> 
	&lt;head>
		&lt;title>JSP for FileForm form&lt;/title>
	&lt;/head>
	&lt;body>
		&lt;html:form action="/file" enctype="multipart/form-data">
		&lt;html:file property="file1">&lt;/html:file>
			&lt;html:submit/>&lt;html:cancel/>
		&lt;/html:form>
	&lt;/body>
&lt;/html>
</pre><br /><br />2.FileAtion.java的清单如下:<br /><pre name="code" class="java">/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 */
package action;

import java.io.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

import form.FileForm;

/** 
 * @author Chris
 * Creation date: 6-27-2008
 * 
 * XDoclet definition:
 * @struts.action path="/file" name="fileForm" input="/file.jsp"
 */
public class FileAction extends Action {
	/*
	 * Generated Methods
	 */

	/** 
	 * Method execute
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return ActionForward
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		FileForm fileForm = (FileForm) form;
		FormFile file1=fileForm.getFile1();
		if(file1!=null){
			//上传路径
			String dir=request.getSession(true).getServletContext().getRealPath("/upload");
			OutputStream fos=null;
			try {
				fos=new FileOutputStream(dir+"/"+file1.getFileName());
				fos.write(file1.getFileData(),0,file1.getFileSize());
				fos.flush();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				try{
				fos.close();
				}catch(Exception e){}
			}
		}
		//页面跳转
		return mapping.findForward("success");
	}
}</pre><br /><br />3.FileForm.java的清单如下:<br /><pre name="code" class="java">package form;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

/** 
 * @author Chris
 * Creation date: 6-27-2008
 * 
 * XDoclet definition:
 * @struts.form name="fileForm"
 */
public class FileForm extends ActionForm {
	/*
	 * Generated Methods
	 */
	private FormFile file1;
	/** 
	 * Method validate
	 * @param mapping
	 * @param request
	 * @return ActionErrors
	 */
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {
		// TODO Auto-generated method stub
		return null;
	}

	/** 
	 * Method reset
	 * @param mapping
	 * @param request
	 */
	public void reset(ActionMapping mapping, HttpServletRequest request) {
		// TODO Auto-generated method stub
	}

	public FormFile getFile1() {
		return file1;
	}

	public void setFile1(FormFile file1) {
		this.file1 = file1;
	}
}</pre><br />4.struts-config.xml的清单如下:<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

&lt;struts-config>
  &lt;data-sources />
  &lt;form-beans >
    &lt;form-bean name="fileForm" type="form.FileForm" />

  &lt;/form-beans>

  &lt;global-exceptions />
  &lt;global-forwards />
  &lt;action-mappings >
    &lt;action
      attribute="fileForm"
      input="/file.jsp"
      name="fileForm"
      path="/file"
      type="action.FileAction"
      validate="false">
       &lt;forward name="success" path="/file.jsp">&lt;/forward>
      &lt;/action>

  &lt;/action-mappings>

  &lt;message-resources parameter="ApplicationResources" />
&lt;/struts-config>
</pre><br />5.web.xml代码清单如下:<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  &lt;servlet>
    &lt;servlet-name>action&lt;/servlet-name>
    &lt;servlet-class>org.apache.struts.action.ActionServlet&lt;/servlet-class>
    &lt;init-param>
      &lt;param-name>config&lt;/param-name>
      &lt;param-value>/WEB-INF/struts-config.xml&lt;/param-value>
    &lt;/init-param>
    &lt;init-param>
      &lt;param-name>debug&lt;/param-name>
      &lt;param-value>3&lt;/param-value>
    &lt;/init-param>
    &lt;init-param>
      &lt;param-name>detail&lt;/param-name>
      &lt;param-value>3&lt;/param-value>
    &lt;/init-param>
    &lt;load-on-startup>0&lt;/load-on-startup>
  &lt;/servlet>
  &lt;servlet-mapping>
    &lt;servlet-name>action&lt;/servlet-name>
    &lt;url-pattern>*.do&lt;/url-pattern>
  &lt;/servlet-mapping>
&lt;/web-app>
</pre><br /><br />三.在struts2中实现(以图片上传为例)<br />1.FileUpload.jsp代码清单如下:<br /><pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
&lt;%@ taglib prefix="s" uri="/struts-tags" %>
&lt;html>
  &lt;head>
  	&lt;title>The FileUplaodDemo In Struts2&lt;/title>
  &lt;/head>
  
  &lt;body>
    &lt;s:form action="fileUpload.action" method="POST" enctype="multipart/form-data">
    	&lt;s:file name="myFile" label="MyFile" >&lt;/s:file>
    	&lt;s:textfield name="caption" label="Caption">&lt;/s:textfield>
    	&lt;s:submit label="提交">&lt;/s:submit>
    &lt;/s:form>
  &lt;/body>
&lt;/html>
</pre><br /><br />2.ShowUpload.jsp的功能清单如下:<br /><pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
&lt;%@ taglib prefix="s" uri="/struts-tags" %>
&lt;html>
  &lt;head>
    &lt;title>ShowUpload&lt;/title>
  &lt;/head>
  
  &lt;body>
    &lt;div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" > 
        &lt;img src ='UploadImages/&lt;s:property value ="imageFileName"/> '/>
        &lt;br /> 
        &lt;s:property value ="caption"/> 
    &lt;/div > 
  &lt;/body>
&lt;/html>
</pre><br /><br />3.FileUploadAction.java的代码清单如下 :<br /><pre name="code" class="java">package com.chris;

import java.io.*;
import java.util.Date;

import org.apache.struts2.ServletActionContext;


import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport{

	 private static final long serialVersionUID = 572146812454l ;
     private static final int BUFFER_SIZE = 16 * 1024 ;
    
     //注意，文件上传时&lt;s:file/>同时与myFile，myFileContentType,myFileFileName绑定
     //所以同时要提供myFileContentType,myFileFileName的set方法
     
     private File myFile;	//上传文件
     private String contentType;//上传文件类型
     private String fileName;	//上传文件名
     private String imageFileName;
     private String caption;//文件说明，与页面属性绑定
    
     public void setMyFileContentType(String contentType)  {
    	 System.out.println("contentType : " + contentType);
         this .contentType = contentType;
    } 
    
     public void setMyFileFileName(String fileName)  {
    	 System.out.println("FileName : " + fileName);
         this .fileName = fileName;
    } 
        
     public void setMyFile(File myFile)  {
         this .myFile = myFile;
    } 
    
     public String getImageFileName()  {
         return imageFileName;
    } 
    
     public String getCaption()  {
         return caption;
    } 
 
      public void setCaption(String caption)  {
         this .caption = caption;
    } 
    
     private static void copy(File src, File dst)  {
         try  {
            InputStream in = null ;
            OutputStream out = null ;
             try  {                
                in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
                out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
                 byte [] buffer = new byte [BUFFER_SIZE];
                 while (in.read(buffer) > 0 )  {
                    out.write(buffer);
                } 
             } finally  {
                 if ( null != in)  {
                    in.close();
                } 
                  if ( null != out)  {
                    out.close();
                } 
            } 
         } catch (Exception e)  {
            e.printStackTrace();
        } 
    } 
    
     private static String getExtention(String fileName)  {
         int pos = fileName.lastIndexOf(".");
         return fileName.substring(pos);
    } 
 
    @Override
     public String execute()      {        
        imageFileName = new Date().getTime() + getExtention(fileName);
        File imageFile = new File(ServletActionContext.getServletContext().getRealPath("/UploadImages" ) + "/" + imageFileName);
        copy(myFile, imageFile);
         return SUCCESS;
    }
}
</pre><br />注:此时仅为方便实现Action所以继承ActionSupport,并Overrider execute()方法<br />  在struts2中任何一个POJO都可以作为Action<br /><br />4.struts.xml清单如下:<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8" ?>
&lt;!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
&lt;struts>
	&lt;package name="example" namespace="/" extends="struts-default">
		&lt;action name="fileUpload" class="com.chris.FileUploadAction">
		&lt;interceptor-ref name="fileUploadStack"/>
		&lt;result>/ShowUpload.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br />5.web.xml清单如下:<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	&lt;filter > 
        &lt;filter-name > struts-cleanup &lt;/filter-name > 
        &lt;filter-class > 
            org.apache.struts2.dispatcher.ActionContextCleanUp
        &lt;/filter-class > 
    &lt;/filter > 
     &lt;filter-mapping > 
        &lt;filter-name > struts-cleanup &lt;/filter-name > 
        &lt;url-pattern > /* &lt;/url-pattern > 
    &lt;/filter-mapping >
	
	&lt;filter>
		&lt;filter-name>struts2&lt;/filter-name>
		&lt;filter-class>org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class>
	&lt;/filter>
	&lt;filter-mapping>
		&lt;filter-name>struts2&lt;/filter-name>
		&lt;url-pattern>/*&lt;/url-pattern>
	&lt;/filter-mapping>
  &lt;welcome-file-list>
    &lt;welcome-file>Index.jsp&lt;/welcome-file>
  &lt;/welcome-file-list>
  
&lt;/web-app>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/208781#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jun 2008 18:38:47 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/208781</link>
        <guid>http://struts2.group.javaeye.com/group/blog/208781</guid>
      </item>
      <item>
        <title>想用struts2的心情哦</title>
        <author>zhuxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhuxinyu.javaeye.com">zhuxinyu</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/207428" style="color:red;">http://struts2.group.javaeye.com/group/blog/207428</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          学习struts2已经有一段时间了，敲了好多的例子，把很多的东西都记录下来了，来上海找工作，很希望自己能够找一个可以用struts2的公司哦，可惜投了几家没有中，连电话都不给，呵呵不过现在的这家公司要我了，虽然他们不用struts2 呵呵！！我想我依然会在这里干下去的，我想让他们都学着用struts2 哈哈<br />   学习知识 ，最想的是学有所用，谁愿意将自己的知识闲置在那里呢，时间长了，真怕忘记了哦！看着朋友们找公司不少都在用struts2 ，羡慕哦！<br />   前段时间，看见网站上有不少说struts2的不好，说是webwork的克隆，而且标签相当让人难以容忍，晕，还说是继承了dojo不好，真是的，struts2的骂名真是多啊，可我却不想这么看， 是的struts2的前身是webwork 我承认，可是他也有好处，感觉他把拦截器的集成做的更加简单了，更加容易用了，标签有人不喜欢 说这太慢，但是他的功能强大了 强大的效果本来都是要花成本的，难道不是吗！再说 那些标签不一定强调你一定要用，一定要全部的使用，部分使用 效果还是很好的，dojo的使用也是的，更何况，现在struts2 把那些dojo的集成砍掉了，你愿意加就加 不愿意 不勉强，不是吗？<br />  一个技术的出现，肯定是要经过磨难的，肯定是要接受众人的批评的，但是不能因为某一点就这样枉然的说人家不好，其而不用，也要看到优点吗！<br /><br />  我想用strus2 ， 今年答应学校给他们做个就业信息反馈系统，免费的。基本技术包括如下<br />struts2 + hibernate/ibatis + spring + yahooui/extjs +jasperReprot + dwr 希望能够成功，呵呵，为自己加油。<br /><br />  虽然，现在没机会做struts2的项目 我也要做 哈哈！！！
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/207428#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jun 2008 12:48:40 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/207428</link>
        <guid>http://struts2.group.javaeye.com/group/blog/207428</guid>
      </item>
      <item>
        <title>myeclipse 6.5发布</title>
        <author>icanfly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icanfly.javaeye.com">icanfly</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/206802" style="color:red;">http://struts2.group.javaeye.com/group/blog/206802</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          myeclipse 6.5正式发布了，下载地址：http://www.myeclipseide.org/index.php?name=Downloads&req=viewsdownload&sid=24增强了JSF支持，更新了Spring,Hibernate，令人可惜的是仍然没有对struts2提供支持！哎！
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/206802#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Jun 2008 03:10:53 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/206802</link>
        <guid>http://struts2.group.javaeye.com/group/blog/206802</guid>
      </item>
      <item>
        <title>一个 struts2 入门级的小例子 (Action , 拦截器使用)</title>
        <author>e_sky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://e-sky.javaeye.com">e_sky</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/205941" style="color:red;">http://struts2.group.javaeye.com/group/blog/205941</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>myeclipse5.5 + tomcat5.5 + jdk1.5&nbsp;&nbsp;&nbsp; 需要的朋友可以直接下载看看&nbsp;^_^ ...</p>
<p>&nbsp;</p>
<p>首先是&nbsp; actions 包里的类 (2个 action ,一个拦截器)</p>
<p>&nbsp;</p>
<p>1.CheckLoginInterceptor </p>
<p>&nbsp;</p>
<pre name="code" class="java">/*************************************************
 @Copyright (C), 2008, lzpeng 
 @File name:      CheckLoginInterceptor.java
 @Author:         lzpeng
 @CreateDate:     2008-6-17 
 @Description:    CheckLoginInterceptor拦截器 
 @Extends:        AbstractInterceptor   
 
 @Function List: 
 1. public String intercept()
 *************************************************/

package cn.com.lzpeng.actions;

import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class CheckLoginInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;
	public static final String USER_SESSION_KEY="user";  

	@Override
	public String intercept(ActionInvocation actionInvocation) throws Exception {
		System.out.println("begin check login interceptor");

		// 对LoginAction不做该项拦截
		Object action = actionInvocation.getAction();
		if (action instanceof LoginAction) {
			System.out
					.println("exit check login, because this is login action.");
			return actionInvocation.invoke();
		}
		// 验证 session
		Map session = actionInvocation.getInvocationContext().getSession();
		String username = (String) session.get(USER_SESSION_KEY);

		if (username != null) {
			// 存在的情况下进行后续操作。
			System.out.println(username+" already login!");
			return actionInvocation.invoke();
		} else {
			// 否则终止后续操作，返回LOGIN
			System.out.println("no login, forward login page!");

			return Action.LOGIN;

		}

	}

}
</pre>
<p>&nbsp;</p>
<p>2.LoginAction </p>
<p>&nbsp;</p>
<pre name="code" class="java">/*************************************************
 @Copyright (C), 2008, lzpeng 
 @File name:      LoginAction.java
 @Author:         lzpeng
 @CreateDate:     2008-6-17 
 @Description:    LoginAction控制类    
 @Extends:        ActionSupport   
 
 @Function List: 
 1. public UserBean getUserBean()
 返回一个UserBean实体
 2. public void setUserBean(UserBean userBean) 
 设置一个UserBean实体
 3. public String execute()
 执行Action的方法
 4.public void setSession()
 设置 session 值
 *************************************************/

package cn.com.lzpeng.actions;

import com.opensymphony.xwork2.ActionSupport;
import cn.com.lzpeng.entity.UserBean;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

public class LoginAction extends ActionSupport implements SessionAware {
	private static final long serialVersionUID = 1L;

	private UserBean userBean;

	private Map&lt;String, String&gt; session;

	public UserBean getUserBean() {
		return userBean;
	}

	public void setUserBean(UserBean userBean) {
		this.userBean = userBean;
	}

	@Override
	public String execute() {
		if (userBean == null) {
			return LOGIN;
		}

		String name = userBean.getName();
		String pwd = userBean.getPassword();

		session.put(CheckLoginInterceptor.USER_SESSION_KEY, name);

		if (name.equals("java") &amp;&amp; pwd.equals("struts")) {
			return SUCCESS;
		} else {
			return ERROR;
		}

	}

	
	public void setSession(Map session) {
		this.session = session;
	}

}
</pre>
<p>&nbsp;</p>
<p>3.TestInterceptorAction&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<pre name="code" class="java">/*************************************************
 @Copyright (C), 2008, lzpeng 
 @File name:      LoginAction.java
 @Author:         lzpeng
 @CreateDate:     2008-6-17 
 @Description:    TestInterceptorAction控制类    
 @Extends:        ActionSupport   
 
 @Function List: 
 1.public String execute()
 执行 Action 的方法
 *************************************************/

package cn.com.lzpeng.actions;

import com.opensymphony.xwork2.ActionSupport;

public class TestInterceptorAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	@Override
	public String execute() {
		return SUCCESS;
	}

}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这个是实体类 UserBean.java</p>
<p>&nbsp;</p>
<pre name="code" class="java">/*************************************************
 @Copyright (C), 2008, lzpeng 
 @File name:      LoginAction.java
 @Author:         lzpeng
 @CreateDate:     2008-6-17 
 @Description:    UserBean实体类    
 *************************************************/

package cn.com.lzpeng.entity;

public class UserBean {
	private String name;

	private String password;

	public void setName(String name) {
		this.name = name;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public String getPassword() {
		return password;
	}

}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>struts.xml</p>
<p>&nbsp;</p>
<pre name="code" class="java">&lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;

&lt;struts&gt;
	&lt;!-- 加载默认的 struts2 配置文件 --&gt;
	&lt;include file="struts-default.xml" /&gt;
	&lt;!-- 继承默认的 struts2 配置文件 --&gt;
	&lt;package name="default" extends="struts-default"&gt;
		&lt;!-- 定义一个名为 checkLogin 的拦截器 --&gt;
		&lt;interceptors&gt;
			&lt;!-- 定义权限检查拦截器 --&gt;
			&lt;interceptor name="checkLogin"
				class="cn.com.lzpeng.actions.CheckLoginInterceptor" /&gt;
			&lt;!-- 定义一个包含权限检查的拦截器栈 --&gt;
			&lt;interceptor-stack name="myDefaultStack"&gt;
				&lt;!-- 定义拦截器栈包含checkLogin拦截器 --&gt;
				&lt;interceptor-ref name="checkLogin"&gt;&lt;/interceptor-ref&gt;
				&lt;interceptor-ref name="defaultStack"&gt;&lt;/interceptor-ref&gt;
			&lt;/interceptor-stack&gt;
		&lt;/interceptors&gt;
		&lt;!-- 设置全局 全局默认的拦截器栈--&gt;
		&lt;default-interceptor-ref name="myDefaultStack"&gt;&lt;/default-interceptor-ref&gt;

		&lt;!-- 定义全局Result --&gt;
		&lt;global-results&gt;
			&lt;!-- 当返回login视图名时，转入/login.jsp页面 --&gt;
			&lt;result name="login"&gt;/login.jsp&lt;/result&gt;
		&lt;/global-results&gt;

		&lt;!--    
			action 标签里 name属性代表我们要处理的.action的前面部分   
			action 标签里 class属性代表我们需要哪个类来处理   
			result 标签的 name属性代表action类的执行方法的返回值,   
			action类的默认执行方法是public String execute()  
		--&gt;
		&lt;action name="login"
			class="cn.com.lzpeng.actions.LoginAction"&gt;
			&lt;result name="success"&gt;success.jsp&lt;/result&gt;
			&lt;result name="error"&gt;error.jsp&lt;/result&gt;
			&lt;result name="login"&gt;login.jsp&lt;/result&gt;
			&lt;!--拦截器一般配置在 result 元素之后  --&gt;
			&lt;interceptor-ref name="myDefaultStack" /&gt;
		&lt;/action&gt;

		&lt;action name="testInterceptor"
			class="cn.com.lzpeng.actions.TestInterceptorAction"&gt;
			&lt;result name="success"&gt;content.jsp&lt;/result&gt;
			&lt;result name="login"&gt;login.jsp&lt;/result&gt;
		&lt;/action&gt;




	&lt;/package&gt;
&lt;/struts&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>最后是 4个 jsp界面 </p>
<p>&nbsp;</p>
<p>login.jsp</p>
<p>&nbsp;</p>
<pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;
&lt;%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%&gt;

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;base href="&lt;%=basePath%&gt;"&gt;

		&lt;title&gt;struts2&lt;/title&gt;
		&lt;meta http-equiv="pragma" content="no-cache"&gt;
		&lt;meta http-equiv="cache-control" content="no-cache"&gt;
		&lt;meta http-equiv="expires" content="0"&gt;
		&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;
		&lt;meta http-equiv="description" content="This is my page"&gt;
		&lt;!--
	&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;
	--&gt;
	&lt;/head&gt;

	&lt;body&gt;
		&lt;!—-
		注意这里action="login.action"
		因为要与Struts.xml里你注册的那个别名叫"login"
	   --&gt;
		&lt;form action="login.action" method="post" &gt;
			&lt;fieldset&gt;
				&lt;legend&gt;
					用户登录
				&lt;/legend&gt;
				&lt;p align="center"&gt;
					帐 号:
					&lt;input type="text" name="userBean.name"  /&gt;
					&lt;!—-
					注意这里一定要写name="bean.name",
					因为要与LoginAction.java里面定义的bean对应
					name是它的helloWorld的属性
				    --&gt;
				&lt;/p&gt;
				&lt;p align="center"&gt;
					密 码:
					&lt;input type="password" name="userBean.password" /&gt;
				&lt;/p&gt;
				&lt;p align="center"&gt;
					&lt;input type="submit" value="登 录" /&gt;
				&lt;/p&gt;
			&lt;/fieldset&gt;
		&lt;/form&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>success.jsp</p>
<p>&nbsp;</p>
<pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;
&lt;%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%&gt;

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;base href="&lt;%=basePath%&gt;"&gt;

		&lt;title&gt;成功了&lt;/title&gt;

		&lt;meta http-equiv="pragma" content="no-cache"&gt;
		&lt;meta http-equiv="cache-control" content="no-cache"&gt;
		&lt;meta http-equiv="expires" content="0"&gt;
		&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;
		&lt;meta http-equiv="description" content="This is my page"&gt;
		&lt;!--
	&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;
	--&gt;

	&lt;/head&gt;

	&lt;body&gt;
		&lt;form action="testInterceptor.action"&gt;
			&lt;div align="center"&gt;
				恭喜${userBean.name}登录成功了 ！
				&lt;br&gt;
				只有通过这才能访问 content.jsp!
				&lt;br&gt;
				&lt;br&gt;
				&lt;input type="submit" value=" content.jsp"&gt;
				&lt;br&gt;
				&lt;br&gt;
				主要演示拦截器 CheckLoginInterceptor 对 TestInterceptorAction 的拦截情况(可以试直接访问
				TestInterceptorAction.action)
			&lt;/div&gt;
		&lt;/form&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;error.jsp</p>
<p>&nbsp;</p>
<pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;
&lt;%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%&gt;

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;base href="&lt;%=basePath%&gt;"&gt;

		&lt;title&gt;error&lt;/title&gt;

		&lt;meta http-equiv="pragma" content="no-cache"&gt;
		&lt;meta http-equiv="cache-control" content="no-cache"&gt;
		&lt;meta http-equiv="expires" content="0"&gt;
		&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;
		&lt;meta http-equiv="description" content="This is my page"&gt;
		&lt;!--
	&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;
	--&gt;

	&lt;/head&gt;

	&lt;body&gt;
		&lt;div align="center"&gt;
			这是一个错误界面 ！	用以下帐号试试:&lt;br&gt;
			id   : java&lt;br&gt;
			password:  struts
		&lt;/div&gt;
		&lt;div&gt;
		    &lt;a href="login.jsp"&gt;返回登录界面&lt;/a&gt;
		&lt;/div&gt;

	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<p>content.jsp&nbsp;&nbsp;&nbsp; //为测试 拦截器 写的</p>
<p>&nbsp;</p>
<pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&gt;
&lt;%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%&gt;

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;base href="&lt;%=basePath%&gt;"&gt;

		&lt;title&gt;content&lt;/title&gt;

		&lt;meta http-equiv="pragma" content="no-cache"&gt;
		&lt;meta http-equiv="cache-control" content="no-cache"&gt;
		&lt;meta http-equiv="expires" content="0"&gt;
		&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;
		&lt;meta http-equiv="description" content="This is my page"&gt;
		&lt;!--
	&lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;
	--&gt;

	&lt;/head&gt;

	&lt;body&gt;&lt;div align="center"&gt;
		这里是 content.jsp!
		&lt;br&gt;
		成功通过拦截器 CheckLoginInterceptor......
		&lt;br&gt;
		复制上边地址 ， 在新打开的窗口里粘贴 ， 回车试试......
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/205941#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 19:28:27 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/205941</link>
        <guid>http://struts2.group.javaeye.com/group/blog/205941</guid>
      </item>
      <item>
        <title>【翻译】EJB3.1真的来了吗？EJB3.1系列文章(四)</title>
        <author>kyo100900</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superleo.javaeye.com">kyo100900</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/205565" style="color:red;">http://struts2.group.javaeye.com/group/blog/205565</a>&nbsp;
          发表时间: 2008年06月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p class="MsoNormal"><span style="color: #ff6600; font-size: medium;"><span style="font-family: 宋体;">前言</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US">Raza</span>
<span style="font-family: 宋体;">同学终于又出</span>
<span lang="EN-US">EJB3.1</span>
<span style="font-family: 宋体;">文章了，真是姗姗来迟，我也是刚翻译出来，希望和大家分享</span>
<span lang="EN-US">EJB3.1</span>
<span style="font-family: 宋体;">的新特性。今天主要讲的是</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">，相信很多关于</span>
<span lang="EN-US">EJB3.1</span>
<span style="font-family: 宋体;">的人，一定会对它感兴趣的，今天我们谈到</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">两个方面：依赖注入和增强的拦截器模型。相信今天的文章会让你有所收获。</span>
</p>
<p>原文：http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB3-Part4</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>正文</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="color: #ff6600; font-size: medium;"><span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">：如漆似胶</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">是当前</span>
<span lang="EN-US">JavaEE6</span>
<span style="font-family: 宋体;">日程安排中最激动人心的</span>
<span lang="EN-US">JSRs</span>
<span style="font-family: 宋体;">规范之一。支持集成</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">的主张非常有号召力。如果你用过</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">EJB3.0</span>
<span style="font-family: 宋体;">来开发应用程序的话，</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">的那层薄薄</span>
<span lang="EN-US">backing bean</span>
<span style="font-family: 宋体;">一定让你印象深刻。实际上，即使你可以用</span>
<span lang="EN-US">@EJB annotation</span>
<span style="font-family: 宋体;">很容易的将</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">注入到</span>
<span lang="EN-US">backing bean</span>
<span style="font-family: 宋体;">的话，那么</span>
<span lang="EN-US">backing beans</span>
<span style="font-family: 宋体;">还是在充当</span>
<span lang="EN-US">glue-code</span>
<span style="font-family: 宋体;">的角色。而</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">却允许你直接使用</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">作为</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">backing beans</span>
<span style="font-family: 宋体;">，从而去掉了多余的</span>
<span lang="EN-US">glue-code</span>
<span style="font-family: 宋体;">。在第二小节的时候，我们共同来验证这样的美事吧。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">除了更有效的整合</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">编程模型外，</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">当然也少不了提供一系列很酷的特性，包括：</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">更健壮的基于</span>
<span lang="EN-US">annotation</span>
<span style="font-family: 宋体;">的依赖注入</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">越发简洁易用的</span>
<span lang="EN-US">JavaEE </span>
<span style="font-family: 宋体;">拦截器模型</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">更加合理的对</span>
<span lang="EN-US">Web</span>
<span style="font-family: 宋体;">应用程序的组件上下文进行管理</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">这里的最后一点我不想多说，因为这里更侧重的是</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">而并非</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">，但剩下的精彩主题是会一一向大家介绍的。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">很大程度上受</span>
<span lang="EN-US">JBoss Seam</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">Google Guice</span>
<span style="font-family: 宋体;">的启发。现在该</span>
<span lang="EN-US">JSR</span>
<span style="font-family: 宋体;">规范由</span>
<span lang="EN-US">Gaving King</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">Bob Lee</span>
<span style="font-family: 宋体;">所领导</span>
<span lang="EN-US" style="color: #ff6600;">(</span>
<span style="font-family: 宋体; color: #ff6600;">注：两位绝对是</span>
<span lang="EN-US" style="color: #ff6600;">Java</span>
<span style="font-family: 宋体; color: #ff6600;">界响当当的牛人</span>
<span lang="EN-US" style="color: #ff6600;">)</span>
<span style="font-family: 宋体;">。我个人觉得，虽然东西到了</span>
<span lang="EN-US">JSR</span>
<span style="font-family: 宋体;">手里肯定会有自己的实现版本，但</span>
<span lang="EN-US">Seam</span>
<span style="font-family: 宋体;">的核心代码仍然是</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">的基石。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="color: #ff6600; font-size: medium;"><span style="font-family: 宋体;">让</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">成为</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">Backing Beans</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">好吧，现在我们从</span>
<span lang="EN-US">EJB3
in Action</span>
<span style="font-family: 宋体;">拿一个例子进行重构，从总体上看看</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">究竟是什么。在</span>
<span lang="EN-US">EJB3 in Action</span>
<span style="font-family: 宋体;">中，最经典的</span>
<span lang="EN-US">Session bean</span>
<span style="font-family: 宋体;">例子自然还是那个&ldquo;竞标&rdquo;例子了</span>
<span lang="EN-US">(adding a bid)</span>
<span style="font-family: 宋体;">。</span>
<span lang="EN-US">Session bean</span>
<span style="font-family: 宋体;">使用了</span>
<span lang="EN-US">JPA</span>
<span style="font-family: 宋体;">将一个</span>
<span lang="EN-US">Bid entity(</span>
<span style="font-family: 宋体;">实体</span>
<span lang="EN-US">)</span>
<span style="font-family: 宋体;">持久化到数据库。现在我们来看看在</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">的环境下，</span>
<span lang="EN-US">session bean</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US"> entity</span>
<span style="font-family: 宋体;">变成什么样子了：</span>
</p>
<p>&nbsp;</p>
<pre name="code" class="java">@Component
@Stateless
@Named(&quot;placeBid&quot;)
public class PlaceBidBean {
	@PersistenceContext
	private EntityManager entityManager;

      @In
      private Bid bid;

	public void addBid() {
	    entityManager.persist(bid);
	}
}

@Component
@Entity
@Named(&quot;bid&quot;)
public class Bid {
    private Long bidId;
    private String bidder;
    private String item;
    private Double bidPrice;

    @Id
    @GeneratedValue
    public Long getBidId() {
        return bidId;
    }

    public void setBidId(Long bidId) {
        this.bidId = bidId;
    }

    public String getBidder() {
        return bidder;
    }

    public void setBidder(String bidder) {
        this.bidder = bidder;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public Double getBidPrice() {
        return bidPrice;
    }

    public void setBidPrice(Double bidPrice) {
        this.bidPrice = bidPrice;
    }
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">在</span>
<span lang="EN-US">stateless
bean PlaceBidBean</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">Bid JPA
entity</span>
<span style="font-family: 宋体;">使用</span>
<span lang="EN-US">@Component
annotion</span>
<span style="font-family: 宋体;">，这样就可以将它们同时注册到通过</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">容器里去。</span>
<span lang="EN-US">@Named annotation</span>
<span style="font-family: 宋体;">给组件分配的名称可以由</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">容器识别出来。而这些名称可以直接在</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">页面上使用。</span>
<span lang="EN-US">(</span>
<span style="font-family: 宋体; color: #ff6600;">注：比如说上面的</span>
<span lang="EN-US" style="color: #ff6600;">@Named(&ldquo;bid&rdquo;)</span>
<span style="font-family: 宋体; color: #ff6600;">相当于为</span>
<span lang="EN-US" style="color: #ff6600;">Bid</span>
<span style="font-family: 宋体; color: #ff6600;">类起了一个别名，这样做的意义在于</span>
<span lang="EN-US" style="color: #ff6600;">JSF</span>
<span style="font-family: 宋体; color: #ff6600;">可以用</span>
<span lang="EN-US" style="color: #ff6600;">bid</span>
<span style="font-family: 宋体; color: #ff6600;">直接取值了，比如说</span>
<span lang="EN-US" style="color: #ff6600;">
#{bid.bidId}, #{bid.bidder}</span>
<span style="font-family: 宋体; color: #ff6600;">等，与</span>
<span lang="EN-US" style="color: #ff6600;">Struts2</span>
<span style="font-family: 宋体; color: #ff6600;">需要写一大堆</span>
<span lang="EN-US" style="color: #ff6600;">set,get</span>
<span style="font-family: 宋体; color: #ff6600;">方式相比，确实精简不少。</span>
<span lang="EN-US">)</span>
<span style="font-family: 宋体;">在</span>
<span lang="EN-US">bid</span>
<span style="font-family: 宋体;">实例变量上的</span>
<span lang="EN-US">@In annoation</span>
<span style="font-family: 宋体;">是告诉该</span>
<span lang="EN-US">session bean</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">bid</span>
<span style="font-family: 宋体;">是注入进来的。我相信到这里，你应该很清楚在使用</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">组件后，相应的</span>
<span lang="EN-US">JSP</span>
<span style="font-family: 宋体;">页面代码会是怎么个情况了吧。图一，显示了一个实际竞价页面：</span>
</p>
<p>&nbsp;</p>
<pre name="code" class="html">&lt;html&gt;
  ...
  &lt;body&gt;
    &lt;f:view&gt;
      ...
      &lt;h:form&gt;
        &lt;table&gt;
          &lt;tr&gt;
            &lt;td&gt;Bidder&lt;/td&gt;
            &lt;td&gt;&lt;h:inputText value=&quot;#{bid.bidder}&quot;/&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Item&lt;/td&gt;
            &lt;td&gt;&lt;h:inputText value=&quot;#{bid.item}&quot;/&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Bid Amount&lt;/td&gt;
            &lt;td&gt;&lt;h:inputText value=&quot;#{bid.bidPrice}&quot;/&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/table&gt;
        ...
        &lt;h:commandButton type=&quot;submit&quot; value=&quot;Add Bid&quot; 
            action=&quot;#{placeBid.addBid}&quot;/&gt;
        ...
      &lt;/h:form&gt;
      ...
    &lt;/f:view&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="http://www.theserverside.com/tt/articles/content/NewFeaturesinEJB3-Part4/clip_image002.jpg" height="176" alt="" width="294" />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">正如你所看到，使用</span>
<span lang="EN-US">EL</span>
<span style="font-family: 宋体;">绑定在</span>
<span lang="EN-US">JSF</span>
<span style="font-family: 宋体;">页面上的</span>
<span lang="EN-US">bidder</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">item</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">bid amount</span>
<span style="font-family: 宋体;">字段都与</span>
<span lang="EN-US">Bid entity</span>
<span style="font-family: 宋体;">的属性是一致的。而&ldquo;</span>
<span lang="EN-US">bid</span>
<span style="font-family: 宋体;">&rdquo;和&ldquo;</span>
<span lang="EN-US">placeBid</span>
<span style="font-family: 宋体;">&rdquo;匹配的就是</span>
<span lang="EN-US">@Named</span>
<span style="font-family: 宋体;">所标注过的组件。当</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">第一次遇到符合</span>
<span lang="EN-US">@Named</span>
<span style="font-family: 宋体;">所标注的</span>
<span lang="EN-US">Bid</span>
<span style="font-family: 宋体;">实体时，它会在隐式的在后台创建一个</span>
<span lang="EN-US">Bid</span>
<span style="font-family: 宋体;">的实例，并将压入</span>
<span lang="EN-US">request</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">context</span>
<span style="font-family: 宋体;">，供页面使用。同时你还要注意到</span>
<span lang="EN-US">PlaceBidBean.addBid</span>
<span style="font-family: 宋体;">方法也已经作为一个</span>
<span lang="EN-US">action listener</span>
<span style="font-family: 宋体;">绑定在</span>
<span lang="EN-US">JSP</span>
<span style="font-family: 宋体;">页面的添加按钮上。当按钮点击时，触发表单提交，</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">所绑定的表单值又会自动依次中填充回</span>
<span lang="EN-US">Bid</span>
<span style="font-family: 宋体;">实体的各个属性，这一切还得归功于</span>
<span lang="EN-US">@In annoation</span>
<span style="font-family: 宋体;">。与</span>
<span lang="EN-US">Bid entity</span>
<span style="font-family: 宋体;">不同的是，</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">这一块会从</span>
<span lang="EN-US">JNDI</span>
<span style="font-family: 宋体;">去</span>
<span lang="EN-US">look up PlaceBidBean</span>
<span style="font-family: 宋体;">，然后将它放入</span>
<span lang="EN-US">reqeust</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">context</span>
<span style="font-family: 宋体;">中。当添加按钮触发后，</span>
<span lang="EN-US">addBid</span>
<span style="font-family: 宋体;">方法就会被调用，</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">马上就会使用</span>
<span lang="EN-US">JPA entity manager</span>
<span style="font-family: 宋体;">来保存注入的实体。除了</span>
<span lang="EN-US">request , application,
session context, WebBeans</span>
<span style="font-family: 宋体;">来发明了&ldquo;</span>
<span lang="EN-US">conversation</span>
<span style="font-family: 宋体;">&rdquo;</span>
<span lang="EN-US">context</span>
<span style="font-family: 宋体;">。关于这些</span>
<span lang="EN-US">contexts</span>
<span style="font-family: 宋体;">的更多细节，请参看</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">的草案。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">单凭以上代码就吹捧</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">编程模型的确没有多大的说服力。</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">用一种方法将</span>
<span lang="EN-US">JSF,EJB</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">JPA</span>
<span style="font-family: 宋体;">整合起来，让人感觉这似乎是一个真正的</span>
<span lang="EN-US">JavaEE</span>
<span style="font-family: 宋体;">无缝开发平台。它的</span>
<span lang="EN-US">out
of box(</span>
<span style="font-family: 宋体;">即拆即用</span>
<span lang="EN-US">)</span>
<span style="font-family: 宋体;">，最小化</span>
<span lang="EN-US">boilerplate code</span>
<span style="font-family: 宋体;">，让你如同正在使用像</span>
<span lang="EN-US">Ruby on Rails</span>
<span style="font-family: 宋体;">这样的框架。你是不是这样看待的呢？你觉得还是这样很牵强？这样的模型有缺陷吗？</span>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="color: #ff6600; font-size: medium;"><span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">的依赖注入</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">绝大部分的企业应用程序组件无非就是：</span>
<span lang="EN-US">service</span>
<span style="font-family: 宋体;">组件，</span>
<span lang="EN-US">DAOs</span>
<span style="font-family: 宋体;">以及</span>
<span lang="EN-US">domain model
</span>
<span style="font-family: 宋体;">组件。一般来说，</span>
<span lang="EN-US">JPA</span>
<span style="font-family: 宋体;">是实现</span>
<span lang="EN-US">domain model </span>
<span style="font-family: 宋体;">组件的最佳选择；而</span>
<span lang="EN-US">service</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">DAO</span>
<span style="font-family: 宋体;">组件又是</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">的不二选择。因为</span>
<span lang="EN-US">EJBs</span>
<span style="font-family: 宋体;">默认具备事务和线程安全的特性。</span>
<span lang="EN-US">(</span>
<span style="font-family: 宋体;">很多人其实错误的认为</span>
<span lang="EN-US">EJBs</span>
<span style="font-family: 宋体;">默认也是支持</span>
<span lang="EN-US">remote</span>
<span style="font-family: 宋体;">的，这不是真的。</span>
<span lang="EN-US">) </span>
<span style="font-family: 宋体;">如果你要使用声明式的</span>
<span lang="EN-US">security</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">remoting</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">web services</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">messaging</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">scheduling</span>
<span style="font-family: 宋体;">或者</span>
<span lang="EN-US">asynchronous processing</span>
<span style="font-family: 宋体;">的话，</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">其实显然是一个更具优势的组件。上述这些</span>
<span lang="EN-US">services</span>
<span style="font-family: 宋体;">我们已经完全以</span>
<span lang="EN-US">annoation</span>
<span style="font-family: 宋体;">的形式给封装好成</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">组件了。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">尽管如此，在一个应用程序里，总是还有一些组件并根本不需要声明式</span>
<span lang="EN-US">servies</span>
<span style="font-family: 宋体;">，不需要事务的感知</span>
<span lang="EN-US">(transaction-aware)</span>
<span style="font-family: 宋体;">，也不需要显式的线程安全保证。就拿</span>
<span lang="EN-US">utilities </span>
<span style="font-family: 宋体;">或</span>
<span lang="EN-US"> helper </span>
<span style="font-family: 宋体;">组件来说吧，它们确实没有必要。因为</span>
<span lang="EN-US">EJB3.0</span>
<span style="font-family: 宋体;">对那些非托管的组件，并不支持依赖注入，因此不把它们也搞成</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">，是没法直接使用依赖注入的。</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">的依赖注入很好的解决了这个问题&mdash;&mdash;因为</span>
<span lang="EN-US">@Component
annoation</span>
<span style="font-family: 宋体;">可以运用于任何</span>
<span lang="EN-US">POJO</span>
<span style="font-family: 宋体;">对象，不再局限于</span>
<span lang="EN-US">EJBs</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">JPA</span>
<span style="font-family: 宋体;">实体了。刚才的咱们不就用</span>
<span lang="EN-US">@In annoation</span>
<span style="font-family: 宋体;">将</span>
<span lang="EN-US">Bid entity</span>
<span style="font-family: 宋体;">注入到</span>
<span lang="EN-US">PlaceBidBean</span>
<span style="font-family: 宋体;">这个</span>
<span lang="EN-US">stateless session bean</span>
<span style="font-family: 宋体;">中去了吗？<span style="color: #ff6600;">因此，</span>
</span>
<span lang="EN-US" style="color: #ff6600;">WebBeans</span>
<span style="font-family: 宋体; color: #ff6600;">同样可以将普通的组件注入到</span>
<span lang="EN-US" style="color: #ff6600;">EJBs</span>
<span style="font-family: 宋体; color: #ff6600;">中去了</span>
<span style="font-family: 宋体;">。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">现在我们还是快速来看一个例子。假设用户输入的</span>
<span lang="EN-US">bid amount</span>
<span style="font-family: 宋体;">属性需要先通过一个</span>
<span lang="EN-US">utility</span>
<span style="font-family: 宋体;">类进行四舍五入到小数点两位，然后再保存，那么我们可以这么做：</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<pre name="code" class="java">@Component
public class MathUtil {
    ...
    public static double round(double value, int decimalPlaces) {
        BigDecimal converter = new BigDecimal(Double.toString(value));
        converter = converter.setScale(decimalPlaces, 
            BigDecimal.ROUND_HALF_UP);
        return converter.doubleValue();
    }
    ...
}

@Component
@Stateless
@Named(&quot;placeBid&quot;)
public class PlaceBidBean {
	@PersistenceContext
	private EntityManager entityManager;

      @In
      private Bid bid;

      @In
      private MathUtil mathUtil;

		public void addBid() {
          bid.setBidPrice(mathUtil.round(bid.getBidPrice(), 2));
	   	 	entityManager.persist(bid);
	}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">在这个例子里，当</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">需要时，一个新的</span>
<span lang="EN-US">MathUtil</span>
<span style="font-family: 宋体;">的实例会被创建，然后注入到相应的</span>
<span lang="EN-US">EJB bean</span>
<span style="font-family: 宋体;">中去。尽管普通的</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">组件无法直接使用</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">的声明式</span>
<span lang="EN-US">services</span>
<span style="font-family: 宋体;">，但他们可以使用自己的依赖注入，生命周期回调（</span>
<span lang="EN-US">life-cycle
callbacks</span>
<span style="font-family: 宋体;">，使用</span>
<span lang="EN-US">@PostConstruct/
@PreDestroy</span>
<span style="font-family: 宋体;">实现）以及</span>
<span lang="EN-US">interceptoer</span>
<span style="font-family: 宋体;">。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">@In </span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US"> @Component annotations </span>
<span style="font-family: 宋体;">还只是冰山一角。</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">为</span>
<span lang="EN-US">JavaEE</span>
<span style="font-family: 宋体;">带来了一套完整的依赖注入特性，包括</span>
<span lang="EN-US">Guice</span>
<span style="font-family: 宋体;">风格的方法创建和</span>
<span lang="EN-US">annoation</span>
<span style="font-family: 宋体;">绑定。<span style="color: #ff6600;">注意所有的</span>
</span>
<span lang="EN-US" style="color: #ff6600;">EJB</span>
<span style="font-family: 宋体; color: #ff6600;">类型包括消息驱动</span>
<span lang="EN-US" style="color: #ff6600;">Bean</span>
<span style="font-family: 宋体; color: #ff6600;">都可以使用</span>
<span lang="EN-US" style="color: #ff6600;">WebBeans</span>
<span style="font-family: 宋体; color: #ff6600;">特性。</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="color: #ff6600; font-size: medium;"><span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">Interceptor Enhancements</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">相对于</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">来说，</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">另一个主要的特性就是对现有</span>
<span lang="EN-US">interceptor model(</span>
<span style="font-family: 宋体;">拦截器模型</span>
<span lang="EN-US">)</span>
<span style="font-family: 宋体;">的扩展。现在你可以直接在</span>
<span lang="EN-US">EJBs</span>
<span style="font-family: 宋体;">中使用</span>
<span lang="EN-US">@Interceptor
</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">
@Interceptors annotations</span>
<span style="font-family: 宋体;">了。这样的结构既优雅又直接，不过不是非常灵活。</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">在些基础上，通过使用</span>
<span lang="EN-US">annoation,</span>
<span style="font-family: 宋体;">，引入了更加灵活的</span>
<span lang="EN-US">Interceptor</span>
<span style="font-family: 宋体;">机制，却没有仍然没有增加什么复杂度。理解它的最好方法还是代码。现在假设我们想使用一个</span>
<span lang="EN-US">auditing interceptor</span>
<span style="font-family: 宋体;">来拦截</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">PlaceBidBean</span>
<span style="font-family: 宋体;">，我们可以这么做：</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<pre name="code" class="java">@InterceptorBindingType
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface Audited {}

@Audited @Interceptor
public class AuditInterceptor {

    @AroundInvoke
    public Object audit(InvocationContext context) throws Exception {
        System.out.println(&quot;Entering: &quot;
            + context.getMethod().getName());
        System.out.println(&quot;  with args: &quot;
            + context.getParameters());
        return context.proceed();
    }
}

@Component
@Stateless
@Named(&quot;placeBid&quot;)
public class PlaceBidBean {
	@PersistenceContext
	private EntityManager entityManager;

      @In
      private Bid bid;

      @Audited
	public void addBid() {
	    entityManager.persist(bid);
	}
}
</pre>
&nbsp;
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">在</span>
<span lang="EN-US">@Audited
annotation</span>
<span style="font-family: 宋体;">上面的那个</span>
<span lang="EN-US">@InterceptorBindingType
annotation</span>
<span style="font-family: 宋体;">是用来声明它要绑定到一个</span>
<span lang="EN-US">interceptor</span>
<span style="font-family: 宋体;">上。与</span>
<span lang="EN-US">EJB3.0 interceptor model</span>
<span style="font-family: 宋体;">不同的是，</span>
<span lang="EN-US">WebBeans</span>
<span style="font-family: 宋体;">通过使用</span>
<span lang="EN-US">@Interceptor annotation</span>
<span style="font-family: 宋体;">将一个</span>
<span lang="EN-US">interceptor</span>
<span style="font-family: 宋体;">绑定在一个或更多的</span>
<span lang="EN-US">annotations</span>
<span style="font-family: 宋体;">上。因此</span>
<span lang="EN-US">@Audited </span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US"> @Interceptor annotations</span>
<span style="font-family: 宋体;">同样放在</span>
<span lang="EN-US">AuditInterceptor</span>
<span style="font-family: 宋体;">上面表示凡是标注了</span>
<span lang="EN-US">@Audited</span>
<span style="font-family: 宋体;">的组件或方法都会被拦截器拦截。因此，当</span>
<span lang="EN-US">placeBid</span>
<span style="font-family: 宋体;">方法被调用时，</span>
<span lang="EN-US">AuditInterceptor</span>
<span style="font-family: 宋体;">先会触发</span>
<span lang="EN-US">audit</span>
<span style="font-family: 宋体;">方法的执行。</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">除了它的间接性与灵活性外，我觉得这个扩展真的让代码变得更加可读。你觉得呢？是不是</span>
<span lang="EN-US">EJB</span>
<span style="font-family: 宋体;">规范也应该采纳这个扩展，正式成为</span>
<span lang="EN-US">JavaEE</span>
<span style="font-family: 宋体;">整体中的一部分呢？</span>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="color: #ff6600; font-size: medium;"><span style="font-family: 宋体;">继续工作</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体;">由于</span>
<span lang="EN-US">JavaOne</span>
<span style="font-family: 宋体;">大会的原因，专家组进度慢了下来也是情有可原。但不管怎么说，还是要言归正传，回到正常的工作中来。还有很多有趣的主题正在激烈的讨论着，它们是：</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">标准</span>
<span lang="EN-US">JNDI</span>
<span style="font-family: 宋体;">的映射机制同时由</span>
<span lang="EN-US">JavaEE6</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">EJB3.1</span>
<span style="font-family: 宋体;">两个专家组同时进行讨论。相信将来这一块应该没有多少水份。（笑：难道</span>
<span lang="EN-US">JSR</span>
<span style="font-family: 宋体;">专家组们自己觉得自己的东西都很有水份？）</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">支持</span>
<span lang="EN-US">JavaSE</span>
<span style="font-family: 宋体;">环境也可以使用</span>
<span lang="EN-US">EJB3.1</span>
<span style="font-family: 宋体;">（比如说单元测试）的工作仍然在进行着。实际上，继</span>
<span lang="EN-US">OpenEJB</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">EasyBeans</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">Embedded JBoss</span>
<span style="font-family: 宋体;">的路线之后，</span>
<span lang="EN-US">Embedded GlassFish</span>
<span style="font-family: 宋体;">的动作也强烈的表明了它的决心。</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">一个很牛的扩展机制下在</span>
<span lang="EN-US">JavaEE6</span>
<span style="font-family: 宋体;">专家组中炸开了锅。而且好像它还是本次专家组的讨论最后一个</span>
<span lang="EN-US">Big Thing</span>
<span style="font-family: 宋体;">。如果通过审核，那么就会为</span>
<span lang="EN-US">JavaEE</span>
<span style="font-family: 宋体;">社区提供一个非标准的第三方基于</span>
<span lang="EN-US">annoation</span>
<span style="font-family: 宋体;">的声明式</span>
<span lang="EN-US">services</span>
<span style="font-family: 宋体;">组件。<span style="color: #ff6600;">（</span>
</span>
<span lang="EN-US" style="color: #ff6600;">BTW</span>
<span style="font-family: 宋体; color: #ff6600;">：究竟是什么，这么神秘，</span>
<span lang="EN-US" style="color: #ff6600;">Raza</span>
<span style="font-family: 宋体; color: #ff6600;">也真会&ldquo;炒作&rdquo;啊，呵呵）</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">你是怎么看待这些特性的？如果你觉得它们很重要，请大胆发表你的意见，并给专家组发</span>
<span lang="EN-US">Email</span>
<span style="font-family: 宋体;">．</span>
<span lang="EN-US">EJB3.1</span>
<span style="font-family: 宋体;">专家组的电子邮件</span>
<span lang="EN-US"><a href="mailto:jsr-318-comments@jcp.org?subject=JSR%20318%20Comments">jsr-318-comments@jcp.org</a>
WebBeans</span>
<span style="font-family: 宋体;">专家组的电子邮件是</span>
<span lang="EN-US"><a href="mailto:jsr-299-comments@jcp.org?subject=JSR%20299%20Comments">jsr-299-comments@jcp.org</a>
</span>
<span style="font-family: 宋体;">。也可以随时给我</span>
<span lang="EN-US"><a href="mailto:reza@rahmannet.net">reza@rahmannet.net</a>
</span>
<span style="font-family: 宋体;">发邮件。在此期间，我还会继续给你们介绍接下来专家组们正在讨论的特性，也许是本系列的最后一篇了。敬请期待。</span>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="color: #ff6600; font-size: medium;"><span style="font-family: 宋体;">参考</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<ol type="1">
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">New Features in EJB 3.1, <a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB3-1" target="_blank">http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB3-1</a>
.
     </span>
</li>
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">New Features in EJB 3.1 - Part 2, <a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31" target="_blank">http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31</a>
.
     </span>
</li>
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">New Features in EJB 3.1 - Part 3, <a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31-3" target="_blank">http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31-3</a>
.
     </span>
</li>
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">JSR 316: Java EE 6, <a href="http://jcp.org/en/jsr/detail?id=316" target="_blank">http://jcp.org/en/jsr/detail?id=316</a>
.
     </span>
</li>
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">JSR 318: Enterprise JavaBeans 3.1, <a href="http://jcp.org/en/jsr/detail?id=318" target="_blank">http://jcp.org/en/jsr/detail?id=318</a>
.
     </span>
</li>
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">JSR 299: Web Beans, <a href="http://jcp.org/en/jsr/detail?id=299" target="_blank">http://jcp.org/en/jsr/detail?id=299</a>
.
     </span>
</li>
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">Seam, <a href="http://www.seamframework.org/" target="_blank">http://www.seamframework.org</a>
.
     </span>
</li>
<li class="MsoNormal" style="text-align: left;"><span lang="EN-US">Google Guice, <a href="http://code.google.com/p/google-guice/" target="_blank">http://code.google.com/p/google-guice/</a>
.
     </span>
</li>
</ol>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/205565#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Jun 2008 23:10:20 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/205565</link>
        <guid>http://struts2.group.javaeye.com/group/blog/205565</guid>
      </item>
      <item>
        <title>Struts,Spring,Hibernate视频教学</title>
        <author>skycity220</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://skycity220.javaeye.com">skycity220</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/203911" style="color:red;">http://struts2.group.javaeye.com/group/blog/203911</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          学习网。：<br />http://lyx.javaeye.com/blog/65145<br /><br />http://dev.rdxx.com/Java/Struts/2005-7/23/030230686_13.shtml<br /><br />http://www.51j2ee.com/down/anli/j2eestruts2/<br /><br />http://code.jianjie8.com/200608/5763.html
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/203911#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 00:36:56 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/203911</link>
        <guid>http://struts2.group.javaeye.com/group/blog/203911</guid>
      </item>
      <item>
        <title>FCKeditor工具栏背景图片(颜色)</title>
        <author>xuejianshan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://struts2.javaeye.com">xuejianshan</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/203261" style="color:red;">http://struts2.group.javaeye.com/group/blog/203261</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我都不清楚FCKeditor工具栏背景是图片还是颜色,先不管它了.</p>
<p>请问怎么才能改成自己喜欢的背景图片(颜色),我找了半天也没找出,还请高手指点.</p>
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/203261#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jun 2008 16:54:33 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/203261</link>
        <guid>http://struts2.group.javaeye.com/group/blog/203261</guid>
      </item>
      <item>
        <title>spring+struts2开发出现的错误</title>
        <author>runjia1987</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://runjia1987.javaeye.com">runjia1987</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/201906" style="color:red;">http://struts2.group.javaeye.com/group/blog/201906</a>&nbsp;
          发表时间: 2008年06月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          struts.xml配置文件（相关部分）：<br /><pre name="code" class="java">&lt;!-- UsersAction -->
		&lt;action name="logon" class="UsersAction">
			&lt;result>/manage.jsp&lt;/result>
			&lt;result name="input">/failed.jsp&lt;/result>
		&lt;/action></pre><br /><br />UsersAction相关部分代码：<br /><pre name="code" class="java">@Override
	public String execute() {

		if (action == null || "".equals(action)) {
			return ERROR;
		} 
	         else if ("logon".equals(action)) {
			return logon();
		} 
		return ERROR;
	}</pre><br />其中UsersAction已经在applicationContext.xml中配置好；<br />运行时报错：<br />No result defined for action com.person.Action.UsersAction and result - action -，<br /> 不得其解，
          <br/>
          <span style="color:red;">
            <a href="http://struts2.group.javaeye.com/group/blog/201906#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 10 Jun 2008 19:42:45 +0800</pubDate>
        <link>http://struts2.group.javaeye.com/group/blog/201906</link>
        <guid>http://struts2.group.javaeye.com/group/blog/201906</guid>
      </item>
      <item>
        <title>【翻译】Rod Johnson——Spring的宣言：开源，开放(完)</title>
        <author>kyo100900</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superleo.javaeye.com">kyo100900</a>&nbsp;
          链接：<a href="http://struts2.group.javaeye.com/group/blog/201843" style="color:red;">http://struts2.group.javaeye.com/group/blog/201843</a>&nbsp;
          发表时间: 2008年06月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: medium; color: #ff6600;">前言</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这是本文的第二部分，里面提到并回答许多</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用户最关心的问题。受</span><span lang="EN-US"><span style="font-family: Times New Roman;">EXT-JS</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">开源协议的更改以及</span><span lang="EN-US"><span style="font-family: Times New Roman;">SpringSource</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">应用程序平台</span><span lang="EN-US"><span style="font-family: Times New Roman;">(SpringSource Application Platform)</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">基于</span><span lang="EN-US"><span style="font-family: Times New Roman;">GPL V3</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">协议的发布的影响，</span><span lang="EN-US"><span style="font-family: Times New Roman;">Spring</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">社区也是争论不断。</span><span lang="EN-US"><span style="font-family: Times New Roman;">Rod Johoson</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">重申：<span style="color: #ff0000;">我们承诺现在不会并且将来也不会改变现有项目的</span></span><span style="color: #ff0000;"><span style="font-family: Times New Roman;">license</span></span><span style="color: #ff0000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。</span><span style="color: #ff0000;"><span style="font-family: Times New Roman;">Spring Portfolio</span></span><span style="color: #ff0000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">仍然基于</span><span style="color: #ff0000;"><span style="font-family: Times New Roman;">Apache License</span></span><span style="color: #ff0000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，包括的产品有：</span><span style="color: #ff0000;"><span style="font-family: Times New Roman;">Spring Framework, Spring Security, Spring Web Flow </span></span><span style="color: #ff0000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">以及其它</span><span style="color: #ff0000;"><span style="font-family: Times New Roman;"> Spring Portfolio </span></span><span style="color: #ff0000; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">产品。</span