锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍒嗛挓錛?~59錛?/font> 灝忔椂錛?~23錛?/font> 澶╋紙鏈堬級(jí)錛?~31錛屼絾鏄綘闇瑕佽冭檻浣犳湀鐨勫ぉ鏁幫級(jí) 鏈堬紙0~11錛?/font> 澶╋紙鏄熸湡錛夛紙1~7 1=SUN 鎴?SUN錛孧ON錛孴UE錛學(xué)ED錛孴HU錛孎RI錛孲AT錛?/font> 7.騫翠喚錛?970錛?099錛?br />
0 0 10,14,16 * * ? 姣忓ぉ涓婂崍10鐐癸紝涓嬪崍2鐐癸紝4鐐?br />
0 0/30 9-17 * * ??? 鏈濅節(jié)鏅氫簲宸ヤ綔鏃墮棿鍐呮瘡鍗婂皬鏃?br />
0 0 12 ? * WED 琛ㄧず姣忎釜鏄熸湡涓変腑鍗?2鐐?/font> 鏈変簺瀛愯〃杈懼紡鑳藉寘鍚竴浜涜寖鍥存垨鍒楄〃 渚嬪錛氬瓙琛ㄨ揪寮忥紙澶╋紙鏄熸湡錛?/strong>錛夊彲浠ヤ負(fù) “MON-FRI”錛?#8220;MON錛學(xué)ED錛孎RI”錛?#8220;MON-WED,SAT” “*”瀛楃浠h〃鎵鏈夊彲鑳界殑鍊?/font> 鍥犳錛?#8220;*”鍦ㄥ瓙琛ㄨ揪寮忥紙鏈?/strong>錛夐噷琛ㄧず姣忎釜鏈堢殑鍚箟錛?#8220;*”鍦ㄥ瓙琛ㄨ揪寮忥紙澶╋紙鏄熸湡錛?/strong>錛夎〃紺烘槦鏈熺殑姣忎竴澶?/font> ? “/”瀛楃鐢ㄦ潵鎸囧畾鏁板肩殑澧為噺 渚嬪錛氬湪瀛愯〃杈懼紡錛堝垎閽燂級(jí)閲岀殑“0/15”琛ㄧず浠庣0鍒嗛挓寮濮嬶紝姣?5鍒嗛挓 ?????? ? 鍦ㄥ瓙琛ㄨ揪寮忥紙鍒嗛挓錛夐噷鐨?#8220;3/20”琛ㄧず浠庣3鍒嗛挓寮濮嬶紝姣?0鍒嗛挓錛堝畠鍜?#8220;3錛?3錛?3”錛夌殑鍚箟涓鏍?/font> 褰?涓瓙琛ㄨ揪寮忓叾涓箣涓琚寚瀹氫簡(jiǎn)鍊間互鍚庯紝涓轟簡(jiǎn)閬垮厤鍐茬獊錛岄渶瑕佸皢鍙︿竴涓瓙琛ㄨ揪寮忕殑鍊艱涓?#8220;錛?#8221; ? “L” 瀛楃浠呰鐢ㄤ簬澶╋紙鏈堬級(jí)鍜屽ぉ錛堟槦鏈燂級(jí)涓や釜瀛愯〃杈懼紡錛屽畠鏄崟璇?#8220;last”鐨勭緝鍐?/font> 浣嗘槸瀹冨湪涓や釜瀛愯〃杈懼紡閲岀殑鍚箟鏄笉鍚岀殑銆?/font> 鍦ㄥぉ錛堟湀錛夊瓙琛ㄨ揪寮忎腑錛?#8220;L”琛ㄧず涓涓湀鐨勬渶鍚庝竴澶?/font> 鍦ㄥぉ錛堟槦鏈燂級(jí)鑷〃杈懼紡涓紝“L”琛ㄧず涓涓槦鏈熺殑鏈鍚庝竴澶╋紝涔熷氨鏄疭AT 濡傛灉鍦?#8220;L”鍓嶆湁鍏蜂綋鐨勫唴瀹癸紝瀹冨氨鍏鋒湁鍏朵粬鐨勫惈涔変簡(jiǎn) 渚嬪錛?#8220;6L”琛ㄧず榪欎釜鏈堢殑鍊掓暟絎紪澶╋紝“錛︼疾錛╋棘”琛ㄧず榪欎釜鏈堢殑鏈涓涓槦鏈熶簲 娉ㄦ剰錛氬湪浣跨敤“L”鍙傛暟鏃訛紝涓嶈鎸囧畾鍒楄〃鎴栬寖鍥達(dá)紝鍥犱負(fù)榪欎細(xì)瀵艱嚧闂 瀹冩湁涓ょ閰嶇疆鏂瑰紡OpenSessionInViewInterceptor鍜?span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">OpenSessionInViewFilter(鍏蜂綋鍙傜湅SpringSide)鎸夐『搴忎緷嬈′負(fù)
縐掞紙0~59錛?/font>
鍏朵腑姣忎釜鍏冪礌鍙互鏄竴涓?濡?),涓涓繛緇尯闂?9-12),涓涓棿闅旀椂闂?8-18/4)(/琛ㄧず姣忛殧4灝忔椂),涓涓垪琛?1,3,5),閫氶厤絎︺傜敱浜?鏈堜喚涓殑鏃ユ湡"鍜?鏄熸湡涓殑鏃ユ湡"榪欎袱涓厓绱犱簰鏂ョ殑,蹇呴』瑕佸鍏朵腑涓涓緗?.
“錛?#8221;瀛楃浠呰鐢ㄤ簬澶╋紙鏈堬級(jí)鍜屽ぉ錛堟槦鏈燂級(jí)涓や釜瀛愯〃杈懼紡錛岃〃紺轟笉鎸囧畾鍊?/font>
]]>
]]>
Open Session In View鍦?/span>request鎶?/span>session緇戝畾鍒板綋鍓?/span>thread鏈熼棿涓鐩翠繚鎸?/span>hibernate session鍦?/span>open鐘舵侊紝浣?/span>session鍦?/span>request鐨勬暣涓湡闂撮兘鍙互浣跨敤錛屽鍦?/span>View灞傞噷PO涔熷彲浠?/span>lazy loading鏁版嵁錛屽 ${ company.employees }銆傚綋View 灞傞昏緫瀹屾垚鍚庯紝鎵嶄細(xì)閫氳繃Filter鐨?/span>doFilter鏂規(guī)硶鎴?/span>Interceptor鐨?/span>postHandle鏂規(guī)硶鑷姩鍏抽棴session銆?/span>
OpenSessionInViewInterceptor閰嶇疆
OpenSessionInViewFilter閰嶇疆
寰堝浜哄湪浣跨敤OpenSessionInView榪囩▼涓彁鍙?qiáng)涓涓敊璇細(xì)
鐪嬬湅OpenSessionInViewFilter閲岀殑opensession鏂規(guī)硶
鍙互鐪嬪埌OpenSessionInViewFilter鍦╣etSession鐨勬椂鍊?浼?xì)鎶婅幏鍙栧洖鏉ョ殑session鐨刦lush mode 璁句負(fù)FlushMode.NEVER銆傜劧鍚庢妸璇essionFactory緇戝畾鍒癟ransactionSynchronizationManager錛屼嬌request鐨勬暣涓繃紼嬮兘浣跨敤鍚屼竴涓猻ession錛屽湪璇鋒眰榪囧悗鍐嶆帴闄よsessionFactory鐨勭粦瀹氾紝鏈鍚?span class="me1">closeSessionIfNecessary鏍規(guī)嵁璇ession鏄惁宸插拰transaction緇戝畾鏉ュ喅瀹氭槸鍚﹀叧闂璼ession銆傚湪榪欎釜榪囩▼涓紝鑻ibernateTemplate 鍙戠幇鑷綋鍓峴ession鏈変笉鏄痳eadOnly鐨則ransaction錛屽氨浼?xì)鑾峰彇鍒癋lushMode.AUTO Session錛屼嬌鏂規(guī)硶鎷ユ湁鍐欐潈闄愩?/p>
涔熷嵆鏄紝濡傛灉鏈変笉鏄痳eadOnly鐨則ransaction灝卞彲浠ョ敱Flush.NEVER杞負(fù)Flush.AUTO,鎷ユ湁insert,update,delete鎿嶄綔鏉冮檺錛屽鏋滄病鏈塼ransaction錛屽茍涓旀病鏈夊彟澶栦漢涓哄湴璁緁lush model鐨勮瘽錛屽垯doFilter鐨勬暣涓繃紼嬮兘鏄疐lush.NEVER銆傛墍浠ュ彈transaction淇濇姢鐨勬柟娉曟湁鍐欐潈闄愶紝娌″彈淇濇姢鐨勫垯娌℃湁銆?/p>
閲囩敤spring鐨勪簨鍔″0鏄?浣挎柟娉曞彈transaction鎺у埗
瀵逛簬涓婁緥錛屽垯浠ave,add,update,remove寮澶寸殑鏂規(guī)硶鎷ユ湁鍙啓鐨勪簨鍔★紝濡傛灉褰撳墠鏈夋煇涓柟娉曪紝濡傚懡鍚嶄負(fù)importExcel()錛屽垯鍥犳病鏈塼ransaction鑰屾病鏈夊啓鏉冮檺錛岃繖鏃惰嫢鏂規(guī)硶鍐呮湁insert,update,delete鎿嶄綔鐨勮瘽錛屽垯闇瑕佹墜鍔ㄨ緗甪lush model涓篎lush.AUTO,濡?/p>
灝界Open Session In View鐪嬭搗鏉ヨ繕涓嶉敊錛屽叾瀹炲壇浣滅敤涓嶅皯銆傜湅鍥炰笂闈penSessionInViewFilter鐨刣oFilterInternal鏂規(guī)硶浠g爜錛岃繖涓柟娉曞疄闄呬笂鏄鐖剁被鐨刣oFilter璋冪敤鐨勶紝鍥犳錛屾垜浠彲浠ュぇ綰︿簡(jiǎn)瑙g殑OpenSessionInViewFilter璋冪敤嫻佺▼: request(璇鋒眰)->open session騫跺紑濮媡ransaction->controller->View(Jsp)->緇撴潫transaction騫禼lose session.
涓鍒囩湅璧鋒潵寰堟紜紝灝ゅ叾鏄湪鏈湴寮鍙戞祴璇曠殑鏃跺欐病鍑虹幇闂錛屼絾璇曟兂涓嬪鏋滄祦紼嬩腑鐨勬煇涓姝ヨ闃誨鐨勮瘽錛岄偅鍦ㄨ繖鏈熼棿connection灝變竴鐩磋鍗犵敤鑰屼笉閲婃斁銆傛渶鏈夊彲鑳借闃誨鐨勫氨鏄湪鍐橨sp榪欐錛屼竴鏂歸潰鍙兘鏄〉闈㈠唴瀹瑰ぇ錛宺esponse.write鐨勬椂闂撮暱錛屽彟涓鏂歸潰鍙兘鏄綉閫熸參錛屾湇鍔″櫒涓庣敤鎴烽棿浼犺緭鏃墮棿涔呫傚綋澶ч噺榪欐牱鐨勬儏鍐靛嚭鐜版椂錛屽氨鏈夎繛鎺ユ睜榪炴帴涓嶈凍錛岄犳垚欏甸潰鍋囨鐜拌薄銆?/p>
Open Session In View鏄釜鍙屽垉鍓戯紝鏀懼湪鍏綉涓婂唴瀹瑰嫻侀噺澶х殑緗戠珯璇鋒厧鐢ㄣ?/p>
hibernate open session in view 鎶涘嚭寮傚父瑙e喅鏂規(guī)硶
鍦ㄤ嬌鐢╫pen-session-in-view鐨勬椂鍊欙紝濡傛灉浣跨敤涓嶅綋錛屾湁鍙兘鎶涘嚭涓ょ寮傚父
1錛孨onUniqueObjectException
2錛屽湪閰嶅悎spring浣跨敤鐨勬椂鍊欎細(xì)鍙兘浼?xì)鎶涘嚭org.springframework.dao.InvalidDataAccessApiUsageException
鍏堣1錛岃繖涓紓甯哥殑鎶涘嚭鍘熷洜鍜岃В鍐沖姙娉曡榪欓噷錛?br />
javaeye涓婃湁浜?jiǎn)寰堝ソ鐨勪簨渚?http://www.javaeye.com/topic/11581
瑙e喅鍔炴硶鍙互鐢╩erge錛屼篃鍙互鍒殑鍔炴硶銆?br />
鍑虹幇鐨勫師鍥狅紝鍙互鍙傝冧竴涓嬫垜鍓嶈竟鐨勬枃绔犱腑灝唌erge鍜寀pdate鐨勫尯鍒殑鍐呭銆?br />
http://m.tkk7.com/dreamstone/archive/2007/07/29/133071.html
2鐨勮В鍐沖姙娉曪細(xì)鍦ㄨ繖閲?br />
springside鐨勪竴綃囨枃绔犲仛浜?jiǎn)璇l嗚鏄?br />
http://calvin.blog.javascud.org/post/46.htm
濂戒簡(jiǎn)錛岀幇鍦ㄩ棶棰樿В鍐充簡(jiǎn)錛屼絾鍏充簬open-session-in-view鐨勪嬌鐢ㄨ繕鏈変竴浜涙帰璁紝鏄惁搴旇浣跨敤錛屼嬌鐢ㄧ殑濂藉涓庡潖澶勩?br />
瑙佽繖涓ょ瘒jdon涓婄殑鏂囩珷:
http://www.jdon.com/jivejdon/thread/22374.html
http://www.jdon.com/jivejdon/thread/28955.html
銆涓句緥錛氬亣璁炬湁鍦ㄤ竴涓簲鐢ㄧ郴緇熶腑錛屾湁涓涓叡浜殑鏁版嵁蹇呴』琚茍鍙戝悓鏃惰闂紝棣栧厛錛屽皢榪欎釜鏁版嵁灝佽鍦ㄦ暟鎹璞′腑錛岀О涓篋ata Class錛屽悓鏃訛紝灝嗘湁澶氫釜璁塊棶綾伙紝涓撻棬鐢ㄤ簬鍦ㄥ悓涓鏃跺埢璁塊棶榪欏悓涓涓暟鎹璞°?br />
銆銆涓轟簡(jiǎn)瀹屾垚涓婅堪騫跺彂璁塊棶鍚屼竴璧勬簮鐨勫姛鑳斤紝闇瑕佸紩鍏ラ攣Lock鐨勬蹇碉紝涔熷氨鏄錛屾煇涓椂鍒伙紝褰撴湁涓涓闂被璁塊棶榪欎釜鏁版嵁瀵硅薄鏃訛紝榪欎釜鏁版嵁瀵硅薄蹇呴』涓婇攣Locked錛岀敤瀹屽悗灝辯珛鍗寵В閿乽nLocked錛屽啀渚涘叾瀹冭闂被璁塊棶銆?br />
銆銆浣跨敤浼犵粺鐨勭紪紼嬩範(fàn)鎯紝鎴戜滑浼?xì)鍒涘晦Z竴涓娊璞$被錛屾墍鏈夌殑璁塊棶綾葷戶鎵胯繖涓娊璞$埗綾伙紝濡備笅錛?br />
abstract class Worker{
銆銆abstract void locked();
銆銆abstract void accessDataObject();
銆銆abstract void unlocked();
}
銆緙虹偣錛?/font>
* accessDataObject()鏂規(guī)硶闇瑕佹湁“閿?#8221;鐘舵佷箣綾葷殑鐩稿叧浠g爜銆?br /> * Java鍙彁渚涗簡(jiǎn)鍗曠戶鎵匡紝鍥犳鍏蜂綋璁塊棶綾誨彧鑳界戶鎵胯繖涓埗綾伙紝濡傛灉鍏蜂綋璁塊棶綾昏繕瑕佺戶鎵垮叾瀹冪埗綾伙紝姣斿鍙﹀涓涓Worker鐨勭埗綾伙紝灝嗘棤娉曟柟渚垮疄鐜般?br /> * 閲嶇敤琚墦鎶樻墸錛屽叿浣撹闂被鍥犱負(fù)涔熷寘鍚?#8220;閿?#8221;鐘舵佷箣綾葷殑鐩稿叧浠g爜錛屽彧鑳借閲嶇敤鍦ㄧ浉鍏蟲湁“閿?#8221;鐨勫満鍚堬紝閲嶇敤鑼冨洿寰堢獎(jiǎng)銆?/font>
浠旂粏鐮旂┒榪欎釜搴旂敤鐨?#8220;閿?#8221;錛屽畠鍏跺疄鏈変笅鍒楃壒鎬э細(xì)
* “閿?#8221;鍔熻兘涓嶆槸鍏蜂綋璁塊棶綾葷殑棣栬鎴栦富瑕佸姛鑳斤紝璁塊棶綾諱富瑕佸姛鑳芥槸璁塊棶鏁版嵁瀵硅薄錛屼緥濡傝鍙栨暟鎹垨鏇存敼鍔ㄤ綔銆?nbsp;
“閿?#8221;琛屼負(fù)鍏跺疄鏄拰鍏蜂綋璁塊棶綾葷殑涓昏鍔熻兘鍙互鐙珛銆佸尯鍒嗗紑鏉ョ殑
“閿?#8221;鍔熻兘鍏跺疄鏄繖涓郴緇熺殑涓涓旱鍚戝垏闈紝娑夊強(qiáng)璁稿綾匯佽澶氱被鐨勬柟娉曘?nbsp;
銆鍥犳錛屼竴涓柊鐨勭▼搴忕粨鏋勫簲璇ユ槸鍏蟲敞緋葷粺鐨勭旱鍚戝垏闈紝渚嬪榪欎釜搴旂敤鐨?#8220;閿?#8221;鍔熻兘錛岃繖涓柊鐨勭▼搴忕粨鏋勫氨鏄痑spect錛堟柟闈級(jí)
銆銆鍦ㄨ繖涓簲鐢ㄤ腑錛?#8220;閿?#8221;鏂歸潰錛坅spect錛夊簲璇ユ湁浠ヤ笅鑱岃矗錛?br />
銆銆鎻愪緵涓浜涘繀澶囩殑鍔熻兘錛屽琚闂璞″疄鐜板姞閿佹垨瑙i攣鍔熻兘銆備互淇濊瘉鎵鏈夊湪淇敼鏁版嵁瀵硅薄鐨勬搷浣滀箣鍓嶈兘澶熻皟鐢╨ock()鍔犻攣錛屽湪瀹冧嬌鐢ㄥ畬鎴愬悗錛岃皟鐢╱nlock()瑙i攣銆?br />
AOP搴旂敤鑼冨洿
銆銆寰堟槑鏄撅紝AOP闈炲父閫傚悎寮鍙慗2EE瀹瑰櫒鏈嶅姟鍣紝鐩墠JBoss 4.0姝f槸浣跨敤AOP妗嗘灦榪涜寮鍙戙?br />
銆銆鍏蜂綋鍔熻兘濡備笅錛?br />
Authentication 鏉冮檺
Caching 緙撳瓨
Context passing 鍐呭浼犻?br />
Error handling 閿欒澶勭悊
Lazy loading銆鎳掑姞杞?br />
Debugging銆銆璋冭瘯
logging, tracing, profiling and monitoring銆璁板綍璺熻釜銆浼樺寲銆鏍″噯
Performance optimization銆鎬ц兘浼樺寲
Persistence銆銆鎸佷箙鍖?br />
Resource pooling銆璧勬簮姹?br />
Synchronization銆鍚屾
Transactions 浜嬪姟
AOP鏈夊繀瑕佸悧錛?br />
銆銆褰撶劧錛屼笂榪板簲鐢ㄨ寖渚嬪湪娌℃湁浣跨敤AOP鎯呭喌涓嬶紝涔熷緱鍒頒簡(jiǎn)瑙e喅錛屼緥濡侸Boss 3.XXX涔熸彁渚涗簡(jiǎn)涓婅堪搴旂敤鍔熻兘錛屼絾鏄病鏈変嬌鐢ˋOP銆?br />
銆銆浣嗘槸錛屼嬌鐢ˋOP鍙互璁╂垜浠粠涓涓洿楂樼殑鎶借薄姒傚康鏉ョ悊瑙h蔣浠剁郴緇燂紝AOP涔熻鎻愪緵涓縐嶆湁浠峰肩殑宸ュ叿銆傚彲浠ヨ繖涔堣錛氬洜涓轟嬌鐢ˋOP緇撴瀯錛岀幇鍦↗Boss 4.0鐨勬簮鐮佽姣擩Boss 3.X瀹規(guī)槗鐞嗚В澶氫簡(jiǎn)錛岃繖瀵逛簬涓涓ぇ鍨嬪鏉傜郴緇熸潵璇存槸闈炲父閲嶈鐨勩?br />
銆銆浠庡彟澶栦竴涓柟闈㈣錛屽ソ鍍忎笉鏄墍鏈夌殑浜洪兘闇瑕佸叧蹇?jī)AOP錛屽畠鍙兘鏄竴縐嶆灦鏋勮璁$殑閫夋嫨錛屽鏋滈夋嫨J2EE緋葷粺錛孉OP鍏蟲敞鐨勪笂榪伴氱敤鏂歸潰閮藉凡緇忚J2EE瀹瑰櫒瀹炵幇浜?jiǎn)锛孞2EE搴旂敤緋葷粺寮鍙戣呭彲鑳介渶瑕佹洿澶氬湴鍏蟲敞琛屼笟搴旂敤鏂歸潰aspect銆?/font>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="mappingResources">
<list>
<value>org/appfteaching/model/TArticleclass.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
</props>
</property>
</bean>
2.鍏舵,鍦╯rc鐩綍涓嬬殑ehcache.xml涓厤緗涓嬩俊鎭?濡傛灉鏄粯璁hcache.xml鍒欎細(xì)鏈?lt;cache name="sampleCache1">鍜?lt;cache name="sampleCache2>",鍘繪帀)
<cache name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="4200"
overflowToDisk="true"
/>
<!-- Sample cache named sampleCache2
This cache contains 1000 elements. Elements will always be held in memory.
They are not expired. -->
<cache name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
3.灝嗕綘瑕佺紦瀛樼殑model鍔犺繘ehcache.xml閲?/p>
<cache name="org.appfteaching.model.TArticleclass"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="4200"
overflowToDisk="true"
/>
4.鏈鍚庝竴姝?鍦═Articleclass.hbm.xml閲屽姞涓?/p>
<cache usage="read-write"/>
鍚姩Tomcat,濡傚彂鐜板涓嬮敊璇?/p>
Could not find configuration [org.hibernate.cache.UpdateTimestampsCache]; using defaults.
Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.
鍒欐槸絎簩姝ユ病鏈夊仛,鍔犱笂鍗沖彲.閰嶇疆瀹屾瘯
閰嶇疆闈炲父綆鍗曪紝鍦╳eb.xml涓鍔狅細(xì) <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> 鎴栵細(xì) <servlet> <servlet-name>context</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> |
閫氳繃浠ヤ笂閰嶇疆錛學(xué)eb瀹瑰櫒浼?xì)鑷姩鍔犺?WEB-INF/applicationContext.xml鍒濆鍖?
ApplicationContext瀹炰緥錛屽鏋滈渶瑕佹寚瀹氶厤緗枃浠朵綅緗紝鍙氳繃context-param鍔犱互鎸囧畾錛?
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>
閰嶇疆瀹屾垚涔嬪悗錛屽嵆鍙氳繃
WebApplicationContextUtils.getWebApplicationContext鏂規(guī)硶鍦╓eb搴旂敤涓幏鍙朅pplicationContext寮曠敤銆?
濡傦細(xì)ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext();
LoginAction action=(LoginAction)ctx.getBean("action");
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessagePreparator;
public class SpringMail {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"applicationContext.xml");
JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");
SpringMail springMail = new SpringMail();
//嫻嬭瘯鍙戦佸彧鏈夋枃鏈俊鎭殑綆鍗曟祴璇?br> springMail.sendTextMail(sender);
//嫻嬭瘯鍙戦佸甫闄勪歡鐨勯偖浠?br> springMail.sendMimeMessage(sender);
}
/** *//**
* 嫻嬭瘯鍙戦佸彧鏈夋枃鏈俊鎭殑綆鍗曟祴璇?br> * @param sender 閭歡鍙戦佸櫒
* @throws Exception
*/
private void sendTextMail(JavaMailSender sender) throws Exception {
SimpleMailMessage mail = new SimpleMailMessage();
mail.setTo("superman_wshm@126.com");
mail.setFrom("superman_wshm@126.com");
mail.setSubject("test by amigo");
mail.setText("spring Mail鐨勭畝鍗曟祴璇?);
sender.send(mail);
System.out.println("鎴愬姛鍙戦佹枃鏈枃浠訛紒");
}
/** *//**
* 鍙戦佸甫闄勪歡鐨勯偖浠?br> * @param sender 閭歡鍙戦佸櫒
* @throws Exception
*/
private void sendMimeMessage(final JavaMailSender sender) throws Exception {
//闄勪歡鏂囦歡闆嗗悎
final List files = new ArrayList();
MimeMessagePreparator mimeMail = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws MessagingException {
mimeMessage.setRecipient(Message.RecipientType.TO,
new InternetAddress("superman_wshm@126.com"));
mimeMessage.setFrom(new InternetAddress("superman_wshm@126.com"));
mimeMessage.setSubject("Spring鍙戦佸甫闄勪歡鐨勯偖浠?, "gb2312");
Multipart mp = new MimeMultipart();
//鍚慚ultipart娣誨姞姝f枃
MimeBodyPart content = new MimeBodyPart();
content.setText("鍐呭惈spring閭歡鍙戦佺殑渚嬪瓙錛岃鏌ユ敹!");
//鍚慚imeMessage娣誨姞錛圡ultipart浠h〃姝f枃錛?br> mp.addBodyPart(content);
files.add("com/action/SpringMail.java");
files.add("applicationContext.xml");
//鍚慚ultipart娣誨姞闄勪歡
Iterator it = files.iterator();
while(it.hasNext()) {
MimeBodyPart attachFile = new MimeBodyPart();
String filename = it.next().toString();
FileDataSource fds = new FileDataSource(filename);
attachFile.setDataHandler(new DataHandler(fds));
attachFile.setFileName(fds.getName());
mp.addBodyPart(attachFile);
}
files.clear();
//鍚慚ultipart娣誨姞MimeMessage
mimeMessage.setContent(mp);
mimeMessage.setSentDate(new Date());
}
};
//鍙戦佸甫闄勪歡鐨勯偖浠?br> sender.send(mimeMail);
System.out.println("鎴愬姛鍙戦佸甫闄勪歡閭歡!");
}
}
<beans>
Spring閰嶇疆鏂囦歡applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>smtp.126.com</value>
</property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
<property name="username">
<value>superman_wshm</value>
</property>
<property name="password">
<value>******</value>
</property>
</bean>
</beans>
鍒氭墠鍙戠幇涓bug錛屽綋闄勪歡鍚嶄負(fù)涓枃鏃訛紝浼?xì)鍑虹庮C腑鏂囦貢鐮侀棶棰橈紝瀵箂endMimeMessage鏂規(guī)硶榪涜浜?jiǎn)閮ㄥ垎淇敼锛屽涓嬪Q?br> sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
files.add("src/SpringMail.java");
files.add("src/applicationContext.xml");
files.add("src/璋㈡槦鏄?xml");
//鍚慚ultipart娣誨姞闄勪歡
Iterator it = files.iterator();
while (it.hasNext())
{
MimeBodyPart attachFile = new MimeBodyPart();
String filename = it.next().toString();
FileDataSource fds = new FileDataSource(filename);
attachFile.setDataHandler(new DataHandler(fds));
attachFile.setFileName("=?GBK?B?"+enc.encode(fds.getName().getBytes())+"?=");
mp.addBodyPart(attachFile);
}
]]>
聽聽聽聽聽聽MVC妗嗘灦濡係truts銆乄ebwork錛岄兘鍦⊿ervlet鐨勫熀紜涓婂垱寤轟簡(jiǎn)涓涓嚜宸辯殑緇濆絀洪棿錛屽湪鑷繁鐨勭┖闂撮噷瀹氫箟MVC涓栫晫鍜岃鍒欍傛棤璁鴻繖涓笘鐣屽畾涔夊緱鏄惁婕備寒錛岀▼搴忓憳閮芥湁涓涓涔?fàn)涓栫晫鐨剺q囩▼銆?/p>
聽聽聽聽聽 鑰孲pring MVC鍒欏畬鍏ㄤ繚鐣欑潃Servlet姒傚康涓殑request錛宺esponse鍜宻ession錛屽茍娌℃湁寮哄埗寤虹珛涓涓嚜宸辯殑姒傚康妯″瀷錛堝綋鐒?dòng)灱屼粬涔熸湁寰堢儌鐨凷impleFormController錛屼絾浣犲畬鍏ㄥ彲浠ユ妸瀹冭涪鍦ㄤ竴鏃佷笉綆★級(jí)錛屼篃涓嶅己鍒墮渶瑕丗ormBean鍜屼竴鍫哫ML瀹氫箟銆?/p>
聽聽聽聽聽 鍚屾椂錛屽畠閫忔槑瀹屾垚浜?jiǎn)涓嶴pring鐨勯泦鎴愶紝Multi-action鐨勬淳鍙戯紝鎻愪緵浜?jiǎn)缁戝畾request鏁版嵁鐢ㄧ殑binder絳夊熀鏈珹PI銆?/p>
聽聽聽聽聽聽鎵浠ワ紝濡傛灉鎯崇畝鍗曪紝浣跨敤Spring MVC鐨勫師濮嬪艦鎬佹槸涓涓緢濂界殑錛岀被浼間簬RoR涓瑼ctionPack鐨勬柟妗堛?/p>
聽聽聽聽聽 鎺ㄨ崘浣跨敤涓涓狢ontroller鍝嶅簲涓緇勭浉鍏沖姩浣滅殑MultiActionController銆傚悓鏃訛紝铏界劧涓鐐逛笉鍠滄FormController瀹氫箟鐨勬蹇墊ā鍨嬶紝浣嗚繕鏄笉褰卞搷鍙戞尌鎷挎潵涓諱箟錛屽湪鍏辨ф瘮杈冩槑鏄懼悗鍙扮鐞嗘ā鍧楋紝瀹氫箟MultiActionFormController錛岃嚜鍔ㄥ畬鎴愭煇浜涘叡鍚岀殑Form嫻佺▼銆?/p>
聽聽聽聽聽 浣犺繕鏄緢鍠滄WebWork?濂藉湪鎴戜滑涔熸彁渚涗簡(jiǎn)sample錛岃2.4 WebWork 銆?/p>
聽聽聽聽聽 涔熻錛屾墍鏈夌▼搴忓憳閮藉厛鏀句笅鑷繁妗嗘灦閲岀殑姒傚康妯″瀷錛岃繕鍘熷洖涓涓狫SP/Servlet紼嬪簭鍛樼殑瑙掑害錛屾濊冧竴涓狫SP/Servlet妗嗘灦闇瑕佺殑鍔熻兘銆?/p>
聽聽聽聽聽0.聽閰嶇疆鏂囦歡
聽聽聽聽聽聽聽聽 Spring鐨勯厤緗枃浠墮粯璁や負(fù)WEB-INF/xxxx-servelet.xml銆?/p>
聽聽聽聽聽聽聽聽 鍏朵腑xxx涓簑eb.xml涓璷rg.springframework.web.servlet.DispatcherServlet鐨剆ervlet-name銆?/p>
聽聽聽聽 1. 涓嶴pring闆嗘垚鍙?qiáng)IOC
聽聽聽聽聽聽聽聽聽 澶╃劧鍏紝鐢盌ispatcherServlet瀹屾垚銆?/p>
聽聽聽聽聽 2. Action鍙?qiáng)Multi-Action 鍒嗗彂
聽聽聽聽聽聽聽聽聽 Spring灝嗘寜鐓ч厤緗枃浠跺畾涔夌殑URL錛孧apping鍒板叿浣揅ontroller綾伙紝鍐嶆牴鎹甎RL閲岀殑action= xxx鎴栧叾浠栧弬鏁幫紝鍒╃敤鍙嶅皠璋冪敤Controller閲屽搴旂殑Action鏂規(guī)硶銆?/p>
聽聽聽聽聽 3. 杈撳叆鏁版嵁緇戝畾
聽聽聽聽聽聽聽聽聽 Spring鎻愪緵Binder 閫氳繃鍚嶅瓧鐨勪竴涓瀵瑰簲鍙嶅皠緇戝畾Pojo錛屼篃鍙互鐩存帴浠巖equest.getParameter()鍙栨暟鎹?/p>
聽聽聽聽聽聽聽聽聽 濡傛灉娌℃湁鍙﹀鍔犲叆妗嗘灦灝佽錛岄渶瑕佹墜宸ヨ皟鐢˙inder.
聽聽聽聽聽 4. 杈撳叆鏁版嵁楠岃瘉
聽聽聽聽聽聽聽聽聽 Sping 鎻愪緵浜?a >Validator鎺ュ彛錛岃孲pring Module榪樻暣鍚堜簡(jiǎn)Commons-Validaor 銆?/p>
聽聽聽聽聽 5. 緇撴灉鏁版嵁鏀懼洖View
聽聽聽聽聽聽聽聽聽 鏈変釜ModelAndView鐨勬蹇碉紝浠h〃浜?jiǎn)杩斿洖鐨刅iew鍚嶅強(qiáng)鏁版嵁(Model錛屼竴涓狹ap)銆傚彲浠ョ敤modelAndView.addObject()鏀懼叆鏁版嵁銆傚綋鐒?dòng)灱屼篃鍙互鐩存帴request.setAttribute()銆?/p>
聽聽聽聽聽 6. Interceptor
聽聽聽聽聽聽聽聽聽 AOP姒傚康錛屽叾瀹濻ervlet閲岄潰鏃╂湁Filter姒傚康錛屼笉榪嘔nteceptor鍙互鏇寸伒媧葷殑Mapping錛屽彟鎻愪緵postHandle鐨勬彃鍏ョ偣
聽聽聽聽聽聽聽聽聽 preHandle() handler寮宸ヤ箣鍓嶃?br />聽聽聽聽聽聽聽聽聽聽postHandle() hander寮宸ヤ箣鍚庯紝浣咲ispatchServlet榪樻病鏈夋覆鏌撻〉闈€?br />聽聽聽聽聽聽聽聽聽聽afterCompletion() 涓鍒囧畬宸ヤ箣鍚庛?br />聽聽聽聽聽聽聽聽
聽聽聽聽聽 7. Redirect錛孎orward欏甸潰鍙?qiáng)Token闃叉閲嶅鎻愪氦銆?/strong>
聽聽聽聽聽聽聽聽聽 Spring鎻愪緵 "redirect:index.jsp", "forward:index.jsp"榪欐牱鐨勭畝鍐欍?/p>
聽聽聽聽聽聽聽聽聽 Spring Simple Form鎻愪緵浜?jiǎn)闃叉閲嶅鎻愪氦鐨勬満鍒躲?/p>
聽聽聽聽聽 8. 濡傛灉鎯崇洿鎺ョ紪鍐橰esponse榪斿洖瀛楃涓? 鑰屼笉鏄繑鍥炰竴涓猇iew
聽聽聽聽聽聽聽聽聽 灝嗗嚱鏁扮殑榪斿洖綾誨瀷璁句負(fù)void錛屼嬌鐢╯s灝佽鐨?rendText(response,String text)鍑芥暟銆?/p>
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
聽聽聽聽聽聽聽 <property name="paramName">
聽聽聽聽聽聽聽聽聽聽聽 <value>method</value>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="defaultMethodName">
聽聽聽聽聽聽聽聽聽聽聽 <value>index</value>聽聽聽聽聽聽 聽 </property> </bean>
浠ヤ笂閰嶇疆灝嗘寜xxx.do?method= list 灝嗚皟鐢╟ontroller鐨刲ist()鏂規(guī)硶
涓嶈繃榪樿浜夊彇鏃╂棩鏀逛負(fù)Web2.0寮忕殑鍐欐硶./book/list.htm 瑕佷紭浜?book.do?action= list銆?/p>
鍏朵綑閰嶇疆鍜屽叾浠朣pring MVC閰嶇疆宸笉澶氾紝璇風(fēng)湅bookstore-servlet.xml錛岀暀鎰忎笅闈㈠嚑涓叧閿妭鐐?br /><bean id="exceptionResolver">
<bean id="methodNameResolver">
<bean id="viewResolver">
<bean id="urlMapping">(鐣欐剰鏈鏂扮殑urlMapping綆鍐欒娉?)
聽聽聽緇ф壙浜嶴pring鐨凪ultiActionController, 瀵瑰叾浣滀簡(jiǎn)灝戦噺鎵╁睍--涓昏鏄鏁版嵁緇戝畾鐨勬墿灞曪紝榪樺姞浜?jiǎn)涓涓猄aveMessage鍑芥暟銆?/p>
聽聽聽1.瀵規(guī)暟鎹粦瀹氱殑鎵╁睍錛?/strong>
聽聽 a.InitBinder() 鍒濆鍖朆inder錛屾敞鍐屾棩鏈熺被騫跺厑璁告暟瀛楃被涓虹┖銆?/p>
聽聽聽b.瀵笲ind and Validate鍑芥暟鐨勫啀鍖呰
聽 聽鏈潵Spring宸叉湁bind鍑芥暟瀹屾垚bind and validate, 浣嗚繖涓嚱鏁頒竴鏉ユ病鏈変嬌鐢˙indException浣滆繑鍥炲艱屾槸鎶涘嚭涓涓猄ervletException鍙ソ鑷繁鍙﹀瀹炵幇涓涓猙indObject()鍑芥暟銆?/p>
聽聽聽c.鍙﹀紼嶇◢鎵╁睍浜?jiǎn)涓浜涘嚱鏁頒嬌鍏舵洿濂界敤銆?/p>
2.SaveMessage():
濡傛灉鏄痳edirect鐨勫叧緋伙紝message淇℃伅鏀懼湪request.attribute()灝變細(xì)涓㈠け錛孲aveMessage()灝嗗叾鏀懼湪session銆?br />聽閰嶅悎messageFilter錛屽湪娓叉煋欏甸潰鍓嶏紝鎶婂畠浠巗ession鍙堢Щ鍥瀝equest銆?
聽聽Spring MVC涓殑SimpleFormController涓殑浜や簰鏈哄埗鏈夊煎緱鍙傝冪殑閮ㄥ垎錛屼絾鍏跺彧鏈変竴涓猳nSubmit鍑芥暟涓嶈兘寰堝ソ鐨勮〃杈綜RUD鐨勮涔夛紝鎵浠ュ皢涓よ呯粨鍚堟垚Multi-ActionFormController鏄瘮杈冨ソ鐨勬柟娉曘傞氳繃綰﹀畾鍛藉悕錛屽湪鍩虹被瀹炵幇l(fā)ist()錛宑reate()絳夊嚱鏁板拰榛樿嫻佺▼錛岃屽湪瀛愮被瀹炵幇onList(),onCreate()鍑芥暟銆?/p>
聽聽 鐩墠鍙槸鍒濇緇撳悎涓よ咃紝榪樻湁寰堝ぇ鐨勬敼榪涚┖闂淬?/p>
聽 聽鍙傝冧簡(jiǎn)RoR涓殑鍛藉悕銆侭aseManageController鍗蟲寜鐓ф鍛藉悕瀹氫箟鍩虹被銆?/p>