锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浣滆咃細tendre
鍦ㄧず鑼冧腑蹇冮」鐩腑錛屾垜浠妸ActionForm涓棩鏈熺被鍨嬬殑瀛楁鎸囧畾涓篠tring綾誨瀷錛岃屽湪瀵瑰簲鐨凧avaBean涓寚瀹氫負java.sql.Date綾誨瀷銆傚綋鐢ㄦ埛鎻愪氦琛ㄥ崟鐨勬椂鍊欙紝鍦ˋction閲屼嬌鐢˙eanUtils.copyProperties()鏂規硶浠嶢ctionForm鏋勯燡avaBean瀵硅薄錛堣瑙佸埄鐢˙eanUtils鍦ㄥ璞¢棿澶嶅埗灞炴э級銆傝繖涓柟娉曞湪澶ч儴鍒嗘椂鍊欓兘寰堝ソ錛屼絾鏈変竴涓棶棰橈紝灝辨槸褰撶敤鎴鋒病鏈夊~鍐欐棩鏈熺被鍨嬪瓧孌墊椂錛堣岃瀛楁騫墮潪蹇呭~錛夛紝validator涓嶄細鎻愬嚭璀﹀憡錛岃屽湪copyProperties()鏃朵細鎶ョ被鍨嬭漿鎹㈠紓甯革紝鍘熷洜鏄繖鏃禔ctionForm涓殑璇ュ瓧孌電殑鍊兼槸絀哄瓧絎︿覆錛?"錛夛紝璐熻矗瀛楃涓插悜Date杞崲鐨凷qlDateConverter綾昏皟鐢―ate.valueOf("")鏂規硶錛屾樉鐒?"鏄棤娉曡漿鎹負鏃ユ湡鐨勶紝鎵浠ヤ細鎶涘嚭寮傚父銆?BR>
閫氳繃鏌ョ湅浠g爜鍜岃祫鏂欙紝鎴戝彂鐜拌繖涓棶棰樼殑瑙e喅鏂規硶鍏跺疄闈炲父綆鍗曘傚彧瑕佹妸甯︾己鐪佸煎弬鏁扮殑SqlDateConverter閲嶆柊娉ㄥ唽涓涓嬶紝瑕嗙洊鍘熸湁鐨勬敞鍐屼俊鎭氨鍙互浜嗭紝榪欎釜娉ㄥ唽璇彞涓鑸槸鍐欏湪緋葷粺鍒濊瘯鍖栫殑鍦版柟錛屽浜嶴truts搴旂敤紼嬪簭錛屽綋鐒跺仛鍦≒lugIn閲屾渶鏂逛究銆備唬鐮佸涓嬶細
package etc;
import javax.servlet.ServletException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.SqlDateConverter;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class ConverterPlugIn implements PlugIn{
public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
ConvertUtils.register(new SqlDateConverter(null),java.sql.Date.class);
}
public void destroy() {
ConvertUtils.deregister();
}
}
娉ㄦ剰SqlDateConverter鐨勬瀯閫犳柟娉曟槸甯︽湁鍙傛暟null鐨勶紝榪欒〃紺洪亣鍒頒笉鑳借В鏋愮殑瀛楃涓插氨榪斿洖絀哄箋傝宒eregister()鏂規硶鐨勪綔鐢ㄦ槸鎭㈠ConvertUtils鐨勭己鐪佹敞鍐岃〃銆備負浜嗕嬌榪欎釜PlugIn璧蜂綔鐢紝瑕佸湪struts-config.xml閲屽鍔犱竴鍙ヨ瘽錛?BR>
<plug-in className="etc.ConverterPlugIn" />
鏃ユ湡瀛楁寰寰浼氱粰鎴戜滑鐨勫紑鍙戝甫鏉ラ夯鐑︼紝鍏跺疄鍦⊿truts搴旂敤紼嬪簭閲岋紝鍙鎶婅繖浜涜漿鎹㈢被鎼炵啛浜嗭紝鎬誨彲浠ユ壘鍒板緢鏂逛究鐨勫姙娉曘傚父瑙佺殑闂榪樻湁濡備綍鎸囧畾鏃ユ湡杈撳叆鏍煎紡錛屾庢牱澶勭悊java.util.Date鐨勮漿鎹紝絳夌瓑錛屽湪榪欎釜閾炬帴閲屾湁瑙e喅榪欎簺闂鐨勬柟娉曪紝閬撶悊閮芥槸涓鏍風殑銆?/FONT>
]]>
Struts鍜孞SF/Tapestry閮藉睘浜庤〃鐜板眰妗嗘灦錛岃繖涓ょ鍒嗗睘涓嶅悓鎬ц川鐨勬鏋訛紝鍚庤呮槸涓縐嶄簨浠墮┍鍔ㄥ瀷鐨勭粍浠舵ā鍨嬶紝鑰孲truts鍙槸鍗曠函鐨凪VC妯″紡妗嗘灦錛岃佸鎬繪槸鎬ュ惣鍚艱浜嬩歡椹卞姩鍨嬪氨姣擬VC妯″紡妗嗘灦濂斤紝浣曚互瑙佸緱錛屾垜浠笅闈㈣繘琛岃緇嗗垎鏋愭瘮杈冧竴涓嬪埌搴曟槸鎬庝箞鍥炰簨錛?/FONT>
棣栧厛浜嬩歡鏄寚浠庡鎴風欏甸潰錛堟祻瑙堝櫒錛夌敱鐢ㄦ埛鎿嶄綔瑙﹀彂鐨勪簨浠訛紝Struts浣跨敤Action鏉ユ帴鍙楁祻瑙堝櫒琛ㄥ崟鎻愪氦鐨勪簨浠訛紝榪欓噷浣跨敤浜咰ommand妯″紡錛屾瘡涓戶鎵緼ction鐨勫瓙綾婚兘蹇呴』瀹炵幇涓涓柟娉昬xecute銆?/FONT>
鍦⊿truts涓紝瀹為檯鏄竴涓〃鍗旻orm瀵瑰簲涓涓狝ction綾?鎴朌ispatchAction)錛屾崲涓鍙ヨ瘽璇達細鍦⊿truts涓疄闄呮槸涓涓〃鍗曞彧鑳藉搴斾竴涓簨浠訛紝Struts榪欑浜嬩歡鏂瑰紡縐頒負application event錛宎pplication event鍜孋omponent event鐩告瘮鏄竴縐嶇矖綺掑害鐨勪簨浠躲?/FONT>
Struts閲嶈鐨勮〃鍗曞璞ctionForm鏄竴縐嶅璞★紝瀹冧唬琛ㄤ簡涓縐嶅簲鐢紝榪欎釜瀵硅薄涓嚦灝戝寘鍚嚑涓瓧孌碉紝榪欎簺瀛楁鏄疛sp欏甸潰琛ㄥ崟涓殑input瀛楁錛屽洜涓轟竴涓〃鍗曞搴斾竴涓簨浠訛紝鎵浠ワ紝褰撴垜浠渶瑕佸皢浜嬩歡綺掑害緇嗗寲鍒拌〃鍗曚腑榪欎簺瀛楁鏃訛紝涔熷氨鏄錛屼竴涓瓧孌靛搴斾竴涓簨浠舵椂錛屽崟綰嬌鐢⊿truts灝變笉澶彲鑳斤紝褰撶劧閫氳繃緇撳悎JavaScript涔熸槸鍙互杞集瀹炵幇鐨勩?/FONT>
鑰岃繖縐嶆儏鍐典嬌鐢↗SF灝卞彲浠ユ柟渚垮疄鐜?
<h:inputText id="userId" value="#{login.userId}">
<f:valueChangeListener type="logindemo.UserLoginChanged" />
</h:inputText>
#{login.userId}琛ㄧず浠庡悕涓簂ogin鐨凧avaBean鐨刧etUserId鑾峰緱鐨勭粨鏋滐紝榪欎釜鍔熻兘浣跨敤struts涔熷彲浠ュ疄鐜幫紝name="login" property="userId"
鍏抽敭鏄浜岃錛岃繖閲岃〃紺哄鏋渦serId鐨勫兼敼鍙樺茍涓旂‘瀹氭彁浜ゅ悗錛屽皢瑙﹀彂璋冪敤綾籙serLoginChanged鐨刾rocessValueChanged(...)鏂規硶銆?
JSF鍙互涓虹粍浠舵彁渚涗袱縐嶄簨浠訛細Value Changed鍜?Action. 鍓嶈呮垜浠凡緇忓湪涓婅妭瑙佽瘑榪囩敤澶勶紝鍚庤呭氨鐩稿綋浜巗truts涓〃鍗曟彁浜ction鏈哄埗錛屽畠鐨凧SF鍐欐硶濡備笅錛?
<h:commandButton id="login" commandName="login">
<f:actionListener type=鈥漧ogindemo.LoginActionListener鈥?/>
</h:commandButton>
浠庝唬鐮佸彲浠ョ湅鍑猴紝榪欎袱縐嶄簨浠舵槸閫氳繃Listerner榪欐牱瑙傚療鑰呮ā寮忚創鍦ㄥ叿浣撶粍浠跺瓧孌典笂鐨勶紝鑰孲truts姝ょ被浜嬩歡鏄師濮嬬殑涓縐嶈〃鍗曟彁浜ubmit瑙﹀彂鏈哄埗銆傚鏋滆鍓嶈呮瘮杈冭璦鍖栵紙緙栫▼璇█涔犳儻鍋氭硶綾諱技Swing緙栫▼錛夛紱鍚庤呮槸灞炰簬WEB鍖栵紝鍥犱負瀹冩槸鏉ヨ嚜Html琛ㄥ崟錛屽鏋滀綘璧鋒鏄粠Perl/PHP寮濮嬶紝鍙嶈屽鏄撴帴鍙桽truts榪欑椋庢牸銆?/FONT>
鍩烘湰閰嶇疆
Struts鍜孞SF閮芥槸涓縐嶆鏋訛紝JSF蹇呴』闇瑕佷袱縐嶅寘JSF鏍稿績鍖呫丣STL鍖咃紙鏍囩搴擄級錛屾澶栵紝JSF榪樺皢浣跨敤鍒癆pache欏圭洰鐨勪竴浜沜ommons鍖咃紝榪欎簺Apache鍖呭彧瑕侀儴緗插湪浣犵殑鏈嶅姟鍣ㄤ腑鏃㈠彲銆?/FONT>
JSF鍖呬笅杞藉湴鍧錛?/FONT>http://java.sun.com/j2ee/javaserverfaces/download.html閫夋嫨鍏朵腑Reference Implementation銆?/FONT>
JSTL鍖呬笅杞藉湪http://jakarta.apache.org/site/downloads /downloads_taglibs-standard.cgi
鎵浠ワ紝浠嶫SF鐨勯┍鍔ㄥ寘緇勬垚鐪嬶紝鍏跺紑婧愬熀鍥犱篃鍗犳嵁寰堝ぇ鐨勬瘮閲嶏紝JSF鏄竴涓猄UN浼欎即浠伐涓氭爣鍑嗗拰寮婧愪箣闂寸殑涓涓販琛鍎褲?
涓婅堪涓や釜鍦板潃涓嬭澆鐨刯ar鍚堝茍鍦ㄤ竴璧峰氨鏄疛SF鎵闇瑕佺殑鍏ㄩ儴椹卞姩鍖呬簡銆備笌Struts鐨勯┍鍔ㄥ寘涓鏍鳳紝榪欎簺椹卞姩鍖呭繀欏諱綅浜嶹eb欏圭洰鐨刉EB-INF/lib錛屽拰Struts涓鏍風殑鏄篃蹇呴』鍦╳eb.xml涓湁濡備笅閰嶇疆錛?/FONT>
<web-app>
銆銆<servlet>
銆銆<servlet-name>Faces Servlet</servlet-name>
銆銆<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
銆銆<load-on-startup>1</load-on-startup>
銆銆</servlet>
銆銆<servlet-mapping>
銆銆<servlet-name>Faces Servlet</servlet-name>
銆銆<url-pattern>*.faces</url-pattern>
銆銆</servlet-mapping>
</web-app>
榪欓噷鍜孲truts鐨剋eb.xml閰嶇疆浣曞叾鐩鎬技錛岀畝鐩翠竴妯′竴鏍楓?
姝eStruts鐨剆truts-config.xml涓鏍鳳紝JSF涔熸湁綾諱技鐨刦aces-config.xml閰嶇疆鏂囦歡錛?
<faces-config>
銆銆<navigation-rule>
銆銆<from-view-id>/index.jsp</from-view-id>
銆銆<navigation-case>
銆 <from-outcome>login</from-outcome>
銆銆<to-view-id>/welcome.jsp</to-view-id>
銆銆</navigation-case>
銆銆</navigation-rule>
銆銆<managed-bean>
銆銆<managed-bean-name>user</managed-bean-name>
銆銆<managed-bean-class>com.corejsf.UserBean</managed-bean-class>
銆銆<managed-bean-scope>session</managed-bean-scope>
銆銆</managed-bean>
</faces-config>
鍦⊿truts-config.xml涓湁ActionForm Action浠ュ強Jsp涔嬮棿鐨勬祦紼嬪叧緋伙紝鍦╢aces-config.xml涓紝涔熸湁榪欐牱鐨勬祦紼嬶紝鎴戜滑鍏蜂綋瑙i噴涓涓婲avigation錛?/FONT>
鍦╥ndex.jsp涓湁涓涓簨浠訛細
<h:commandButton label="Login" action="login" />
Action鐨勫煎繀欏誨尮閰峟orm-outcome鍊鹼紝涓婅堪Navigation閰嶇疆琛ㄧず錛氬鏋滃湪index.jsp涓湁涓涓猯ogin浜嬩歡錛岄偅涔堜簨浠惰Е鍙戝悗涓嬩竴涓〉闈㈠皢鏄痺elcome.jsp
JSF鏈変竴涓嫭绔嬬殑浜嬩歡鍙戠敓鍜岄〉闈㈠鑸殑嫻佺▼瀹夋帓錛岃繖涓濊礬姣攕truts瑕侀潪甯告竻鏅般?
managed-bean綾諱技Struts鐨凙ctionForm錛屾濡傚彲浠ュ湪struts-config.xml涓畾涔堿ctionForm鐨剆cope涓鏍鳳紝榪欓噷涔熷畾涔変簡managed-bean鐨剆cope涓簊ession銆?
浣嗘槸濡傛灉浣犲彧浠ヤ負JSF鐨刴anaged-bean灝辮繖鐐瑰姛鑳藉氨閿欎簡錛孞SF铻嶅叆浜嗘柊鐨処oc妯″紡/渚濊禆鎬ф敞灝勭瓑鎶鏈?
瀵逛簬Userbean榪欐牱涓涓猰anaged-bean錛屽叾浠g爜濡備笅錛?
public class UserBean {
銆銆private String name;
銆銆private String password;
銆銆// PROPERTY: name
銆銆public String getName() { return name; }
銆銆public void setName(String newValue) { name = newValue; }
銆銆// PROPERTY: password
銆銆public String getPassword() { return password; }
銆銆public void setPassword(String newValue) { password = newValue; }
}
<managed-bean>
銆銆<managed-bean-name>user</managed-bean-name>
銆銆<managed-bean-class>com.corejsf.UserBean</managed-bean-class>
銆銆<managed-bean-scope>session</managed-bean-scope>
銆銆<managed-property>
銆銆<property-name>name</property-name>
銆銆<value>me</value>
銆銆</managed-property>
銆銆<managed-property>
銆銆<property-name>password</property-name>
銆銆<value>secret</value>
銆銆</managed-property>
</managed-bean>
faces-config.xml榪欐閰嶇疆鍏跺疄鏄皢"me"璧嬪肩粰name錛屽皢secret璧嬪肩粰password錛岃繖鏄噰鍙朓oc妯″紡涓殑Setter娉ㄥ皠鏂瑰紡銆?/FONT>
Backing Beans
瀵逛簬涓涓獁eb form錛屾垜浠彲浠ヤ嬌鐢ㄤ竴涓猙ean鍖呭惈鍏舵秹鍙婄殑鎵鏈夌粍浠訛紝榪欎釜bean灝辯О涓築acking Bean錛?Backing Bean鐨勪紭鐐規槸錛氫竴涓崟涓被鍙互灝佽鐩稿叧涓緋誨垪鍔熻兘鐨勬暟鎹拰閫昏緫銆?/FONT>
璇寸櫧浜嗭紝灝辨槸涓涓狫avabean閲屽寘鍚叾浠朖avabean錛屼簰鐩歌皟鐢紝灞炰簬Facade妯″紡鎴朅dapter妯″紡銆?/FONT>
瀵逛簬涓涓狟acking Beans鏉ヨ錛屽叾涓寘鍚簡鍑犱釜managed-bean錛宮anaged-bean涓瀹氭槸鏈塻cope鐨勶紝閭d箞榪欏叾涓殑鍑犱釜managed-beans濡備綍閰嶇疆瀹冧滑鐨剆cope鍛紵
<managed-bean>
銆銆...
銆銆<managed-property>
銆銆<property-name>visit</property-name>
銆銆<value>#{sessionScope.visit}</value>
銆銆</managed-property>
榪欓噷閰嶇疆浜嗕竴涓狟acking Beans涓湁涓涓猻etVisit鏂規硶錛屽皢榪欎釜visit璧嬪間負session涓殑visit錛岃繖鏍蜂互鍚庡湪紼嬪簭涓垜浠彧綆¤闂畍isit瀵硅薄錛屼粠涓幏鍙栨垜浠笇鏈涚殑鏁版嵁錛堝鐢ㄦ埛鐧婚檰娉ㄥ唽淇℃伅錛夛紝鑰寁isit鏄繚瀛樺湪session榪樻槸application鎴杛equest鍙渶瑕侀厤緗棦鍙?
UI鐣岄潰
JSF鍜孲truts涓鏍鳳紝闄や簡JavaBeans綾諱箣澶栵紝榪樻湁欏甸潰琛ㄧ幇鍏冪礌錛岄兘鏄槸浣跨敤鏍囩瀹屾垚鐨勶紝Struts涔熸彁渚涗簡struts-faces.tld鏍囩搴撳悜JSF榪囨浮銆?
浣跨敤Struts鏍囩搴撶紪紼嬪鏉傞〉闈㈡椂錛屼竴涓渶澶ч棶棰樻槸浼氬ぇ閲忎嬌鐢╨ogic鏍囩錛岃繖涓猯ogic濡傚悓if璇彞錛屼竴鏃﹀啓璧鋒潵錛屾悶鐨凧SP欏甸潰璞′縿緗楁柉鏂瑰潡涓鏍鳳紝浣嗘槸浣跨敤JSF鏍囩灝辯畝媧佷紭緹庯細
<jia:navigatorItem name="inbox" label="InBox"
銆銆icon="/images/inbox.gif"
銆銆action="inbox"
銆銆disabled="#{!authenticationBean.inboxAuthorized}"/>
濡傛灉authenticationBean涓璱nboxAuthorized榪斿洖鏄亣錛岄偅涔堣繖涓琛屾爣絳懼氨涓嶇敤鏄劇ず錛屽騫插噣鍒╃儲錛?
鍏堝啓鍒拌繖閲岋紝鎴戜細緇х畫瀵笿SF娣卞叆姣旇緝涓嬪幓錛屽鏋滅爺絀惰繃Jdon妗嗘灦鐨勪漢錛屽彲鑳戒細鍙戠幇錛孞don妗嗘灦鐨刯donframework.xml涓璼ervice閰嶇疆鍜宮anaged-bean涓鏍烽兘浣跨敤浜嗕緷璧栨敞灝勶紝鐪嬫潵瀵笿avabean鐨勪緷璧栨敞灝勫凡緇忚繀閫熷湴鎴愪負涓縐嶆柊鎶鏈薄寰侊紝濡傛灉浣犺繕涓嶄簡瑙oc妯″紡錛岃刀绱цˉ璇俱?