浣滆咃細Sunil Patil
緲昏瘧錛?a target="_new">loryliu
鐗堟潈澹版槑錛氬彲浠ヤ換鎰忚漿杞斤紝杞澆鏃惰鍔″繀浠ヨ秴閾炬帴褰㈠紡鏍囨槑鏂囩珷鍘熷鍑哄鍜屼綔鑰呬俊鎭強鏈0鏄?br>浣滆?
Sunil Patil;loryliu
鍘熸枃鍦板潃:
http://www.onjava.com/pub/a/onjava/2004/11/10/ExtendingStruts.html
涓枃鍦板潃:
http://www.matrix.org.cn/resource/article/43/43857_Struts.html
鍏抽敭璇嶏細 extending Struts
綆浠?/span>
鎴?
瑙佽繃璁稿欏圭洰寮鍙戣呭疄鐜拌嚜宸變笓鏈夌殑MVC妗嗘灦銆傝繖浜涘紑鍙戣呭茍涓嶆槸鍥犱負鎯沖疄鐜頒笉鍚屼簬Struts鐨勬煇浜涘姛鑳斤紝鑰屾槸榪樻病鏈夋剰璇嗗埌鎬庝箞鍘繪墿灞昐truts銆傞氳繃
寮鍙戣嚜宸辯殑MVC妗嗘灦錛屼綘鍙互鎺屾帶鍏ㄥ眬錛屼絾鍚屾椂榪欎篃鎰忓懗鐫浣犲繀欏諱粯鍑哄緢澶х殑浠d環錛涘湪欏圭洰璁″垝寰堢揣鐨勬儏鍐典笅涔熻鏍規湰灝變笉鍙兘瀹炵幇銆?br>
Struts涓嶄絾鍔熻兘寮哄ぇ涔熸槗浜庢墿灞曘備綘鍙互閫氳繃涓夌鏂瑰紡鏉ユ墿灞昐truts:
1.PlugIn錛氬湪搴旂敤鍚姩鎴栧叧闂椂欏繪墽琛屾煇涓氬姟閫昏緫錛屽垱寤轟綘鑷繁鐨凱lugIn綾?br>
2.RequestProcessor錛氬湪璇鋒眰澶勭悊闃舵涓涓壒瀹氱偣嬈叉墽琛屾煇涓氬姟閫昏緫錛屽垱寤轟綘鑷繁鐨凴equestProcessor銆備緥濡傦細浣犳兂緇ф壙RequestProcessor鏉ユ鏌ョ敤鎴風櫥褰曞強鍦ㄦ墽琛屾瘡涓姹傛椂浠栨槸鍚︽湁鏉冮檺鎵ц鏌愪釜鍔ㄤ綔銆?br>
3.ActionServlet錛氬湪搴旂敤鍚姩鎴栧叧闂垨鍦ㄨ姹傚鐞嗛樁孌墊鎵ц鏌愪笟鍔¢昏緫錛岀戶鎵緼ctionServlet綾匯備絾鏄繀欏諱笖鍙兘鍦≒ligIn鍜孯equestProcessor閮戒笉鑳芥弧瓚充綘鐨勯渶姹傛椂鍊欑敤銆?br>
鏈枃浼氬垪涓句竴涓畝鍗曠殑Struts搴旂敤鏉ョず鑼冨浣曚嬌鐢ㄤ互涓婁笁縐嶆柟寮忔墿灞昐truts銆傚湪鏈枃鏈熬璧勬簮鍖烘湁姣忕鏂瑰紡鐨勫彲涓嬭澆鏍蜂緥婧愪唬鐮併係truts Validation 妗嗘灦鍜?Tiles 妗嗘灦鏄渶鎴愬姛涓や釜鐨凷truts鎵╁睍渚嬪瓙銆?br>
鎴戞槸鍋囪璇昏呭凡緇忕啛鎮塖truts妗嗘灦騫剁煡閬撴庢牱浣跨敤瀹冨垱寤虹畝鍗曠殑搴旂敤銆傚鎯充簡瑙f洿澶氭湁鍏砈truts鐨勮祫鏂欒鍙傝璧勬簮鍖恒?br>
PlugIn
鏍規嵁Struts鏂囨。錛屸淧lugIn鏄竴涓』鍦ㄥ簲鐢ㄥ惎鍔ㄥ拰鍏抽棴鏃墮渶琚氱煡鐨勬ā鍧楀畾鍒惰祫婧愭垨鏈嶅姟閰嶇疆鍖呪濄傝繖灝辨槸璇達紝浣犲彲浠ュ垱寤轟竴涓被錛屽畠瀹炵幇PlugIn鐨勬帴鍙d互渚垮湪搴旂敤鍚姩鍜屽叧闂椂鍋氫綘鎯寵鐨勪簨銆?br>
鍋?
濡傚垱寤轟簡涓涓獁eb搴旂敤錛屽叾涓嬌鐢℉ibernate鍋氫負鎸佷箙鍖栨満鍒訛紱褰撳簲鐢ㄤ竴鍚姩錛屽氨闇鍒濆鍖朒inernate錛岃繖鏍峰湪web搴旂敤鎺ユ敹鍒扮涓涓姹?
鏃訛紝Hibernate宸茶閰嶇疆瀹屾瘯騫跺緟鍛姐傚悓鏃跺湪搴旂敤鍏抽棴鏃惰鍏抽棴Hibernate銆傝窡鐫浠ヤ笅涓ゆ鍙互瀹炵幇Hibernate PlugIn鐨勯渶姹傘?br>
1.鍒涘緩涓涓疄鐜癙lugIn鎺ュ彛鐨勭被錛屽涓嬶細
public class HibernatePlugIn implements PlugIn{
private String configFile;
// This method will be called at application shutdown time
public void destroy() {
System.out.println("Entering HibernatePlugIn.destroy()");
//Put hibernate cleanup code here
System.out.println("Exiting HibernatePlugIn.destroy()");
}
//This method will be called at application startup time
public void init(ActionServlet actionServlet, ModuleConfig config)
throws ServletException {
System.out.println("Entering HibernatePlugIn.init()");
System.out.println("Value of init parameter " +
getConfigFile());
System.out.println("Exiting HibernatePlugIn.init()");
}
public String getConfigFile() {
return name;
}
public void setConfigFile(String string) {
configFile = string;
}
}
瀹炵幇PlugIn鎺ュ彛鐨勭被蹇呴』鏄疄鐜頒互涓嬩袱涓柟娉曪細
init()
鍜宒estroy().銆傚湪搴旂敤鍚姩鏃秈nit()琚皟鐢紝鍏抽棴destroy()琚皟鐢ㄣ係truts鍏佽浣犱紶鍏ュ垵濮嬪弬鏁扮粰浣犵殑PlugIn綾伙紱涓轟簡浼?
鍏ュ弬鏁頒綘蹇呴』鍦≒lugIn綾婚噷涓烘瘡涓弬鏁板垱寤轟竴涓被浼糐avaBean褰㈠紡鐨剆etter鏂規硶銆傚湪HibernatePlugIn綾婚噷錛屾浼犲叆
configFile鐨勫悕瀛楄屼笉鏄湪搴旂敤閲屽皢瀹冪‖緙栫爜榪涘幓
2.鍦╯truts-condig.xml閲岄潰鍔犲叆浠ヤ笅鍑犺鍛婄煡Struts榪欎釜鏂扮殑PlugIn
<struts-config>
...
<!-- Message Resources -->
<message-resources parameter=
"sample1.resources.ApplicationResources"/>
<!-- Declare your plugins -->
<plug-in className="com.sample.util.HibernatePlugIn">
<set-property property="configFile"
value="/hibernate.cfg.xml"/>
</plug-in>
</struts-config>
ClassName
灞炴ф槸瀹炵幇PlugIn鎺ュ彛綾葷殑鍏ㄥ悕銆備負姣忎竴涓垵濮嬪寲浼犲叆PlugIn綾葷殑鍒濆鍖栧弬鏁板鍔犱竴涓?lt;set-property>鍏冪礌銆傚湪榪欎釜渚嬪瓙
閲岋紝浼犲叆config鏂囨。鐨勫悕縐幫紝鎵浠ュ鍔犱簡涓涓猚onfig鏂囨。璺緞鐨?lt;set-property>鍏冪礌銆?br>
Tiles鍜孷alidator妗嗘灦閮芥槸鍒╃敤PlugIn緇欏垵濮嬪寲璇誨叆閰嶇疆鏂囦歡銆傚彟澶栦袱涓綘榪樺彲浠ュ湪PlugIn綾婚噷鍋氱殑浜嬫儏鏄細
鍋囧搴旂敤渚濊禆浜庢煇閰嶇疆鏂囦歡錛岄偅涔堝彲浠ュ湪PlugIn綾婚噷媯鏌ュ叾鍙敤鎬э紝鍋囧閰嶇疆鏂囦歡涓嶅彲鐢ㄥ垯鎶涘嚭ServletException銆傝繖灝嗗鑷碅ctionServlet涓嶅彲鐢ㄣ?br>
PlugIn鎺ュ彛鐨刬nit()鏂規硶鏄綘鏀瑰彉ModuleConfig鏂規硶鐨勬渶鍚庢満浼氾紝ModuleConfig鏂規硶鏄弿榪板熀浜嶴truts妯″瀷闈欐侀厤緗俊鎭殑闆嗗悎銆備竴鏃lugIn琚鐞嗗畬姣曪紝Struts灝變細灝哅oduleCOnfig鍐葷粨璧鋒潵銆?br>
璇鋒眰鏄浣曡澶勭悊鐨?/span>
ActionServlet
鏄疭truts妗嗘灦閲屽敮涓涓涓猄ervlet錛屽畠璐熻矗澶勭悊鎵鏈夎姹傘傚畠鏃犺浣曟椂鏀跺埌涓涓姹傦紝閮戒細棣栧厛璇曠潃涓虹幇鏈夎姹傛壘鍒頒竴涓瓙搴旂敤銆備竴鏃﹀瓙搴旂敤琚壘鍒幫紝
瀹冧細涓哄叾鐢熸垚涓涓猂equestProcessor瀵硅薄錛屽茍璋冪敤浼犲叆HttpServletRequest鍜孒ttpServletResponse涓哄弬
鏁扮殑process()鏂規硶銆?br>
澶ч儴鍒嗚澶勭悊閮芥槸鍦≧equestProcessor.process()鍙戠敓鐨勩侾rocess()鏂規硶
鏄互妯℃澘鏂規硶錛圱emplate
Method錛夌殑璁捐妯″紡鏉ュ疄鐜扮殑錛屽叾涓湁瀹屾垚request澶勭悊鐨勬瘡涓楠ょ殑鏂規硶錛涙墍鏈夎繖浜涙柟娉曢兘浠巔rocess()鏂規硶欏哄簭璋冪敤銆備緥濡傦紝瀵繪壘褰撳墠璇?
姹傜殑ActionForm綾誨拰媯鏌ュ綋鍓嶇敤鎴鋒槸鍚︽湁鏉冮檺鎵цaction
mapping閮芥湁鍑犱釜鍗曠嫭鐨勬柟娉曘傝繖緇欐垜浠彁渚涗簡鏋佸ぇ鐨勫脊鎬х┖闂淬係truts鐨凴equestProcessor瀵規瘡涓姹傚鐞嗘楠ら兘鎻愪緵浜嗛粯璁ょ殑瀹?
鐜版柟娉曘傝繖鎰忓懗鐫錛屼綘鍙互閲嶅啓浣犳劅鍏磋叮鐨勬柟娉曪紝鑰屽叾浣欏墿涓嬬殑淇濈暀榛樿瀹炵幇銆備緥濡傦紝Struts榛樿璋冪敤request.isUserInRole()媯鏌?
鐢ㄦ埛鏄惁鏈夋潈闄愭墽琛屽綋鍓嶇殑ActionMapping錛屼絾濡傛灉浣犻渶瑕佷粠鏁版嵁搴撲腑鏌ユ壘錛岄偅涔堜綘瑕佸仛鐨勫氨鏄噸鍐檖rocessRoles()鏂規硶錛屽茍鏍規嵁鐢ㄦ埛
瑙掕壊榪斿洖true 鎴?false銆?br>
棣栧厛鎴戜滑鐪嬩竴涓媝rocess()鏂規硶鐨勯粯璁ゅ疄鐜版柟寮忥紝鐒跺悗鎴戝皢瑙i噴RequestProcessor綾婚噷鐨勬瘡涓粯璁ょ殑鏂規硶錛屼互渚夸綘鍐沖畾瑕佷慨鏀硅姹傚鐞嗙殑鍝竴閮ㄥ垎銆?br>
public void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// Wrap multipart requests with a special wrapper
request = processMultipart(request);
// Identify the path component we will
// use to select a mapping
String path = processPath(request, response);
if (path == null) {
return;
}
if (log.isDebugEnabled()) {
log.debug("Processing a '" + request.getMethod() +
"' for path '" + path + "'");
}
// Select a Locale for the current user if requested
processLocale(request, response);
// Set the content type and no-caching headers
// if requested
processContent(request, response);
processNoCache(request, response);
// General purpose preprocessing hook
if (!processPreprocess(request, response)) {
return;
}
// Identify the mapping for this request
ActionMapping mapping =
processMapping(request, response, path);
if (mapping == null) {
return;
}
// Check for any role required to perform this action
if (!processRoles(request, response, mapping)) {
return;
}
// Process any ActionForm bean related to this request
ActionForm form =
processActionForm(request, response, mapping);
processPopulate(request, response, form, mapping);
if (!processValidate(request, response, form, mapping)) {
return;
}
// Process a forward or include specified by this mapping
if (!processForward(request, response, mapping)) {
return;
}
if (!processInclude(request, response, mapping)) {
return;
}
// Create or acquire the Action instance to
// process this request
Action action =
processActionCreate(request, response, mapping);
if (action == null) {
return;
}
// Call the Action instance itself
ActionForward forward =
processActionPerform(request, response,
action, form, mapping);
// Process the returned ActionForward instance
processForwardConfig(request, response, forward);
}
1銆乸rocessMultipart(): 鍦?
榪欎釜鏂規硶涓紝Struts璇誨彇request浠ユ壘鍑篶ontentType鏄惁涓簃ultipart/form-data銆傚亣濡傛槸錛屽垯瑙f瀽騫跺皢鍏舵墦鍖呮垚涓
涓疄鐜癏ttpServletRequest鐨勫寘銆傚綋浣犳垚鐢熶竴涓斁緗暟鎹殑HTML
FORM鏃訛紝request鐨刢ontentType榛樿鏄痑pplication/x-www-form-urlencoded銆備絾鏄鏋滀綘鐨刦orm
鐨刬nput綾誨瀷鏄疐ILE-type鍏佽鐢ㄦ埛涓婅澆鏂囦歡錛岄偅涔堜綘蹇呴』鎶奻orm鐨刢ontentType鏀逛負multipart/form-data銆傚
榪欐牱鍋氾紝浣犳案榪滀笉鑳介氳繃HttpServletRequest鐨刧etParameter()鏉ヨ鍙栫敤鎴鋒彁浜ょ殑form鍊鹼紱浣犲繀欏諱互
InputStream鐨勫艦寮忚鍙杛equest錛岀劧鍚庤В鏋愬畠寰楀埌鍊箋?br>
2銆乸rocessPath(): 鍦ㄨ繖涓柟娉曚腑錛孲truts灝嗚鍙杛equest鐨刄RI浠ュ垽鏂敤鏉ュ緱鍒癆ctionMapping鍏冪礌鐨勮礬寰勩?br>
3銆乸rocessLocale():
鍦ㄨ繖涓柟娉曚腑錛孲truts灝嗗緱鍒板綋鍓峳equest鐨凩ocale錛汱ocale鍋囧琚厤緗紝灝嗕綔涓?
org.apache.struts.action.LOCALE灞炴х殑鍊艱瀛樺叆HttpSession銆傝繖涓柟娉曠殑闄勪綔鐢ㄦ槸HttpSession浼氳
鍒涘緩銆傚亣濡備綘涓嶆兂姝や簨鍙戠敓錛屽彲灝嗗湪struts-config.xml
鏂囦歡閲孋ontrollerConfig鐨刲ocal灞炴ц緗負false,濡備笅錛?br><controller>
<set-property property="locale" value="false"/>
</controller>
4銆乸rocessContent()錛?/b>閫氳繃璋冪敤response.setContentType()璁劇疆response鐨刢ontentType銆傝繖涓柟娉曢鍏堜細璇曠潃鐨勫緱鍒伴厤緗湪struts-config.xml閲岀殑contentType銆傞粯璁や負text/html錛岄噸鍐欐柟娉曞涓嬶細
<controller>
<set-property property="contentType" value="text/plain"/>
</controller>
5銆乸rocessNoCache()錛?/b>Struts灝嗕負姣忎釜response鐨勮緗互涓嬩笁涓猦eader錛屽亣濡傚凡鍦╯truts 鐨刢onfig.xml灝嗛厤緗負no-cache銆?br>response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 1);
鍋囧浣犳兂璁劇疆涓簄o-cache header錛屽湪struts-config.xml涓姞濡備互涓嬪嚑琛?br><controller>
<set-property property="noCache" value="true"/>
</controller>
6銆乸rocessPreprocess()錛?/b>榪欐槸涓涓竴鑸剰涔夌殑棰勫鐞唄ook錛屽叾鍙瀛愮被閲嶅啓銆傚湪RequestProcessor閲岀殑瀹炵幇浠涔堥兘娌℃湁鍋氾紝鎬繪槸榪斿洖true銆傚姝ゆ柟娉曡繑鍥瀎alse浼氫腑鏂姹傚鐞嗐?br>
7銆乸rocessMapping():榪欎釜鏂規硶浼氬埄鐢╬ath淇℃伅鎵懼埌ActionMapping瀵硅薄銆侫ctionMapping瀵硅薄鍦╯truts-config.xml file鏂囦歡閲岃〃紺轟負<action>
<action path="/newcontact" type="com.sample.NewContactAction"
name="newContactForm" scope="request">
<forward name="sucess" path="/sucessPage.do"/>
<forward name="failure" path="/failurePage.do"/>
</action>
ActionMapping鍏冪礌鍖呭惈浜嗗Action綾葷殑鍚嶇О鍙婂湪璇鋒眰涓敤鍒扮殑ActionForm鐨勪俊鎭紝鍙﹀榪樻湁閰嶇疆鍦ㄥ綋鍓岮ctionMapping鐨勯噷鐨凙ctionForwards淇℃伅銆?br>
8銆乸rocessRoles(): Struts鐨剋eb 搴旂敤瀹夊叏鎻愪緵浜嗕竴涓璇佹満鍒躲傝繖灝辨槸璇達紝涓鏃︾敤鎴風櫥褰曞埌瀹瑰櫒錛孲truts鐨刾rocessRoles()鏂規硶閫氳繃璋冪敤request.isUserInRole()鍙互媯鏌ヤ粬鏄惁鏈夋潈闄愭墽琛岀粰瀹氱殑ActionMapping銆?br> <action path="/addUser" roles="administrator"/>
鍋囧浣犳湁涓涓狝ddUserAction錛岄檺鍒跺彧鏈塧dministrator鏉冮檺鐨勭敤鎴鋒墠鑳芥柊娣誨姞鐢ㄦ埛銆備綘鎵瑕佸仛鐨勫氨鏄湪AddUserAction 鐨刟ction鍏冪礌閲屾坊鍔犱竴涓間負administrator鐨剅ole灞炴с?br>
9銆乸rocessActionForm()錛?/b>姣忎釜ActionMapping閮芥湁涓涓笌瀹冨叧鑱旂殑ActionForm綾匯俿truts鍦ㄥ鐞咥ctionMapping鏃訛紝浠栦細浠?lt;action>閲宯ame灞炴ф壘鍒扮浉鍏崇殑ActionForm綾葷殑鍊箋?br><form-bean name="newContactForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="firstName"
type="java.lang.String"/>
<form-property name="lastName"
type="java.lang.String"/>
</form-bean>
鍦ㄨ繖涓緥瀛愰噷錛岄鍏堜細媯鏌rg.apache.struts.action.DynaActionForm綾葷殑瀵硅薄鏄惁鍦╮equest 鑼冨洿鍐呫傚鏄紝鍒欎嬌鐢ㄥ畠錛屽惁鍒欏垱寤轟竴涓柊鐨勫璞″茍鍦╮equest鑼冨洿鍐呰緗畠銆?br>
10銆乸rocessPopulate():錛?/b>鍦ㄨ繖涓柟娉曢噷錛孲truts灝嗗尮閰嶇殑request parameters鍊煎~鍏ctionForm綾葷殑瀹炰緥鍙橀噺涓?br>
11銆乸rocessValidate()錛?/b>Struts灝嗚皟鐢ˋctionForm鐨剉alidate()鏂規硶銆傚亣濡倂alidate()榪斿洖ActionErrors錛孲truts灝嗙敤鎴瘋漿鍒扮敱<action>閲岀殑input灞炴ф爣紺虹殑欏甸潰銆?br>
12銆乸rocessForward() and processInclude()錛?/b>鍦ㄨ繖涓や釜鏂規硶閲岋紝Struts媯鏌?lt;action>鍏冪礌鐨刦orward鍜宨nclude灞炴х殑鍊鹼紝鍋囧鏈夐厤緗紝鍒欐妸forward鍜宨nclude 璇鋒眰鏀懼湪閰嶇疆鐨勯〉闈㈠唴銆?br><action forward="/Login.jsp" path="/loginInput"/>
<action include="/Login.jsp" path="/loginInput"/>
浣?
鍙互浠庝粬浠殑鍚嶅瓧鐪嬪嚭鍏朵笉鍚屼箣澶勩俻rocessForward()璋冪敤RequestDispatcher.forward(),錛?
processInclude()璋冪敤RequestDispatcher.include()銆傚亣濡備綘鍚屾椂閰嶇疆浜唎rward 鍜宨nclude
灞炴э紝Struts鎬諱細璋冪敤forward錛屽洜涓篺orward,鏄鍏堣澶勭悊鐨勩?br>
13銆乸rocessActionCreate()錛?/b>榪欎釜鏂規硶浠?lt;action>鐨則ype灞炴у緱鍒癆ction綾誨悕錛屽茍鍒涘緩榪斿洖瀹冪殑瀹炰緥銆傚湪榪欓噷渚嬪瓙涓璼truts灝嗗垱寤轟竴涓猚om.sample.NewContactAction綾葷殑瀹炰緥銆?br>
14銆乸rocessActionPerform()錛?/b>榪欎釜鏂規硶璋冪敤Action 綾葷殑execute()鏂規硶錛屽叾涓湁浣犲啓鍏ョ殑涓氬姟閫昏緫銆?br>
15銆乸rocessForwardConfig()錛?/b>Action綾葷殑execute()灝嗕細榪斿洖涓涓狝ctionForward綾誨瀷鐨勫璞★紝鎸囧嚭鍝竴欏甸潰灝嗗睍紺虹粰鐢ㄦ埛銆傚洜姝truts灝嗕負榪欎釜欏甸潰鍒涘緩RequestDispatchet錛岀劧鍚庡啀璋冪敤RequestDispatcher.forward()鏂規硶銆?br>
浠?
涓婂垪鍑虹殑鏂規硶瑙i噴浜哛equestProcessor鍦ㄨ姹傚鐞嗙殑姣忔榛樿瀹炵幇鍙婂悇涓楠ゆ墽琛岀殑欏哄簭銆傛濡備綘鎵瑙侊紝RequestProcessor寰堟湁
寮規э紝瀹冨厑璁鎬綘閫氳繃璁劇疆<controller>閲岀殑灞炴ф潵閰嶇疆瀹冦備緥濡傦紝鍋囧浣犵殑搴旂敤灝嗙敓鎴怷ML鍐呭鑰屼笉鏄疕TML錛屼綘鍙互閫氳繃璁劇疆
controller鐨勬煇涓睘鎬ф潵閫氱煡Struts銆?br>
鍒涘緩浣犺嚜宸辯殑RequestProcessor
浠?
浠ヤ笂鍐呭鎴戜滑宸茬粡鏄庣櫧浜哛equestProcessor鐨勯粯璁ゅ疄鐜版槸鎬庢牱宸ヤ綔鐨勶紝鐜板湪鎴戝皢閫氳繃鍒涘緩浣犺嚜宸辯殑RequestProcessor.灞曠ず涓涓?
鎬庢牱鑷畾涔塕equestProcessor鐨勪緥瀛愩備負浜嗘紨紺哄垱寤轟竴涓嚜瀹氫箟RequestProcessor錛屾垜灝嗕慨鏀逛緥瀛愬疄鐜頒互涓嬭繛涓笟鍔¢渶姹傦細
鎴戜滑瑕佸垱寤轟竴涓狢ontactImageAction綾伙紝瀹冨皢鐢熸垚images鑰屼笉鏄竴鑸殑HTMl欏甸潰
鍦ㄥ鐞嗚繖涓姹備箣鍓嶏紝灝嗛氳繃媯鏌ession閲岀殑userName灞炴ф潵紜鐢ㄦ埛鏄惁鐧誨綍銆傚亣濡傛灞炴ф病鏈夎鎵懼埌錛屽垯灝嗙敤鎴瘋漿鍒扮櫥褰曢〉闈€?br>
鍒嗕袱姝ユ潵瀹炵幇浠ヤ笂榪炰釜涓氬姟闇姹傘?br>鍒涘緩浣犺嚜宸辯殑CustomRequestProcessor綾伙紝瀹冨皢緇ф壙RequestProcessor綾伙紝濡備笅錛?br>
public class CustomRequestProcessor
extends RequestProcessor {
protected boolean processPreprocess (
HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession(false);
//If user is trying to access login page
// then don't check
if( request.getServletPath().equals("/loginInput.do")
|| request.getServletPath().equals("/login.do") )
return true;
//Check if userName attribute is there is session.
//If so, it means user has allready logged in
if( session != null &&
session.getAttribute("userName") != null)
return true;
else{
try{
//If no redirect user to login Page
request.getRequestDispatcher
("/Login.jsp").forward(request,response);
}catch(Exception ex){
}
}
return false;
}
protected void processContent(HttpServletRequest request,
HttpServletResponse response) {
//Check if user is requesting ContactImageAction
// if yes then set image/gif as content type
if( request.getServletPath().equals("/contactimage.do")){
response.setContentType("image/gif");
return;
}
super.processContent(request, response);
}
}
鍦–ustomRequestProcessor 綾葷殑processPreprocess鏂規硶閲岋紝媯鏌ession鐨剈serName灞炴э紝鍋囧娌℃湁鎵懼埌錛屽皢鐢ㄦ埛杞埌鐧誨綍欏甸潰銆?br>
瀵?
浜庝駭鐢焛mages浣滀負ContactImageAction綾葷殑杈撳嚭錛屽繀欏昏閲嶅啓processContent鏂規硶銆傞鍏堟鏌ュ叾request鏄惁璇鋒眰
/contactimage璺緞錛屽鏄垯璁劇疆contentType涓篿mage/gif錛涘惁鍒欎負text/html銆?br>
鍔犲叆浠ヤ笅鍑犺浠g爜鍒皊ruts-config.xml鏂囦歡閲岀殑<action-mapping>鍚庨潰錛屽憡鐭truts 錛孋ustomRequestProcessor搴旇琚敤浣淩equestProcessor綾?br>
<controller>
<set-property property="processorClass"
value="com.sample.util.CustomRequestProcessor"/>
</controller>
璇?
娉ㄦ剰錛屽亣濡備綘鍙槸寰堝皯鐢熸垚contentType涓嶆槸text/html杈撳嚭鐨凙ction綾伙紝閲嶅啓processContent()灝辨病鏈夐棶棰樸傚涓嶆槸
榪欑鎯呭喌錛屼綘蹇呴』鍒涘緩涓涓猄truts瀛愮郴緇熸潵澶勭悊鐢熸垚image Action鐨勮姹傚茍璁劇疆contentType涓篿mage/gif
Title妗嗘灦浣跨敤鑷繁鐨凴equestProcessor鏉ヨ楗癝truts鐢熸垚鐨勮緭鍑恒?br>
ActionServlet
鍋囧浣犱粩緇嗙爺絀禨truts web搴旂敤鐨剋eb.xml鏂囦歡錛屽畠鐪嬩笂鍘誨儚榪欐牱錛?br><web-app >
<servlet>
<servlet-name>action=</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!-- All your init-params go here-->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app >
榪?
灝辨槸璇達紝ActionServlet璐熻矗澶勭悊鎵鏈夊彂鍚慡truts鐨勮姹傘備綘鍙互鍒涘緩ActionServlet鐨勪竴涓瓙綾伙紝鍋囧浣犳兂鍦ㄥ簲鐢ㄥ惎鍔ㄥ拰鍏抽棴鏃?
鎴栨瘡嬈¤姹傛椂鍋氭煇浜涗簨鎯呫備絾鏄綘蹇呴』鍦ㄧ戶鎵緼ctionServlet綾誨墠鍒涘緩PlugIn 鎴?RequestProcessor銆傚湪Servlet
1.1鍓嶏紝Title妗嗘灦鏄熀浜庣戶鎵緼ctionServlet綾繪潵瑁呴グ涓涓敓鎴愮殑response銆備絾浠?.1寮濮嬶紝灝變嬌鐢?
TilesRequestProcessor綾匯?br>
緇撹
寮鍙戜綘鑷繁鐨凪VC妯″瀷鏄竴涓緢澶х殑鍐沖績鈥斺斾綘蹇呴』鑰冭檻寮鍙戝拰緇存姢浠g爜鐨勬椂闂村拰璧勬簮銆係truts鏄竴涓姛鑳藉己澶т笖紼沖畾鐨勬鏋訛紝浣犲彲浠ヤ慨鏀瑰畠浠ヤ嬌鍏舵弧瓚充綘澶ч儴鍒嗙殑涓氬姟闇姹傘?br>
鍙︿竴鏂歸潰錛屼篃涓嶈杞繪槗鍦板喅瀹氭墿灞昐truts銆傚亣濡備綘鍦≧equestProcessor閲屾斁鍏ヤ竴浜涗綆鏁堢巼鐨勪唬鐮侊紝榪欎簺浠g爜灝嗗湪姣忔璇鋒眰鏃舵墽琛屽茍澶уぇ鍦伴檷浣庢暣涓簲鐢ㄧ殑鏁堢巼銆傚綋鐒舵繪湁鍒涘緩浣犺嚜宸辯殑MVC妗嗘灦姣旀墿灞昐truts鏇村ソ鐨勬儏鍐點?br>
璧勬簮
涓嬭澆鏈枃婧愮爜錛歔涓嬭澆鏂囦歡]
Struts涓婚〉
"Jakarta Struts妗嗘灦浠嬬粛"
"瀛︿範Jakarta Struts 1.1"
Sunil Pail宸蹭粠浜婮2EE鍥涘勾錛岀幇浠婁笌IBM瀹為獙瀹ゅ悎浣溿?img src ="http://m.tkk7.com/juhongtao/aggbug/25994.html" width = "1" height = "1" />
]]>