锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍏充簬姝ょ壒鎬х殑浠嬬粛璇峰弬鑰冿細http://jakarta.apache.org/tapestry/current/UsersGuide/page-class.html 璇存槑錛?BR>閫氫織鐐硅灝辨槸鎮ㄥ彲浠ヤ笉瀹氫箟.page鏂囦歡鎴栬呭畾涔夌殑.page鏂囦歡涓笉鎸囧畾class 灞炴э紝鑰岃鏈嶅姟鍣ㄨ嚜鍔ㄦ牴鎹?html鏂囦歡鐨勮礬寰勬潵瀵繪壘瀵瑰簲鐨勭被鏂囦歡銆?閰嶇疆錛?BR>鍦?application鐨勫畾涔夋枃浠朵腑娣誨姞錛?
榪欐牱濡傛灉鍦ㄦ枃妗f牴鐩綍涓嬫湁涓狧ome.html鏂囦歡錛屼綘灝卞彲浠ュ皢Home.java鏀懼埌 org.edynasty.pages(瀹為檯寮鍙戜腑閰嶇疆涓烘偍鑷繁鐨勫寘鍚?鍖呬腑錛宼apestry鑷姩鏍規嵁 Home.hmtl鏋勯爋rg.edynasty.pages.Home鏉ュ畾浣嶉〉闈㈢殑綾繪枃浠?褰撶劧鎮ㄤ篃鍙互鍦╓EB -INF鐩綍涓嬫斁涓涓狧ome.page,涓嶉渶瑕佸畾涔塩lass灞炴э紝tapestry鑷姩鎸夌収涓婅竟鐨勫師 鐞嗗畾浣嶃?鏁堟灉錛?BR>榪欐牱鎮ㄥ彲浠ヤ笉闇瑕佺淮鎶?page涓殑class灞炴э紝鐩存帴鏍規嵁.html鏂囦歡鏉ュ啓瀵瑰簲 鐨勭被鏂囦歡銆傝屼笖鍙互鏍規嵁涓氬姟閫昏緫鏉ュ畾涔夌洰褰曠粨鏋勶紝渚嬪灝?org.edynasty.pages.user瀹氫箟涓簎ser鐩稿叧鐨勭被錛?html涔熷氨鍙互鏀懼埌user鐩綍涓?杈癸紝鐩綍緇撴瀯濡備笅錛?user/ListUsers.html user/EditUser.html course/ListCourses.html course/EditCourses.html Home.html 涓銆乨efault binding types(榛樿鐨勭粦瀹氱被鍨?
鍔犵矖鐨勯儴鍒嗘樉紺哄墠鍚庣殑鍙樺寲錛屼箣鎵浠ュ彲浠ヨ繖鏍峰畾涔夛紝鏄洜涓篒nsert緇勪歡瀹氫箟value鍙傛暟鐨勯粯璁ょ粦瀹氱被鍨嬩負ongl. 淇錛?/STRONG> 浠巄eta4鐗堟湰寮濮嬶紝姝ょ壒鎬у凡緇忚鍒犻櫎錛? Beta4鐨刢hange log錛?/P>
Remove default-binding attribute from element(HLS) 浣嗘槸鈥滃鏋滄病鏈夊畾涔夐粯璁ょ殑緇戝畾鍙傛暟錛岄偅涔堝湪html妯℃澘涓畾涔夌殑榛樿緇戝畾鍙傛暟涓簂iteral錛岄〉闈㈠畾涔夋枃浠墮噷鐨勯粯璁ょ粦瀹氬弬鏁頒負ognl鈥濊繖涓晥鏋滅粡嫻嬭瘯渚濈劧瀛樺湪銆? 鎬蹇碉細 姝ゆ鏂囧瓧鍦╞eta3涓瓨鍦紝beta4鍚庡氨鍒犳帀浜嗭紒 Tapestry 4.0 introduces a new idea: default binding types. Each component parameter may define a default binding type (using the default-binding attribute of the If a binding reference does not have a prefix, the default binding type is used. Because of this, the following two snippets are identical: This works because the Insert component defines the default-binding for the value parameter to be "ognl". Likewise, the source and value parameters of the Foreach component are defined to be "ognl". However, the element parameter of the Foreach component has a binding type of "literal". This is a decision made by the component author. If a particular parameter is (nearly) always bound using a particular binding type, then a default-binding may be set. The default binding can always be overriden with an explicit binding type prefix. What about parameters that don't define a default binding type? The answer to this question (which includes all informal parameters), is that it depends on whether the parameter is bound in an HTML template, or in a page or component specification. In an HTML template, the default binding type is "literal". In a specification, the default binding type is "ognl". 絎簩縐嶆柟娉曟瘮杈冪鍚堣蔣浠剁殑璁捐鎬濈淮錛岃屼笖鍙傛暟鐨勭被鍨嬪湪浼犲叆鍚庝繚瀛橈紝鑰屼笉鏄兂璞′腑鐨勭粺涓String綾誨瀷銆?BR>渚嬪錛?BR>. . .
Tapestry4鏂扮壒鎬?鍥?-婧愪唬鐮佹爣娉ㄧ殑寮傚父澶勭悊
Tapestry鏈潵鎻愪緵鐨刣ebug鍔熻兘灝卞崄鍒嗗己澶э紝4.0鐗堟湰涓彁渚涗簡鏇村姞璇︾粏鐨勬姤閿欐満鍒訛紝鍙互鏄劇ず閿欒鐨勪唬鐮侊紝騫跺湪鎶ラ敊鐨勫湴鏂瑰姞浜爣娉紝鍏蜂綋鎴浘璇風湅闄勪歡(璋佽兘鍛婅瘔鎴戞庝箞灝嗗浣欑殑鐓х墖鍒犻櫎鍛)
Tapestry4鏂扮壒鎬?浜?-Friendly URLs
Tapestry4.0浠ュ墠鐗堟湰涓殑URL涓鐩磋浜烘墍璇熺梾錛屽綋鐒剁幇鍦ㄥ凡緇忔湁寰堝鐨勮В鍐蟲柟
妗堬紝4.0鐗堟湰涓凡緇忓姝ゅ仛浜嗘敼榪涳紝
鍥犱負鐜板湪鐨勭増鏈渶瑕侀氳繃hivemind鏉ラ厤緗紝鎵浠ラ渶瑕佽緗甴ivemind.xml涓殑涓浜涘睘
鎬э紝鍏蜂綋閰嶇疆濡備笅錛?BR><?xml version="1.0"?>
<module id="tapestry4" version="1.1.0">
<contribution configuration-id="tapestry.url.ServiceEncoders">
<page-service-encoder id="page" extension="html" service="page"/>
<direct-service-encoder id="direct" stateless-extension="direct"
stateful-extension="sdirect"/>
<asset-encoder id="asset" path="/assets/"/>
<extension-encoder id="extension" extension="svc" after="*"/>
</contribution>
</module>
鍚屾椂web.xml涓姞鍏ユ槧灝勶細
<servlet>
<servlet-name>tapestry4</servlet-name>
<servlet-class> org.apache.tapestry.ApplicationServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>tapestry4</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>tapestry4</servlet-name>
<url-pattern>*.direct</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>tapestry4</servlet-name>
<url-pattern>*.sdirect</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>tapestry4</servlet-name>
<url-pattern>/assets/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>tapestry4</servlet-name>
<url-pattern>*.svc</url-pattern>
</servlet-mapping>
濡傛灉甯屾湜棣栭〉鐨勮皟鐢ㄤ笉鏄氳繃/app鏉ユ槧灝勶紝鍙互鍦╳eb.xml涓洿鏀箁edirect錛?BR><filter-name>redirect</filter-name>
<filter-class>org.apache.tapestry.RedirectFilter</filter-class>
<init-param>
<param-name>redirect-path</param-name>
<param-value>/Home.html</param-value>
</init-param>
</filter>
榪欐牱閿叆http://localhost:8080/tapestry4錛岀郴緇熷鑸埌http://localhost:
8080/tapestry4/Home.html,
娣誨姞涓涓狿age欏甸潰渚嬪Test.page錛屽湪Home.html涓姞鍏?lt;a href="#"
jwcid="@PageLink" page="Test">test</a>錛?BR>鍦ㄧ敓鎴愮殑Home.html涓敓鎴愮殑test鐨勯摼鎺ュ湴鍧涓猴細http://localhost:
8080/tapestry4/Test.html
Tapestry4鏂扮壒鎬?鍏?-鑷姩瀹氫綅欏甸潰綾繪枃浠?/STRONG>
Tapestry4鏂扮壒鎬?涓?-Application鍜孲ession鑼冨洿瀵硅薄鐨勪嬌鐢?/STRONG>
Application鍜孲ession鑼冨洿瀵硅薄鐨勪嬌鐢?BR>
鍏充簬姝ょ壒鎬х殑浠嬬粛璇峰弬鑰冿細http://jakarta.apache.org/tapestry/UsersGuide/state.html
璇存槑錛?BR>Application鍜孲ession鑼冨洿鐨勬蹇靛氨涓嶈浜嗭紝T4浠ュ墠鐨勭増鏈彧鍙互鍒嗗埆鎸囧畾涓涓璞★紝
浠ュ墠鐗堟湰鐨勫畾涔夊涓?
<property name="org.apache.tapestry.visit-class" value="your.package.Visit"/>
<property name="org.apache.tapestry.global-class" value="your.package.Global"/>,
T4涓彲浠ユ寚瀹氫換鎰忓鐨勫璞★紝鑰屼笖榛樿鐨剉isit鍜実lobal浠嶇劧鍙互浣跨敤銆?BR>
閰嶇疆錛氬湪hivemodule.xml鐨勫畾涔夋枃浠朵腑娣誨姞錛?BR><contribution configuration-id="tapestry.state.ApplicationObjects">
<state-object name="applicationUser" scope="application">
<create-instance class="org.edynasty.model.User"/>
</state-object>
<state-object name="sessionUser" scope="session">
<create-instance class="org.edynasty.model.User"/>
</state-object>
</contribution>
涓や釜user鍒嗗埆瀵瑰簲Application鍜孲ession鑼冨洿錛屽湪闇瑕佷嬌鐢╱ser鐨刾age涓敞鍏ワ細
<inject property="applicationUser" type="state" object="applicationUser"/>
<inject property="sessionUser" type="state" object="sessionUser"/>錛岄氳繃
getter鍜宻etter鏂規硶璋冪敤銆?BR>
鏁堟灉錛氭庝箞璇村憿錛屽彲浠ヤ笉闇瑕佸湪涓涓獀isit涓畾涔塏澶氬睘鎬э紝鍥犱負Session鐨勫垱寤洪渶瑕佽祫婧愶紝
鍙鎿嶄綔涓涓獀isit鐨勫睘鎬э紝灝遍渶瑕佸垱寤烘暣涓獀isit錛屽垎鍒畾涔変箣鍚庯紝鍙互鍦ㄩ渶瑕佸瓨鍙栨椂鍒嗗埆鍒涘緩銆?/TD>
]]>
Tapestry4鏂扮壒鎬?涓)錛峝efault binding types
姣忎竴涓粍浠剁殑鍙傛暟閮藉彲浠ュ畾涔夐粯璁ょ殑緇戝畾綾誨瀷錛屽鏋滀竴涓粦瀹氱殑鍙傛暟娌℃湁鍓嶇紑錛屽皢浣跨敤榛樿鐨勭粦瀹氱被鍨嬨?BR> 涓嬮潰鐨勪唬鐮佸疄鐜板悓鏍風殑鍔熻兘:
娉ㄦ剰錛氶粯璁ょ殑緇戝畾鍙傛暟鎬繪槸鍙互琚樉寮忕殑緇戝畾澹版槑瑕嗙洊鎺夈?BR> 濡傛灉娌℃湁瀹氫箟榛樿鐨勭粦瀹氬弬鏁幫紝閭d箞鍦╤tml妯℃澘涓畾涔夌殑榛樿緇戝畾鍙傛暟涓簂iteral錛岄〉闈㈠畾涔夋枃浠墮噷鐨勯粯璁ょ粦瀹氬弬鏁頒負ognlBinding Type Defaults
Tapestry4鏂扮壒鎬?浜?錛峫istener method
浜屻乴istener method
濡傛灉浣跨敤榪噒apestry鐨勫簲璇ョ煡閬搇istener鏂規硶鍦?.X浠ュ墠鐗堟湰涓殑瀹氫箟錛屽public void formSubmit(IRequestCycle cycle)錛屾柟娉曞繀欏?BR>鏈変竴涓狪RequestCycle鍙傛暟銆傚弬鏁扮殑鍙栧緱鏂瑰紡濡備笅錛歄bject[] parameters = cycle.getServiceParameters();
鍦?.X涓弬鏁扮殑鍙栧緱鍙互閫氳繃浠ヤ笅涓ょ鏂瑰紡錛?BR>
鍏朵腑objectId涓篠tring綾誨瀷錛宨ndex涓篿nt錛屽0鏄庝腑浣跨敤浜嗛粯璁ょ殑鍙傛暟緇戝畾綾誨瀷銆?
瀵瑰簲鐨勬柟娉曞0鏄庡涓?
public void doClick(String objectId, int index)
{ . . . }
姝や負絎簩縐嶆柟寮忥紝鍙鏂規硶鐨勫畾涔夌鍚堣嚜鐒朵範鎯紝褰撶劧浣犱篃鍙互閫氳繃浼犵粺鐨勬柟娉曪紝濡備笅鎵紺猴細 public void doClick(IRequestCycle cycle)
{ Object[] parameters = cycle.getListenerParameters();
String objectId = (String)parameters[0];
int index = ((Integer)parameters[1]).intValue(); . . . }
榪欑鏂瑰紡鏄負浜嗗悜鍚庡吋瀹逛互鍓嶇殑鐗堟湰錛屽綋鐒朵篃閫傜敤閭g鍙傛暟鏁扮洰涓嶇‘瀹氱殑鎯呭喌銆?Tapestry榛樿鎼滅儲浠ヤ笅鐨勬柟娉曞0鏄庯細
涓嶈璇曞浘閫氳繃鍙傛暟鐨勭被鍨嬫潵鏄犲皠listener鏂規硶錛宼apestry鏄牴鎹弬鏁扮殑鏁扮洰鏉ョ‘瀹氭柟娉曠殑銆?BR>
Tapestry4鏂扮壒鎬?涓?錛峠lobal property source
涓夈丟lobal Property Source(鍏ㄥ眬鐨勬秷鎭睘鎬ч厤緗?
娑堟伅灞炴ч厤緗惉璧鋒潵涓嶆槸寰堣垝鏈嶏紝鏆傛椂榪欐牱縐板懠濂戒簡錛屾秷鎭睘鎬ч厤緗篃灝辨槸閫氱О鐨勫浗闄呭寲閰?BR>緗紝閫氳繃閰嶇疆涓涓猵roperties鏂囦歡浣夸笉鍚岃璦鐨勬祻瑙堣呯湅鍒板搴旇璦鐨勭増鏈紝涓鑸?BR>鐨勪嬌鐢ㄥ涓嬶紝涓涓猵age欏甸潰錛屼緥濡俥xample.page,鍚岀洰褰曚笅鏀句竴涓?BR>example.properties,鍦?example.html涓嬌鐢?SPAN key="key">鏉ユ寚瀹氭樉紺哄鹼紝
涓枃鍙互浣跨敤example_zh_CN.properties鏉ラ厤緗傜湅璧鋒潵鎸烘柟渚跨殑錛屽彲
tapestry4.0浠ュ墠鐨勭増鏈殑鍥介檯鍖栦笉鏀寔鍏ㄥ眬鐨勫睘鎬ч厤緗枃浠訛紝蹇呴』姣忎釜欏甸潰瀹氫箟
鑷繁鐨勶紝鏃犳硶鍑犱釜欏甸潰鍏變韓錛屼絾瀹為檯寮鍙戜腑錛屽欏甸潰鍏變韓灞炴ч厤緗槸寰堝父瑙佺殑錛?BR>tapestry4.0涓彲浠ラ氳繃浠ヤ笅鏂瑰紡鑾峰緱鍏ㄥ眬鐨勫睘鎬ч厤緗枃浠訛細
鍒涘緩涓涓窡浣犵殑欏圭洰鍏ㄥ眬閰嶇疆鏂囦歡錛屽yourApp.application,姝ゆ枃浠跺湪4.0浠ュ墠鐨?BR>鐗堟湰涓槸蹇呴』鐨勶紝4.0涓鏋滄病鏈夊繀瑕侀厤緗紝鍙互涓嶉渶瑕佹鏂囦歡(鎵繙浜?,yourApp
鏄牴鎹綘鍦╳eb.xml瀹氫箟鐨勶紝渚嬪
閭e睘鎬у畾涔夋枃浠跺氨搴旇鏄痶apestry4.properties,榪欐牱鍦ㄦ鏂囦歡涓畾涔変竴涓細test=
嫻嬭瘯錛屽湪Home.html涓嬌鐢?lt; span key="test">test,鐪嬪埌鈥滄祴璇曗濇紜樉紺恒?BR>
]]>
銆銆娌℃湁涓縐嶆柊鎶鏈槸鍑┖璇炵敓鐨勶紝瀹冪殑钀岃娊鎴栬儦鑳庢繪槸鎴栧鎴栧皯鏄劇幇浜庝互鍓嶇殑鎶鏈腑錛孞ive璁哄潧鏄ぇ瀹舵綔蹇冪爺絀剁殑璁捐鍨嬪簲鐢ㄧ▼搴忥紝鍏剁浉鍏寵В鏋愬彲瑙佹湰鏍忕殑GoF璁捐妯″紡涓撴爮銆?/P>
銆銆Jive鍜孲pring鍚屼負鐢盝avaBeans緇勬垚鐨凧2EE Web緋葷粺錛孞ive浣滀負鏃╂湡鎴愬姛璁捐妗堜緥錛屽叾涓昏鏋舵瀯鎴愪負澶у鏁扮函JavaBeans緋葷粺鐨勬祦琛屾灦鏋勶紝Spring涔熶笉渚嬪銆?/P>
銆銆Spring妗嗘灦闄や簡鏄竴縐峎eb灞傚簲鐢ㄦ鏋訛紝榪樻彁渚涗簡璁塊棶EJB灞傜殑鎺ュ彛錛屼篃鏈塉DBC/ORM鐨勭洿鎺ユ搷浣溿係pring妗嗘灦涓昏欖呭姏鏄嬌鐢↖oC妯″紡鍜孉OP瀹炵幇浜咼ive緋葷粺鐨勯氱敤鍔熻兘錛屼粠鑰屼嬌寰桱ive榪欐牱鐨勭函JavaBeans鏋舵瀯璁捐鍙互閲嶇敤鍦ㄥ叾瀹冪郴緇熶腑銆?/P>
銆銆濡傛灉浣犳劅鎱ㄤ簬Jive鐨勮璁$悊蹇碉紝浣嗘槸鍙堣嫤浜庢棤娉曢噸鐢ㄥ叾璁捐鏃訛紝Spring妗嗘灦宸茬粡甯綘瀹炵幇浜嗐?/P>
銆銆鍚屾椂涔熻娉ㄦ剰鍒幫細Spring妗嗘灦綾諱技鈥滄潅鐑┾濓紝瀹冨寘鍚簡寰堝J2EE搴旂敤鐨勫伐鍏鳳紝綾誨瀵笶JB鐨勮皟鐢紝瀹冪殑MVC涓嶴truts JSF涔熸槸鐩哥珵浜夌殑錛屼互綰疘oc鍜孉OP璁捐鏉ヨ錛孲pring妗嗘灦涔熸槸涓縐嶅緢閲嶇殑(Heavy銆乄eight)妗嗘灦銆係pring妗嗘灦鏄鏉傜殑錛屽鏋滄兂浠pring鏇夸唬EJB錛岄偅涔堟棤鐤戞寜浜嗚懌鑺︽誕璧風摙銆?/P>
銆銆灝咼ive璁哄潧鍜孲pring妗嗘灦鑱旂郴璧鋒潵錛屼細甯姪鏇村鐞嗚В璁捐妯″紡鐨勭▼搴忓憳榪呴熸帉鎻℃渶鏂扮殑璁捐鎬濇疆錛岃屼笉鏄竴縐嶈煩璺冨紡鐨勫己榪帴鍙椼傚鏋滀綘瀵笿ive鏈夊緢濂界殑鐮旂┒錛屽皢浼氬彂鐜癝pring妗嗘灦鏄疛ive璁捐鐨勬洿鍔犻氱敤鐨勬彁鍗囥?/P>
銆銆鍦↗ive涓?ForumFactory鏄暣涓郴緇熺殑鍏ュ彛鍜岀獊鐮寸偣錛孞ive閫氳繃ForumFactory灝嗘暣涓郴緇熸帉鎺у湪涓涓伐鍘傛ā寮忎笅錛岃繖鏍峰仛鐨勫ソ澶勬槸錛氫究浜庢帶鍒剁郴緇熺殑JavaBeans錛屼緥濡傦紝瀹㈡埛绔氳繃ForumFactory鍙垱寤轟竴涓狥orum鎴栬闂竴涓狥orum錛屼絾鏄槸鍚︽湁鏉冮檺璁塊棶鍛紵濡備笅鍥撅細
銆銆
銆銆 Jive閫氳繃ForumFactory灝嗚繖縐嶈闂紩瀵煎埌鐩稿簲鐨凱roxy綾誨幓錛屽ForumFactoryProxy綾葷瓑錛岄氳繃浠g悊妯″紡瀵硅繖浜涚被榪涜鏉冮檺鎺у埗璁塊棶銆傝繖鏄唬鐞嗘ā寮忕殑涓涓富瑕佺敤澶勶紝浣嗘槸鐮旇Jive鐨勪唬鐞嗘ā寮忎細鍙戠幇錛岃涓烘瘡涓被瀹炵幇涓涓狿roxy綾伙紝闈炲父鐞愮錛屾湁娌℃湁鏇翠紭闆呯殑鏂瑰紡鍛紵 褰撶劧浣跨敤鍔ㄦ佷唬鐞嗐?/P>
銆銆Spring妗嗘灦鍩烘湰鏄娊璞′笂榪拌璁★紝Spring妗嗘灦瀵規墍鏈塉avaBeans鐨勭鐞嗕篃鏄熀浜庝竴涓誨叆鍙ean Factory鏈哄埗錛屼笉鍚岀殑鏄紝BeanFactory鍙互 綆$悊鎵鏈夊簲鐢ㄧ殑JavaBeans錛屼嬌鐢ㄨ呭彧瑕佸皢鑷繁鐨凧avaBeans閫氳繃閰嶇疆鏂囦歡鍛婅瘔BeanFactory錛岄偅涔圔eanFactory灝嗕細鍔犺澆榪欎簺JavaBeans錛屼緥濡傦細
銆銆<beans>
銆銆銆銆<bean id="exampleBean" class="eg.ExampleBean"/>
銆銆銆銆<bean id="anotherExample" class="eg.ExampleBeanTwo"/>
銆銆</beans>
銆銆鍦↗ive涓紝ForumFactory鍔犺澆Jive鑷繁鐨凧avaBeans鏄氳繃宸ュ巶瀹炵幇DbForumFactory瀹炵幇鐨勶紝濡備笅浠g爜錛孌bForumFactory寮曞彂浜嗗悗鍙頒竴緋誨垪鍔熻兘瀹炵幇錛岃繖鏄旱鍚戯紝鑰宺eturn new ForumFactoryProxy榪欎釜璇彞鍒欑被浼煎紩鏉ヤ竴涓垏闈紝浠庝竴涓í鍚戞柟闈㈠疄鐜頒簡鏉冮檺璁塊棶絳夊姛鑳斤細
private static String className = "com.jivesoftware.forum.database.DbForumFactory"; public static ForumFactory getInstance(Authorization authorization) { 銆銆銆銆 銆銆銆銆 try { 銆銆銆銆 //Now, 榪斿洖 proxy.鐢ㄦ潵闄愬埗鎺堟潈瀵筬orum鐨勮闂? |
銆銆鏃㈢劧Spring妗嗘灦涔熸槸閫氳繃涓涓狟ean Factory鍔犺澆鎵鏈夌殑綾伙紝閭d箞瀹冩槸濡備綍鍔犺澆鐨勶紵閫氳繃IoC妯″紡錛屼篃灝辨槸渚濊禆鎬ф敞灝勬ā寮忋傚湪鎴戜互鍓嶆枃绔犫?A target=_blank>IoC妯″紡鈥濅腑錛屾垜姣旇緝浜咶actory宸ュ巶妯″紡鍒涘緩瀵硅薄鍜孖oc妯″紡鐨勬敞灝勫璞″疄鐜頒箣闂寸殑寮傚悓錛孖oc鐩告瘮宸ュ巶妯″紡鍒欐洿鍔犺В鑰︿簡璋冪敤鑰呭拰琚皟鐢ㄨ呬箣闂村叧緋伙紝浣跨敤Ioc妯″紡錛屾棤闇鍦ㄨ皟鐢ㄨ呬唬鐮佷腑娑夊強琚皟鐢ㄨ呯殑鍏蜂綋瀹炵幇銆?/P>
銆銆Spring妗嗘灦涓嶄絾鍙互鍚戣嚜宸卞鍣ㄤ腑娉ㄥ皠搴旂敤鑰呰嚜宸卞畾涔夌殑JavaBeans錛堜篃灝辨槸鍒涘緩瀹冧滑錛夛紝鑰屼笖涔熷彲浠ュ悜榪欎簺JavaBeans閫氳繃set鏂規硶瀹炵幇鏁版嵁璧嬪箋?/P>
銆銆涓鏃ean Factory榪愯鏃跺埢鎺岀榪欎簺嬋媧葷殑瀵硅薄錛孲pring閫氳繃AOP鏂瑰紡錛屼粠涓涓í鍒囬潰涓鴻繖浜汮avaBeans鎻愪緵浜嗘潈闄愯闂佷簨鍔¢攣絳夐氱敤鍔熻兘鐨勫疄鐜幫紝榪欑瀹炵幇鏄熀浜庡姩鎬佷唬鐞嗘ā寮忥紝鑰屽姩鎬佷唬鐞嗘槸AOP瀹炵幇鐨勪竴縐嶆柟寮忋?/P>
銆銆鍓嶉潰鎻愬埌錛孞ive涓嬌鐢ㄤ唬鐞嗘ā寮忓疄鐜版潈闄愯闂紝姣斾唬鐞嗘ā寮忔洿鍔犵畝媧佸拰鎶借薄鐨勬槸鍔ㄦ佷唬鐞嗭紝浣跨敤鍔ㄦ佷唬鐞嗗皢浣垮緱璋冪敤鑰呮棤闇鎸囧畾琚皟鐢ㄨ呯殑浠g悊綾伙紝榪欐槸鍔ㄦ佷唬鐞嗗尯鍒唬鐞嗘ā寮忕殑鏈川銆?/P>
銆銆鍔ㄦ佷唬鐞嗚繖涓浼樺娍錛屽張鍙互浣撶幇鍦ㄥ彟澶栦竴鍙ヨ瘽璇笂錛氬姩鎬佷唬鐞嗘嫤鎴簡璋冪敤鑰呭琚皟鐢ㄨ呯殑璋冪敤錛屾鏄繖涓鍔熻兘絎﹀悎浜咥OP鐨勬嫤鎴櫒鍔熻兘錛屼負AOP瀹炵幇鎻愪緵浜嗗彲鑳姐?/P>
銆銆Spring妗嗘灦浣跨敤浜嗗姩鎬佷唬鐞嗗疄鐜扮殑AOP錛屾鏄氳繃鍔ㄦ佷唬鐞嗘満鍒舵嫤鎴簡澶栫晫瀵笲ean Factory綆$悊涓嬬殑瀵硅薄鐨勮皟鐢ㄣ傚涓嬪浘錛?/P>
銆銆浠ヤ笂鍙槸澶т綋瑙f瀯浜哠pring鐨勬灦鏋勶紝Spring妗嗘灦鍦ㄨ繖涓灦鏋勪笅錛岃繕欏哄甫浜嗗緢澶氬叾瀹冨姛鑳斤紝濡俉eb MVC銆?DAO JDBC銆?DAO ORM 銆佷互鍙妑emote錛屽悗鑰呯被浼兼垜璁捐鐨凟JB鏂規硶璋冪敤妗嗘灦銆?/P>
銆銆鎬諱箣錛孲pring紜疄鏄疘oc鍜孉OP鐨勫畬緹庡簲鐢紝Ioc鐢ㄦ潵瑁呰澆JavaBeans錛屽垱寤鴻繖浜涘璞★紱AOP鐢ㄦ潵鎷︽埅榪欎簺瀵硅薄鐨勪嬌鐢紝榪欐墠鏄鏋惰璁$殑蹇呯劧緇忓吀鏂瑰紡銆?/P>
ZT:
http://www.zahui.com/html/6/40477.htm
java浠g爜: |
public interface Person { public int getAge() throws Throwable; public String getName() throws Throwable; } |
java浠g爜: |
public class PersonServer implements Person { int age; String name; public PersonServer(String name, int age) { this.age = age; this.name = name; } public int getAge() { return age; } public String getName() { return name; } } |
java浠g爜: |
import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.net.Socket; public class Person_Stub implements Person { Socket socket; public Person_Stub() throws Throwable { // connect to skeleton socket = new Socket("computer_name", 9000); } public int getAge() throws Throwable { // pass method name to skeleton ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream()); outStream.writeObject("age"); outStream.flush(); ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream()); return inStream.readInt(); } public String getName() throws Throwable { // pass method name to skeleton ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream()); outStream.writeObject("name"); outStream.flush(); ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream()); return (String)inStream.readObject(); } } |
java浠g爜: |
import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.net.Socket; import java.net.ServerSocket; public class Person_Skeleton extends Thread { PersonServer myServer; public Person_Skeleton(PersonServer server) { // get reference of object server this.myServer = server; } public void run() { try { // new socket at port 9000 ServerSocket serverSocket = new ServerSocket(9000); // accept stub's request Socket socket = serverSocket.accept(); while (socket != null) { // get stub's request ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream()); String method = (String)inStream.readObject(); // check method name if (method.equals("age")) { // execute object server's business method int age = myServer.getAge(); ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream()); // return result to stub outStream.writeInt(age); outStream.flush(); } if(method.equals("name")) { // execute object server's business method String name = myServer.getName(); ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream()); // return result to stub outStream.writeObject(name); outStream.flush(); } } } catch(Throwable t) { t.printStackTrace(); System.exit(0); } } public static void main(String args []) { // new object server PersonServer person = new PersonServer("Richard", 34); Person_Skeleton skel = new Person_Skeleton(person); skel.start(); } } |
java浠g爜: |
public class PersonClient { public static void main(String [] args) { try { Person person = new Person_Stub(); int age = person.getAge(); String name = person.getName(); System.out.println(name + " is " + age + " years old"); } catch(Throwable t) { t.printStackTrace(); } } } |
java浠g爜: |
try { InitialContext ctx = new InitialContext(); //絎竴姝?/SPAN> UserServiceHome home = (UserServiceHome) PortableRemoteObject.narrow( ctx.lookup(JNDIString), UserServiceHome.class); //home: _UserServiceHome_Stub System.out.println(home.toString()); //絎簩姝?/SPAN> UserService object = home.create(); //ojbect: _UserService_Stub System.out.println(object.toString()); //絎笁姝?/SPAN> int userId = 1; UserInfo ui = object.getUserInfo(userId); } |
java浠g爜: |
UserServiceHome home; UserService obj = home.create(); |
java浠g爜: |
org.omg.CORBA.portable.OutputStream out = _request("create", true); in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out); |
java浠g爜: |
_EJSRemoteStatelessUserServiceHome_a940aa04_Tie._invoke() { ...... switch (method.length()) { case 6: if (method.equals("create")) { return create(in, reply); } ...... } } |
java浠g爜: |
_EJSRemoteStatelessUserServiceHome_a940aa04_Tie.create() { EJSRemoteStatelessUserServiceHome_a940aa04 target = null; result = target.create(); org.omg.CORBA.portable.OutputStream out = reply.createReply(); Util.writeRemoteObject(out,result); return out; } |
java浠g爜: |
EJSRemoteStatelessUserServiceHome_a940aa04.create() { UserService _EJS_result; _EJS_result = EJSStatelessUserServiceHomeBean_a940aa04.create(); } |
java浠g爜: |
UserService result = super.createWrapper(new BeanId(this, null)); |
java浠g爜: |
UserService object; object.getUserInfo(userId); |
java浠g爜: |
org.omg.CORBA.portable.OutputStream out = _request("getUserInfo", true); out.write_long(arg0); in = (org.omg.CORBA_2_3.portable.InputStream)_invoke(out); |
java浠g爜: |
_EJSRemoteStatelessUserService_a940aa04_Tie._invoke() { switch (method.charAt(5)) { case 83: if (method.equals("getUserInfo")) { return getUserInfo(in, reply); } ...... } } _EJSRemoteStatelessUserService_a940aa04_Tie.getUserInfo() { EJSRemoteStatelessUserService_a940aa04 target = null; int arg0 = in.read_long(); UserDTO result = target.getUserInfo(arg0); org.omg.CORBA_2_3.portable.OutputStream out = reply.createReply(); out.write_value(result,UserDTO.class); return out; } |
java浠g爜: |
EJSRemoteStatelessUserService_a940aa04.getUserInfo() { UserServiceBean _EJS_beanRef = container.preInvoke(this, 0, _EJS_s); _EJS_result = _EJS_beanRef.getUserInfo(id); } |