??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合国产,日韩影院在线,日韩一二三区不卡在线视频http://www.aygfsteel.com/yanpeng/category/17927.htmlzh-cnSat, 03 Mar 2007 09:01:18 GMTSat, 03 Mar 2007 09:01:18 GMT60struts bean标签?/title><link>http://www.aygfsteel.com/yanpeng/articles/86014.html</link><dc:creator>宝贝猪?/dc:creator><author>宝贝猪?/author><pubDate>Thu, 07 Dec 2006 02:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/yanpeng/articles/86014.html</guid><wfw:comment>http://www.aygfsteel.com/yanpeng/comments/86014.html</wfw:comment><comments>http://www.aygfsteel.com/yanpeng/articles/86014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yanpeng/comments/commentRss/86014.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yanpeng/services/trackbacks/86014.html</trackback:ping><description><![CDATA[ <p> <font size="2">Struts bean标签库中的标{֏以访问已l存在的javabean以及它们的属性,q可以定义新的beanQ把它存攑֜page范围内或者用h定的范围内,供网内其它元素讉K?br />bean标签库中的标{֤致分Z下三c?br /><font color="#ff0000">1.用于讉Khttph信息或jsp隐含对象的bean标签</font><br /><font color="#0000ff"><bean:cookie>:</font>讉Kcookie信息<br />   id属?定义一个javax.servlet.http.Cookiecd的变量,该变量存攑֜page范围?br />   name属?指定Cookie的名?br />   value属?指定cookie的默认倹{如果由name属性指定的Cookie不存在,׃用value属性指<br />                       定的默认?br />   multiple属?如果讄了该属性(可以讄ZQ意一个字W串Q,可以索出所有和cookie?br />                           字匹配的cookie。此时id属性定义了一个cookie数组cd的变量,而不是单?br />                           cookiecd的变?br /><font color="#0000cc"><bean:header>:</font>讉Khttph中的header信息<br />   id属?定义一个java.lang.Stringcd的变量,该变量存攑֜page范围?br />   name属?指定需要检索的header信息<br /><font color="#0000cc"><bean:parameter>:</font>讉Kh参数<br />   id属?定义一个java.lang.Stringcd的变量,该变量存攑֜page范围?br />   name属?指定h参数?br />   value属?指定h参数的默认?br /><font color="#0000cc"><bean:page>:</font>讉Kjsp隐含对象<br />   id属?定义一个引用隐含对象的变量Q该变量存放在page范围?br />   property属?指定隐含对象的名字,可选值包括application,config,request,responseQsession<br /><font color="#ff0000">2.用于讉Kweb应用资源的bean标签<br /></font><font color="#0000cc"><bean:message>:</font>输出Resource Bundle中的一条消?br />   bundle属?指定Resource BundleQ和struts配置文g?lt;message-resources>元素?br />                          key属性匹配,如果没有配置bundle属性,采用默认的Resource Bundle<br />   key属?指定消息key<br />   ?lt;bean:message>标签中指定消息key有三U方式:<br />         Q?Q?<bean:message>标签的key属性直接指定消息key<br />         Q?Q?<bean:message>标签的name属性指定一个可以{化ؓ字符串的变量Q这个变量的<br />                字符串gؓ消息key<br />         Q?Q?同时指定<bean:message>标签的name属性和property属性。name属性指定一?br />                 javabeanQproperty属性指定javabean的一个属性,q个javabean的属性的值就<br />                 是消息key<br />         对于带参数的复合消息Q可以?lt;bean:message>标签的arg0、arg1、arg2、arg3、arg4<br />         属性来讄参数?br /><font color="#0000cc"><bean:resource>:</font>用于索web资源的内?br />   id属?定义一个代表web资源的变?br />   name属?指定web资源的\?br />   input属?如果没有讄input属性,则id属性定义的变量为字W串cdQ如果给input属?br />                      讄了|可以是Q意字W串Q,则id属性定义的变量为java.io.InputStreamcd<br /><font color="#0000cc"><bean:struts>:</font>索struts框架内在的对象(如ActionFormBean,ActionForward?br />                          ActionMappingQ。必设|formbean,forward或mapping属性中的一个属?br />   id属?定义一个page范围的变量,用来引用struts框架的内在对?br />   formbean属?指定ActionFormBean对象Q和配置文g?lt;form-bean>元素匚w<br />   forward属?指定ActionForward对象Q和配置文g?lt;global-forwards>元素?lt;forward><br />                           子元素匹?br />   mapping属?指定ActionMapping对象Q和配置文g?lt;action>元素匚w<br /><font color="#0000cc"><bean:include>:</font>包含其它web资源的内容,和标准jsp标签<jsp:include>怼Q区别在?br />                            <bean:include>把其他web资源的内容存攑֜一个变量中Q而不是显C在<br />                            |页?br />   id属?定义一个代表其他web资源的变?br />   forward属?指定全局转发路径Q和配置文g?lt;global-forwards>元素中的<forward><br />                           子元素匹?br />   page属?指定相对于当前应用的URIQ以?”开?br />   href属?指定完整的URL<br /><font color="#ff0000">3.用于定义或输出javabean的bean标签<br /></font><font color="#000000"><font color="#0000cc"><bean:define>:</font>定义一个变?br />   id属?指定变量的名?br />   toScope属?指定q个变量的存放范_如果没有讄toScope属性,则这个变量存攑֜<br />                            page范围?br />   scope属?指定javabean范围<br />   lid属性定义的变量赋值有三种方式Q?br />      Q?Q?讄value属性,此时id属性定义的变量为字W串cdQvalue属性代表这个变量的<br />              字符串?br />      Q?Q?同时讄name和property属性。name属性指定一个已l存在的beanQproperty属?br />             指定已经存在的bean的某个属性,id属性定义的变量的值由property属性决?br />      Q?Q?同时讄name属性和type属性。name属性指定一个已l存在的javabeanQtype属?br />             指定q个javabean的完整类名,id属性定义的变量引用q个已经存在的javabean<br />              对于由name属性指定的已经存在的javabeanQ在默认情况?lt;bean:define>标签?br />              依次在page,request,session和application范围Lq个javabeanQ也可以讄scope<br />              属性,明确指定q个javabean的范?br /><font color="#0000cc"><bean:write>:</font>昄javabean或其属性的内容<br />   name属?指定已经存在的变?br />   property属?指定bean的属?br />   format属?讄输出数据的格?br />   filter属?默认gؓtrue。如果gؓtrueQ将把输出内容中Ҏ的HTMLW号作ؓ普通字W串<br />                     昄Q如果ؓfalseQ则不会转化为普通字W串<br />   如果希望输出bean的某个属性|应该同时讄name属性和property属?br /><font color="#0000cc"><bean:size>:</font>获得Map或Collection集合的长?br />   id属?定义一个Integercd的变量,gؓMapQcollection或数l的长度<br />   name属?指定已经存在的MapQcollection或数l变?br /><br />大多数bean标签h以下<font color="#ff0000">共同属?/font>Q?br />   id属性:定义一个变量,默认情况下该变量存放在page范围内。对?lt;bean:define>标签Q它<br />                 的toScope属性可以指定这个变量的存放范围<br />   name属性:指定已经存在的javabean的名字。property属性指定这个javabean的某个属性,<br />                        scope属性指定这个javabean的范_可选gؓpage,request,session和application<br />                        如果没有讄scope属性,依ơ从page,request,session和application范围内寻<br />                        找这个javabean</font></font> </p> <img src ="http://www.aygfsteel.com/yanpeng/aggbug/86014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yanpeng/" target="_blank">宝贝猪?/a> 2006-12-07 10:06 <a href="http://www.aygfsteel.com/yanpeng/articles/86014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts-处理标单跨页http://www.aygfsteel.com/yanpeng/articles/85765.html宝贝猪?/dc:creator>宝贝猪?/author>Wed, 06 Dec 2006 02:19:00 GMThttp://www.aygfsteel.com/yanpeng/articles/85765.htmlhttp://www.aygfsteel.com/yanpeng/comments/85765.htmlhttp://www.aygfsteel.com/yanpeng/articles/85765.html#Feedback0http://www.aygfsteel.com/yanpeng/comments/commentRss/85765.htmlhttp://www.aygfsteel.com/yanpeng/services/trackbacks/85765.html 有的时候由于表单数据太多,无法在同一个页面显C,可以把它拆分成多个表单,
分多个页面显C,q种情况下,既可以ؓ每个表单创徏单独的ActionFormQ?br />也可以只创徏一个ActionForm和多个表单对?br />
例:
insertForm表单包含三个字段Qname,phone,addressQ把它分成两个表单?br />W一个表单在insertContent.jsp中,包含name和phone字段?br />W二个表单在insertContent_next.jsp中,包含address字段Q?br />它们分别对应不同的Action:"/insert1"?/insert2"Q但是这两个Action与同一个Actionform映射
1.把html表单拆分到多个jsp面?br />   可以在每个表单中定义一个隐含字D?lt;html:hidden property="page"/>代表当前面~号

   insertContent.jsp中定义html表单的代?br />   <html:form action="/insert1.do" focus="title">
      <html:hidden property="page" value="1"/>
      ...........................
   </html:form>

   insertContent_next.jsp中定义html表单的代?br />   <html:form action="/insert1.do" focus="title">
      <html:hidden property="page" value="2"/>
      ...........................
   </html:form>

2.创徏和多个html表单对应的ActionForm
   以上两个html表单都对应InsertForm BeanQ在创徏时应注意以下几点
      (1).提供和html表单隐藏字段page对应的page属?br />            private String page = null;
            public String getPage(){
               return page;
            }
            public void setPage(){
            this.page = page;
            }
      (2).在reset()Ҏ中只能把和当前正在处理的表单相关的属性恢复ؓ默认?br />            否则上一表单数据丢失?br />            ׃struts先调用reset()ҎQ再把用戯入的表单数据l装到ActionForm中,
            因此在reset()中不能根据page属性判断处理的是哪个页面,
            应直接从HttpServletRequest对象中读取当前表单的page字段?br />            int numPage = new Ingeter(request.getParameter("page")).intValue();
    
  (3).在validate()Ҏ中,仅对和当前表单相关的属性进行验?br />            ׃在调用validate()Ҏ前已l把数据l装到ActionForm中,
            因此在validate()中可以根据page属性决定正在处理那个表?br />代码如下Q?br />public void reset(ActionMapping mapping, HttpServletRequest request) {
        int numPage=0;
        try{ 
            numPage=new Integer(request.getParameter("page")).intValue();
        }catch(Exception e){}        
        if(numPage==1){
            name=null;
            phone=null;
        }    
       if(numPage==2){
         address=null;
       }
       page=null;
}


public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
            ActionErrors errors = new ActionErrors();
            int numPage=0;
            try{ 
               numPage=new Integer(page).intValue();
            }catch(Exception e){}        
           if(numPage==1){
                if (((name == null) || (name.length() < 1)))
                     errors.add("name", new ActionMessage("error.name.required"));
           if(((phone == null)|| (phone.length() < 1)))
                     errors.add("phone", new ActionMessage("error.phone.required"));
           }     
           if(numPage==2){
                if(((address == null)|| (address.length() < 1)))
                     errors.add("address", new ActionMessage("error.address.required"));
           }
        return errors;
      }

3.配置ActionForm和多个Action映射
   当ActionForm与多个表单对应时Q应该把ActionForm存放在session范围?br />   本例中当用户提交W一个表单时Q请求由org.apache.struts.actions.ForwardAction处理
   以下?lt;action>元素配置代码
   <action path="/insert1"
                  parameter="/insert_next.jsp"
                  type="org.apache.struts.actions.ForwardAction"
                  name="insertForm"
                  scope="session"
                  input="/insert.jsp"
                  validate="true">
   </action>
   <action path="/insert2"
                  type="address.actions.InsertAction"
                  name="insertForm"
                  scope="session"
                  input="/insert_next.jsp"
                  validate="true">
   </action>



]]>
struts的工作流E?/title><link>http://www.aygfsteel.com/yanpeng/articles/84884.html</link><dc:creator>宝贝猪?/dc:creator><author>宝贝猪?/author><pubDate>Fri, 01 Dec 2006 08:37:00 GMT</pubDate><guid>http://www.aygfsteel.com/yanpeng/articles/84884.html</guid><wfw:comment>http://www.aygfsteel.com/yanpeng/comments/84884.html</wfw:comment><comments>http://www.aygfsteel.com/yanpeng/articles/84884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yanpeng/comments/commentRss/84884.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yanpeng/services/trackbacks/84884.html</trackback:ping><description><![CDATA[ <p> <font size="2">在web应用启动时就会加载ƈ初始化ActionServlet,ActionServlet从struts-config.xml中读取配|信?br /><br />当ActionServlet接受C个客戯求时Q执行以下流E?br /><br />1.索和用户h匚w的ActionMapping实例Q如果不存在Q就q回用户h路径无效的信?br />2.如果ActionForm实例不存在,创Z个ActionForm对象Q把客户提交的表单数据保存到ActionForm对象?br />3.Ҏ配置信息军_是否需要表单验证,如需要就调用ActionForm的validateQ)Ҏ<br />4.如果ActionForm的validate()Ҏq回null或返回一个不包含ActionMessage的ActionErrors对象Q就表示表单验证成功<br />5.ActionServletҎActionMapping实例包含的映信息决定将h发给那个ActionQ如果相应的Action实例不存在,先创徏q个实例Q然后调用Action的execute()Ҏ<br />6.Action的execute()Ҏq回一个ActionForward对象QActionServlet再把客户h转发lActionForward对象指向的jsplg<br />7.ActionForward对象指向的jsplg生成动态网返回给客户</font> </p> <img src ="http://www.aygfsteel.com/yanpeng/aggbug/84884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yanpeng/" target="_blank">宝贝猪?/a> 2006-12-01 16:37 <a href="http://www.aygfsteel.com/yanpeng/articles/84884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts-Tiles使用http://www.aygfsteel.com/yanpeng/articles/84849.html宝贝猪?/dc:creator>宝贝猪?/author>Fri, 01 Dec 2006 07:07:00 GMThttp://www.aygfsteel.com/yanpeng/articles/84849.htmlhttp://www.aygfsteel.com/yanpeng/comments/84849.htmlhttp://www.aygfsteel.com/yanpeng/articles/84849.html#Feedback0http://www.aygfsteel.com/yanpeng/comments/commentRss/84849.htmlhttp://www.aygfsteel.com/yanpeng/services/trackbacks/84849.htmlTiles框架建立在jsp的include指o基础之上Qؓ创徏web面提供了一U模版机?br />l Ҏ:  
    a.创徏可重用的模版
    b.动态构建和装蝲面
    c.定义可重用的Tileslg
    d.支持国际?br />l Tiles框架包含以下内容
   a.Tiles标签?br />   b.Tileslg的配|文?br />   c.TilesPlugIn插g

l  安装所需文g , 如果?/span> web 应用中?/span> tiles 标签库,以下文g必须?/span> WEB-INF/lib 目录中?/span>

̔        Struts.jar

̔        Commons-digester.jar

̔        Commons-beanutils.jar

̔        Commons-collections.jar

̔        Commons-logging.jar

?/span> struts-tiles.tld 文g攑ֈ WEN-INF 目录?/span>

l ?/span> web.xml 中配|?/span>

<taglib>

        <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>

        <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>

</taglib>

l 在专门的 xml 中配|?/span> tiles lgQ该文g?/span> WEB-INF ?/span>

      <tiles-definitions>

    <definition name=”index-definition?path=?layout.jsp?gt;

       <put name=”sidebar?value=”sidebar.jsp?>

       <put name=”header?value=”header.jsp?>

       <put name=”content?value=”indexContent.jsp?>
       
<put name=”footer?value=”footer.jsp?>

        </definition>

      </tiles-definitions>

l ?/span> struts 配置文g (struts-config.xml) 中配|?/span> TilesPlugin 插g

         <plug-in className=”org.apache.struts.tiles.TilesPlugin?gt;

         <set-property property=”definitions-config?value=?WEN-INF/tiles-defs.xml?>

         <set-property property=”definitions-parser-validate?value=”true?>

         </plug-in>

̔        definitions-config 参数指定 tiles lg的配|文?/span>

̔        definitions-parser-validate 参数指定 xml 解析器是否验?/span> tiles 配置文gQ默认gؓ true

l ?/span> web.xml 中配|?/span> ActionServlet

l ?/span> .jsp 文g中插?/span> tiles lg

?/span> <tiles:insert definition=”index-definition?gt;



]]>
q用Jakarta Struts的七大实战心?/title><link>http://www.aygfsteel.com/yanpeng/articles/84826.html</link><dc:creator>宝贝猪?/dc:creator><author>宝贝猪?/author><pubDate>Fri, 01 Dec 2006 06:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/yanpeng/articles/84826.html</guid><wfw:comment>http://www.aygfsteel.com/yanpeng/comments/84826.html</wfw:comment><comments>http://www.aygfsteel.com/yanpeng/articles/84826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yanpeng/comments/commentRss/84826.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yanpeng/services/trackbacks/84826.html</trackback:ping><description><![CDATA[ <font color="#ff99ff"> <font color="#ff0099"> <font style="BACKGROUND-COLOR: #ffffff">1. 只在必要的时候才考虑扩展Struts框架</font> <br /> </font> <br />一个好的framework有很多优点,首先Q它必须能够满用户的可预见的需求。ؓ?Struts为Web 应用提供了一个通用的架构,q样开发h员可以把_֊集中在如何解军_际业务问题上。其ơ,一个好的frameworkq必能够在适当的地Ҏ供扩展接口,以便应用E序能扩展该框架来更好的适应使用者的实际需要?br /><br />如果Struts framework在Q何场合,M目中都能很好的满需求,那真是太了。但是实际上Q没有一个框架声U能做到q一炏V一定会有一些特定的应用需求是框架的开发者们无法预见到的。因此,最好的办法是提供_的扩展接口,使得开发工E师能够调整struts来更好的W合他们的特D要求?br /><br />在Struts framework中有很多地方可供扩展和定制。几乎所有的配置c都能被替换为某个用户定制的版本Q这只要单的修改一下Struts的配|文件就可以做到?br /><br />其他lg如ActionServlet?RequestProcessor 也能用自定义的版本代? 甚至qStruts 1.1里才有的新特性也是按照扩展的原则来设计的。例如,在异常处理机制中允许用户定制异常处理的句柄Q以便更好的对应用系l发生的错误做出响应?br /><br />作ؓ框架的这U可调整Ҏ在它更适合你的应用的同时也在很大的E度上媄响了目开发的效果。首先,׃您的应用是基于一个现有的成熟的、稳定的framework如StrutsQ测试过E中发现的错误数量将会大大减,同时也能~短开发时间和减少资源的投入。因Z不再需要投入开发力量用于编写基框架的代码了?br /><br />然? 实现更多的功能是要花Ҏ大的代h的。我们必d心避免不必要的滥用扩展性能Q?Struts是由核心包加上很多工具包构成的,它们已经提供了很多已l实现的功能。因此不要盲目的扩展Struts框架Q要先确定能不能采用其他Ҏ使用现有的功能来实现?在决定编写扩展代码前务必要确认Struts的确没有实现你要的功能。否则重复的功能会导致؜乱将来还得花贚w外的_֊清除它?br /><br /><font color="#ff0099">2. 使用异常处理声明</font><br /><br />要定义应用程序的逻辑程Q成熟的l验是推荐在代码之外Q用配置的方法来实现Q而不是写dE序代码中的。在J2EE中,q样的例子比比皆是。从实现EJB的安全性和事务性行为到描述JMS消息和目的地之间的关p,很多q行时的处理程都是可以在程序之外定义的?br /><br />Struts 创徏者从一开始就采用q种ҎQ通过配置Struts的配|文件来定制应用pȝq行时的各个斚w。这一点在版本1.1的新Ҏ上得到延箋Q包括新的异常处理功能。在Struts framework以前的版本中Q开发h员不得不自己处理Struts应用中发生的错误情况。在最新的版本中,情况大大的改观了QStruts Framework提供了内|的一个称?ExceptionHandler 的类Q?用于pȝ~省处理actionc运行中产生的错误。这也是在上一个技巧中我们提到的framework许多可扩展接口之一?br /><br />Struts~省?ExceptionHandlercM生成一个ActionError对象q保存在适当的范_scopeQ对象中。这样就允许JSP面使用错误cL提醒用户出现什么问题。如果你认ؓq不能满你的需求,那么可以很方便的实现你自qExcepionHandlercR?br /><br />具体定制异常处理的方法和机制<br /><br />要定制自q异常处理机制Q第一步是l承org.apache.struts.action.ExceptionHandlercR这个类?个方法可以覆盖,一个是excute()另外一个是storeException(). 在多数情况下Q只需要覆盖其中的excute()Ҏ。下面是ExceptionHandlercȝexcute()Ҏ声明Q?br /><br /><br /><br />正如你看到的Q该Ҏ有好几个参数Q其中包括原始的异常。方法返回一个ActionForward对象Q用于异常处理结束后controllercd到请求必{发的地方厅R?br /><br />当然您可以实CQ何处理,但一般而言Q我们必L查抛出的异常,q对该cd的异常进行特定的处理。缺省的Q系l的异常处理功能是创Z个出错信息,同时把请求{发到配置文g中指定的地方厅R?定制异常处理的一个常见的例子是处理嵌套异常。假设该异常包含有嵌套异常,q些嵌套异常又包含了其他异常Q因此我们必覆盖原来的execute()ҎQ对每个异常~写出错信息?br /><br />一旦你创徏了自qExceptionHandler c,应该在Struts配置文g中的部分声明q个c,以便让Struts知道改用你自定义的异常处理取代缺省的异常处理. <br /><br />可以配置你自qExceptionHandler cL用于Action Mapping特定的部分还是所有的Action对象。如果是用于Action Mapping特定的部分就?action>元素中配|。如果想让这个类可用于所有的Action对象,可以?global-sections> 元素中指定。例如,假设我们创徏了异常处理类CustomizedExceptionHandler用于所有的Actionc? <global-exceptions>元素定义如下所C:<br /><br /><br /><br />?exception />元素中可以对很多属性进行设|。在本文中,最重要的属性莫q于handler属? handler属性的值就是自定义的承了ExceptionHandlercȝ子类的全名?假如该属性没有定义,Struts会采用自q~省倹{当Ӟ其他的属性也很重要,但如果想覆盖~省的异常处理的话,handler无疑是最重要的属性?br /><br />最后必L出的一ҎQ你可以有不同的异常处理cL处理不同的异常。在上面的例子中QCustomizedExceptionHandler用来处理Mjava.lang.Exception的子c? 其实Q你也可以定义多个异常处理类Q每一个专门处理不同的异常树。下面的XML片断解释了如何配|以实现q一炏V?br /><br /><br /><br />在这里,一旦有异常抛出Qstruts framework试囑֜配置文g中找到ExceptionHandlerQ如果没有找刎ͼ那么struts沿着该异常的父类链一层层往上找直到发现匚w的ؓ止。因此,我们可以定义一个层ơ型的异常处理关pȝ构,在配|文件中已经体现了这一炏V?br /><br /><font color="#ff0099">3. 使用应用模块QApplication ModulesQ?br /></font><br />Struts 1.1的一个新Ҏ是应用模块的概c应用模块允许将单个Struts应用划分成几个模块,每个模块有自qStruts配置文gQJSP面QAction{等。这个新Ҏ是Z解决大中型的开发队伍抱怨最多的一个问题,即ؓ了更好的支持q行开发允许多个配|文件而不是单个配|文件?br /><br />注:在早期的beta版本中,该特性被UCؓ子应用(sub-applicationsQ,最q的改名目的是ؓ了更多地反映它们在逻辑上的分工?br /><br />昄Q当很多开发h员一起参加一个项目时Q单个的Struts配置文g很容易引赯源冲H。应用模块允许Struts按照功能要求q行划分Q许多情况已l证明这h贴近实际。例如,假设我们要开发一个典型的商店应用E序。可以将l成部分划分成模块比如catalogQ商品目录), customerQ顾客), customer serviceQ顾客服务), orderQ订单){。每个模块可以分布到不同的目录下Q这样各部分的资源很Ҏ定位Q有助于开发和部v。图1 昄了该应用的目录结构?<br /><br />注:如果你无需项目划分成多个模块QStruts框架支持一个缺省的应用模块。这׃得应用程序也可以?.0版本下创建,h可移植性,因ؓ应用E序会自动作为缺省的应用模块?br /><br />Z使用多应用模块功能,必须执行以下几个准备步骤Q?br /><br />1. 为每个应用模块创建独立的Struts配置文g?br /><br />2. 配置Web 部v描述W?Web.xml文g?br /><br />3. 使用org.apache.struts.actions.SwitchAction 来实现程序在模块之间的蟩? <br /><br />创徏独立的Struts配置文g<br /><br />每个Struts应用模块必须拥有自己的配|文件。允许创q独立于其他模块的ActionQActionFormQ异常处理甚x多?br /><br />l箋以上面的商店应用E序ZQ我们可以创Z下的配置文gQ一个文件名为struts-config-catalog.xmlQ包含catalogQ商品目录)、items(商品清单)、和其它与库存相关的功能的配|信息;另一个文件名为struts- config-order.xml, 包含对orderQ订单)和order trackingQ订单跟t)的设|。第三个配置文g是struts-config.xml,其中含有属于~省的应用模块中的一般性的功能?br /><br />配置Web部v描述W?<br /><br />在Struts的早期版本中Q我们在Web.xml中指定Struts配置文g的\径。好在这Ҏ变,有助于向后兼宏V但对于多个应用模块Q我们需要在Web部v描述W中增加新的配置文g的设定?br /><br />对于~省的应用(包括Struts的早期版本)QStruts framework 在Web.xml文g中查扑ָ有config的元?init-param>Q用于蝲入Action mapping 和其它的应用E序讑֮。作Z子,以下的XML片断展现一个典型的<init-param>元素Q?br /><br /><br /><br />注:如果在现有的<init-param>元素中找不到\"config\"关键字,Struts framework缺省地使用/WEB/struts-config.xml<br /><br />Z支持多个应用模块(Struts 1.1的新Ҏ?Q必d加附加的<init-param>元素。与~省?init-param>元素不同的是Q附加的<init-param>元素与每个应用模块对应,必须以config/xxx的Ş式命名,其中字符串xxx代表该模块唯一的名字。例如,在商店应用程序的例子中,<init-param>元素可定义如下(注意_体字部分)Q?br /><br />W一?<init-param>元素对应~省的应用模块。第二和W三个元素分别代表非~省应用模块catalog ?order?br /><br />当Struts载入应用E序Ӟ它首先蝲入缺省应用模块的配置文g。然后查扑ָ有字W串config/xxx 形式的附加的初始化参数。对每个附加的配|文件也q行解析q蝲入内存。这一步完成后Q用户就可以很随意地用config/后面的字W串也就是名字来调用相应的应用模块?br /><br />多个应用模块之间调用Actionc?br /><br />在ؓ每个应用模块创徏独立的配|文件之后,我们有可能需要调用不同的模块中Action。ؓ此必M用Struts框架提供的SwitchActioncRStruts 会自动将应用模块的名字添加到URL,如Struts 自动d应用E序的名字加到URL一栗应用模块是Ҏ架的一个新的扩充,有助于进行ƈ行的团队开发。如果你的团队很那没必要用到q个Ҏ,不必q行模块化。当Ӟq是只有一个模块,pȝq是一Lq作?br /><br /><font color="#ff0099">4. 把JSP攑ֈWEB-INF后以保护JSP源代?/font><br /><br />Z更好C护你的JSP避免未经授权的访问和H视Q?一个好办法是将面文g存放在Web应用的WEB-INF目录下?br /><br />通常JSP开发h员会把他们的面文g存放在Web应用相应的子目录下。一个典型的商店应用E序的目录结构如?所C。跟catalog Q商品目录)相关的JSP被保存在catalog子目录下。跟customer相关的JSPQ跟订单相关的JSP{都按照q种Ҏ存放?br /><br /><br />q种Ҏ的问题是q些面文gҎ被偷看到源代码,或被直接调用。某些场合下q可能不是个大问题,可是在特定情形中却可能构成安全隐患。用户可以绕qStruts的controller直接调用JSP同样也是个问题?br /><br />Z减少风险Q可以把q些面文gUdWEB-INF 目录下。基于Servlet的声明,WEB-INF不作为Web应用的公共文档树的一部分。因此,WEB-INF 目录下的资源不是为客L接服务的。我们仍然可以用WEB-INF目录下的JSP面来提供视囄客户Q客户却不能直接h讉KJSP?br /><br />采用前面的例子,?昄JSP面UdWEB-INF 目录下后的目录结?br /><br /><br />如果把这些JSP面文gUdWEB-INF 目录下,在调用页面的时候就必须把\"WEB-INF\"d到URL中。例如,在一个Struts配置文g中ؓ一个logoff action写一个Action mapping。其中JSP的\径必M\"WEB-INF\"开头。如下所C:h意粗体部?<br /><br />q个Ҏ在Q何情况下都不׃ؓStruts实践中的一个好Ҏ。是唯一要注意的技巧是你必LJSP和一个Struts action联系h。即使该Action只是一个很基本的很单JSPQ也L要调用一个ActionQ再由它调用JSP?br /><br />最后要说明的是Qƈ不是所有的容器都能支持q个Ҏ。WebLogic早期的版本不能解释Servlet声明Q因此无法提供支持,据报道在新版本中已经改进了。M使用之前先检查一下你的Servlet容器?br /><br /><font color="#ff0099">5. 使用 Prebuilt ActioncL升开发效?/font><br /><br />Struts framework带有好几个prebuilt Actionc,使用它们可以大大节省开发时间。其中最有用的是org.apache.struts.actions.ForwardAction ?org.apache.struts.actions.DispatchAction.<br /><br />使用 ForwardAction<br /><br />在应用程序中Q可能会l常出现只要Action对象转发到某个JSP的情c在上一点中曾提到L由Action调用JSP是个好习惯。如果我们不必在Action中执行Q何业务逻辑Q却又想遵@从Action讉K面的话Q就可以使用ForwardActionQ它可以使你免去创徏许多I的ActioncR运用ForwardAction的好处是不必创徏自己的Actionc,你需要做的仅仅是在Struts配置文g中配|一个Action mapping?br /><br />举个例子Q假定你有一个JSP文gindex.jsp Q而且不能直接调用该页面,必须让程序通过一个Actionc调用,那么Q你可以建立以下的Action mapping来实现这一点:<br /><br />正如你看到的Q当 /home 被调用时, ׃调用ForwardAction q把h转发?index.jsp 面.<br /><br />再讨Z下不通过一个Actioncȝ接{发到某个面的情况,必须注意我们仍然使用<action>元素中的forward属性来实现转发的目标。这?action>元素定义如下Q?br /><br />以上两种Ҏ都可以节省你的时_q有助于减少一个应用所需的文件数?br /><br />使用 DispatchAction<br /><br />DispatchAction是Struts包含的另一个能大量节省开发时间的ActioncR与其它ActioncM提供单个execute()Ҏ实现单个业务不同QDispatchAction允许你在单个ActioncM~写多个与业务相关的Ҏ。这样可以减Actioncȝ数量Qƈ且把相关的业务方法集合在一起得维护v来更Ҏ?br /><br />要用DispatchAction的功能,需要自己创Z个类Q通过l承抽象的DispatchAction得到。对每个要提供的业务Ҏ必须有特定的Ҏsignature。例如,我们惌提供一个方法来实现对购物Rd商品清单Q创Z一个类ShoppingCartDispatchAction提供以下的方法:<br /><br />那么Q这个类很可能还需要一个deleteItem()Ҏ从客L购物车中删除商品清单Q还有clearCart()Ҏ清除购物车等{。这时我们就可以把这些方法集合在单个Actionc,不用为每个方法都提供一个ActioncR?br /><br />在调用ShoppingCartDispatchAction里的某个ҎӞ只需在URL中提供方法名作ؓ参数倹{就是说Q调用addItem()Ҏ?URL看v来可能类gQ?br /><br />http://myhost/storefront/action/cart?method=addItem<br /><br />其中method参数指定ShoppingCartDispatchAction中要调用的方法。参数的名称可以L配置Q这里用的\"method\"只是一个例子。参数的名称可以在Struts配置文g中自行设定?br /><br /><font color="#ff0099">6.使用动态ActionForm</font><br /><br />在Struts framework中,ActionForm对象用来包装HTML表格数据Q包括请求)Qƈq回q回动态显C给用户的数据。它们必L完全的JavaBeanQƈl承.Struts 里面的ActionFormc,同时Q用户可以有选择地覆盖两个缺省方法?br /><br />该特性能节省很多旉Q因为它可以协助q行自动的表现层的验证。ActionForm的唯一~点是必Mؓ不同的HTML表格生成多个ActionForm cM保存数据。例如,如果有一个页面含有用L注册信息Q另一个页面则含有用户的介lh的信息,那么需要有两个不同的ActionFormcR这在大的应用系l中׃Dq多的ActionFormcRStruts 1.1Ҏ做出了很好的改进Q引入了动态ActionFormcL?br /><br />通过Struts framework中的DynaActionFormcd其子cd以实现动态的ActionForm Q动态的ActionForm允许你通过Struts的配|文件完成ActionForm的全部配|;再也没有必要在应用程序中创徏具体的ActionFormcR具体配|方法是Q在Struts的配|文仉过增加一?form-bean>元素Q将type属性设定成DynaActionForm或它的某个子cȝ全名。下面的例子创徏了一个动态的ActionForm名ؓlogonFormQ它包含两个实例变量Qusername ?password.<br /><br /><br /><br />动态的ActionForm可以用于ActioncdJSPQ用方法跟普通的ActionForm相同Q只有一个小差别。如果用普通的ActionForm对象则需要提供get ?setҎ取得和设|数据。以上面的例子而言Q我们需要提供getUsername() ?setUsername()Ҏ取得和设|username变量Q同样地有一Ҏ法用于取得和讄password变量.<br /><br />q里我们使用的是DynaActionFormQ它变量保存在一个Mapcd象中Q所以必M用DynaActionForm cM的get(name) ?set(name)ҎQ其中参数name是要讉K的实例变量名。例如要讉KDynaActionForm中username的|可以采用cM的代码:<br /><br />String username = (String)form.get(\"username\");<br /><br />׃值存攑֜一个Map对象Q所以要记得对get()Ҏq回的Object对象做强制性类型{换?br /><br />DynaActionForm有好几个很有用的子类。其中最重要的是DynaValidatorForm Q这个动态的ActionForm和Validator 一起利用公qValidator包来提供自动验证。这个特性你得以在E序代码之外指定验证规则。将两个Ҏ结合用对开发h员来说将非常有吸引力?br /><br /><font color="#ff0099">7. 使用可视化工?br /></font><br />自从Struts 1.0 分布以来Q就出现了不可视化工具用于协助创徏Q修改和l护Struts的配|文件。配|文件本w是ZXML格式Q在大中型的开发应用中会增大变得很W拙。ؓ了更方便的管理这些文Ӟ一旦文件大C无法一目了然的时候,试着采用其中的一UGUI 工具协助开发。商业性的和开放源代码的工具都有不,?列出了可用的工具和其相关链接Q从那里可以获取更多信息?br /><br />?1. Struts GUI 工具<br />应用E序 性质 |址 <br />Adalon 商业软g http://www.synthis.com/products/adalon <br />Easy Struts 开放源?http://easystruts.sourceforge.net/ <br />Struts Console 免费 http://www.jamesholmes.com/struts/console <br />JForms 商业软g http://www.solanasoft.com/ <br />Camino 商业软g http://www.scioworks.com/scioworks_camino.html <br />Struts Builder 开放源?http://sourceforge.net/projects/rivernorth/ <br />StrutsGUI 免费 http://www.alien-factory.co.uk/struts/struts-index.html <br /></form-bean></action></action></init-param></init-param></init-param></init-param></init-param></init-param></init-param></init-param></global-exceptions></global-sections></action></font> <img src ="http://www.aygfsteel.com/yanpeng/aggbug/84826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yanpeng/" target="_blank">宝贝猪?/a> 2006-12-01 14:17 <a href="http://www.aygfsteel.com/yanpeng/articles/84826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">;</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">IJ</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ֹ</a>| <a href="http://" target="_blank">ͩ®</a>| <a href="http://" target="_blank">Ƽ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank">֦</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">첼</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ﴨ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank">ʲ</a>| <a href="http://" target="_blank">ƽԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϲ</a>| <a href="http://" target="_blank">Ҧ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">۶</a>| <a href="http://" target="_blank">пѷ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>