??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产精品免费一区二区三区,精品九九在线,精品精品国产高清a毛片牛牛http://www.aygfsteel.com/lulu/category/9764.html快乐的学习,快乐的生z?/description>zh-cnFri, 02 Mar 2007 03:05:00 GMTFri, 02 Mar 2007 03:05:00 GMT60JSF与Struts的异?参?/title><link>http://www.aygfsteel.com/lulu/archive/2006/04/12/40734.html</link><dc:creator>lulu</dc:creator><author>lulu</author><pubDate>Wed, 12 Apr 2006 13:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/lulu/archive/2006/04/12/40734.html</guid><wfw:comment>http://www.aygfsteel.com/lulu/comments/40734.html</wfw:comment><comments>http://www.aygfsteel.com/lulu/archive/2006/04/12/40734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lulu/comments/commentRss/40734.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lulu/services/trackbacks/40734.html</trackback:ping><description><![CDATA[ <h3 align="center">JSF与Struts的异?转)</h3> <p align="left">Q题讎ͼ与友天提及JSF的概念,转蝲一文章供日后参?/p> <p>  Struts和JSF/Tapestry都属于表现层框架Q这两种分属不同性质的框Ӟ后者是一U事仉动型的组件模型,而Struts只是单纯的MVC模式框架Q老外L急吼D事g驱动型就比MVC模式框架好,何以见得Q我们下面进行详l分析比较一下到底是怎么回事Q?/p> <p>  首先事g是指从客L面Q浏览器Q由用户操作触发的事ӞStruts使用Action来接受浏览器表单提交的事Ӟq里使用了Command模式Q每个承Action的子c都必须实现一个方法execute?/p> <p>  在struts中,实际是一个表单Form对应一个Actionc?或DispatchAction)Q换一句话_在Struts中实际是一个表单只能对应一个事Ӟstrutsq种事g方式UCؓapplication eventQapplication event和component event相比是一U粗_度的事件?/p> <p>  struts重要的表单对象ActionForm是一U对象,它代表了一U应用,q个对象中至包含几个字D,q些字段是Jsp面表单中的input字段Q因Z个表单对应一个事Ӟ所以,当我们需要将事g_度l化到表单中q些字段Ӟ也就是说Q一个字D对应一个事件时Q单U用Struts׃太可能,当然通过l合JavaScript也是可以转弯实现的?/p> <p>  而这U情况用JSF可以方便实玎ͼ</p> <table width="90%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td><h:inputText id="userId" value="#{login.userId}"><br />  <f:<strong>valueChangeListener</strong> type="logindemo.UserLoginChanged" /><br /></h:inputText></td> </tr> </tbody> </table> <p>  #{login.userId}表示从名为login的JavaBean的getUserId获得的结果,q个功能使用struts也可以实玎ͼname="login" property="userId" </p> <p>  关键是第二行Q这里表C如果userId的值改变ƈ且确定提交后Q将触发调用cUserLoginChanged的processValueChanged(...)Ҏ?/p> <p>  JSF可以为组件提供两U事ӞValue Changed?Action. 前者我们已l在上节见识q用处,后者就相当于struts中表单提交Action机制Q它的JSF写法如下Q?/p> <table width="90%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td><h:commandButton id="login" commandName="login"><br />  <f:<strong>actionListener</strong> type=”logindemo.LoginActionListener?/><br /></h:commandButton></td> </tr> </tbody> </table> <p>  从代码可以看出,q两U事件是通过Listernerq样观察者模式脓在具体组件字D上的,而Struts此类事g是原始的一U表单提交Submit触发机制。如果说前者比较语a化(~程语言习惯做法cMSwing~程Q;后者是属于WEB化,因ؓ它是来自Html表单Q如果你h是从Perl/PHP开始,反而容易接受Strutsq种风格?/p> <p> <strong>基本配置</strong> </p> <p>  Struts和JSF都是一U框ӞJSF必须需要两U包JSF核心包、JSTL包(标签库)Q此外,JSFq将使用到Apache目的一些commons包,q些Apache包只要部|在你的服务器中既可?/p> <p>  JSF包下载地址Q?a target="_blank">http://java.sun.com/j2ee/javaserverfaces/download.html</a>选择其中<b>Reference Implementation?/b></p> <p>  JSTL包下载在<a target="_blank">http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi</a><br /><br />  所以,从JSF的驱动包l成看,其开源基因也占据很大的比重,JSF是一个SUN伙伴们工业标准和开源之间的一个؜血ѝ?/p> <p>  上述两个地址下蝲的jar合ƈ在一起就是JSF所需要的全部驱动包了。与Struts的驱动包一Pq些驱动包必M于Web目的WEB-INF/libQ和Struts一L是也必须在web.xml中有如下配置Q?/p> <table width="90%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td><web-app><br />  <servlet><br />    <servlet-name>Faces Servlet</servlet-name><br />    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class><br />    <load-on-startup>1</load-on-startup><br />  </servlet> <p>  <servlet-mapping><br />    <servlet-name>Faces Servlet</servlet-name><br />    <url-pattern>*.faces</url-pattern><br />  </servlet-mapping> <br /></web-app></p></td> </tr> </tbody> </table> <p>  q里和Struts的web.xml配置何其怼Q简直一模一栗?/p> <p>  正如Struts的struts-config.xml一PJSF也有cM的faces-config.xml配置文gQ?/p> <table width="90%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td> <br /><faces-config><br />  <navigation-rule><br />    <from-view-id>/index.jsp</from-view-id><br />    <navigation-case><br />      <from-outcome>login</from-outcome><br />      <to-view-id>/welcome.jsp</to-view-id><br />    </navigation-case><br />  </navigation-rule> <p>  <managed-bean> <br />    <managed-bean-name>user</managed-bean-name><br />    <managed-bean-class>com.corejsf.UserBean</managed-bean-class> <br />    <managed-bean-scope>session</managed-bean-scope> <br />  </managed-bean><br /></faces-config></p><p> </p></td> </tr> </tbody> </table> <p>  在Struts-config.xml中有ActionForm Action以及Jsp之间的流E关p,在faces-config.xml中,也有q样的流E,我们具体解释一下NavigationQ?/p> <p>  在index.jsp中有一个事Ӟ</p> <p><h:commandButton label="Login" action="login" /></p> <p>  action的值必d配form-outcome|上述Navigation配置表示Q如果在index.jsp中有一个login事gQ那么事件触发后下一个页面将是welcome.jsp</p> <p>  JSF有一个独立的事g发生和页面导航的程安排Q这个思\比struts要非常清晰?/p> <p>  managed-beancMStruts的ActionFormQ正如可以在struts-config.xml中定义ActionForm的scope一Pq里也定义了managed-bean的scope为session?/p> <p>  但是如果你只以ؓJSF的managed-beanp点功能就错了QJSF融入了新的Ioc模式/依赖性注等技术?/p> <p> <strong>Ioc模式</strong> </p> <p>  对于Userbeanq样一个managed-beanQ其代码如下Q?/p> <p>public class UserBean {<br />  private String name;<br />  private String password;</p> <p>  // PROPERTY: name<br />  public String getName() { return name; }<br />  public void setName(String newValue) { name = newValue; }</p> <p>  // PROPERTY: password<br />  public String getPassword() { return password; }<br />  public void setPassword(String newValue) { password = newValue; }<br />}<br /></p> <table width="90%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td> <p> </p> <p><managed-bean><br />  <managed-bean-name>user</managed-bean-name><br />  <managed-bean-class>com.corejsf.UserBean</managed-bean-class><br />  <managed-bean-scope>session</managed-bean-scope><br /><br />  <managed-property><br />    <property-name>name</property-name><br />    <value>me</value><br />  </managed-property><br /><br />  <managed-property><br />    <property-name>password</property-name><br />    <value>secret</value><br />  </managed-property><br /></managed-bean></p> </td> </tr> </tbody> </table> <p>  faces-config.xmlq段配置其实是将"me"赋值给nameQ将secret赋值给passwordQ这是采?a target="_blank">Ioc模式中的Setter注射方式</a>?/p> <p> <strong>Backing Beans</strong> </p> <p>  对于一个web formQ我们可以用一个bean包含其涉及的所有组Ӟq个beanq为Backing BeanQ?Backing Bean的优ҎQ一个单个类可以装相关一pd功能的数据和逻辑?/p> <p>  说白了,是一个Javabean里包含其他JavabeanQ互相调用,属于Facade模式或Adapter模式?/p> <p> <br />  对于一个Backing Beans来说Q其中包含了几个managed-beanQmanaged-bean一定是有scope的,那么q其中的几个managed-beans如何配置它们的scope呢?</p> <table width="90%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td><managed-bean><br />  ...<br />  <managed-property><br />    <property-name>visit</property-name><br />    <value>#{sessionScope.visit}</value><br />  </managed-property><br /></td> </tr> </tbody> </table> <p>  q里配置了一个Backing Beans中有一个setVisitҎQ将q个visit赋gؓsession中的visitQ这样以后在E序中我们只访问visit对象Q从中获取我们希望的数据Q如用户登陆注册信息Q,而visit是保存在sessionq是application或request只需要配|既可?/p> <p> <strong>UI界面</strong> </p> <p>  JSF和Struts一P除了JavaBeanscM外,q有面表现元素Q都是是使用标签完成的,Struts也提供了struts-faces.tld标签库向JSFq渡?/p> <p>  使用Struts标签库编E复杂页面时Q一个最大问题是会大量用logic标签Q这个logic如同if语句Q一旦写hQ搞的JSP面象俄|斯方块一P但是使用JSF标签qz优:</p> <table width="90%" bgcolor="#cccccc" border="0"> <tbody> <tr> <td> <p><jia:navigatorItem name="inbox" label="InBox"<br />  icon="/images/inbox.gif"<br />  action="inbox"<br />  disabled="#{!authenticationBean.inboxAuthorized}"/><br /></p> </td> </tr> </tbody> </table> <p>  如果authenticationBean中inboxAuthorizedq回是假Q那么这一行标{ְ不用昄Q多q净利烦Q?/p> <p>  先写到这里,我会l箋对JSF深入比较下去Q如果研I过Jdon框架的hQ可能会发现QJdon框架的jdonframework.xml中service配置和managed-bean一样都使用了依赖注,看来对Javabean的依赖注已l迅速地成ؓ一U新技术象征,如果你还不了解Ioc模式Q赶紧补课?/p> <img src ="http://www.aygfsteel.com/lulu/aggbug/40734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lulu/" target="_blank">lulu</a> 2006-04-12 21:35 <a href="http://www.aygfsteel.com/lulu/archive/2006/04/12/40734.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"></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>