锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
if they are in different form, may be this will solved.
]]>
浣滆咃細Andrei Cioroianu
緲昏瘧錛?A href="mailto:di_feng_ro@hotmail.com">di_feng_ro@hotmail.com
鐢ㄦ埛鍙互寰堟柟渚夸嬌鐢ㄦ祻瑙堝櫒涓婁紶鏂囦歡錛屼絾鏄綋鍓嶇殑Java Web鏍囧噯錛堝servlets, JSP, and JSF錛夊茍娌℃湁鎻愪緵浠諱綍涓婁紶鐨勫姛鑳姐傚垢濂界涓夋柟妗嗘灦錛屾瘮濡?Apache Commons File Upload, Apache MyFaces, and Oracle ADF Faces錛屾彁渚涗簡綆鍗曠殑API鍜屽鎴鋒爣絳撅紝瀹炵幇浜嗚繖涓姛鑳姐傛枃绔犵殑鍓嶅崐閮ㄥ垎灝嗕粙緇嶄笂浼犵粍浠舵槸濡備綍宸ヤ綔鐨勶紝浣犲皢鐪嬪埌MyFaces and Commons File Upload 鐨勯儴鍒嗘簮鐮侊紙瀹為檯涓婏紝鍓嶈呴噰鐢ㄧ殑鏄悗鑰呯殑浠g爜錛夈備簡瑙h繖浜涙簮鐮佺殑鍐呭湪鏈哄埗灝嗕嬌鎴戜滑鏇存湁鏁堢殑浣跨敤榪欎簺妗嗘灦錛屽茍涓斿彲浠ユ牴鎹渶瑕佷慨鏀逛粬浠紒鍦ㄦ枃绔犵殑鍚庡崐閮ㄥ垎錛屼粙緇嶄簡涓涓鐢ㄦ埛閫氳繃嫻忚鍣ㄤ笂浼犳枃浠剁殑渚嬪瓙銆?BR>
鍩轟簬WEB鐨勬枃浠朵笂浼?/STRONG>
鈥滀笂浼犫濊繖涓瘝鐨勪嬌鐢ㄦ瘮杈冨箍娉涖備竴涓獁eb綆$悊鍛樺湪浠栫殑涓婚〉鍙戝竷浜嗕竴涓枃浠訛紝浠栧彲浠ヨ浠栦笂浼犱簡涓涓枃浠訛紱褰撲竴涓綉緇滃伐紼嬪笀鍒涘緩浜嗕竴涓狧TML form鍜屼竴浜涜剼鏈嬌鏅氱敤鎴峰彲浠ラ氳繃嫻忚鍣ㄤ笂浼犳枃浠訛紝浠栬浠栧疄鐜頒簡涓婁紶鐨勫姛鑳姐?/P>
榪欎袱縐嶆柟寮忎箣涓湁浜涘叡鍚岀殑鍦版柟錛屽洜涓轟竴涓獁eb綆$悊鍛樺彲浠ラ氳繃涓涓熀浜巜eb鐨勬帴鍙f潵鍙戝竷鏂囦歡錛堥〉闈紝鍥懼儚錛岃剼鏈瓑絳夛級銆傞偅浜涘厤璐規彁渚涗釜浜轟富欏電殑鍏徃錛屾瘮濡倅ahoo錛屽疄鐜頒簡鍩轟簬web鐨勬枃浠朵笂浼犲姛鑳斤紝鍥犱負瀹㈡埛闇瑕佷笂浼犻〉闈€傝繖鏍蜂換浣曚漢鍙鎺ュ叆緗戠粶錛屽氨鍙互閫氳繃嫻忚鍣ㄥ彂甯冧粬鐨勪釜浜虹珯鐐廣備絾鏄紝榪樻湁璁稿鏇村ソ鐨勬柟寮忚浣犲彂甯冧綘鐨勭綉欏靛唴瀹癸紝姣斿FTP鎴杝ecure FTP銆傚湪榪欑鎯呭喌涓嬶紝浣犲氨闇瑕佷竴涓搴旂殑搴旂敤紼嬪簭錛屾瘮濡侳TP瀹㈡埛绔紝鑰屼笉鏄祻瑙堝櫒鏉ュ彂甯冧綘鐨勭綉绔欍?BR>
榪欑瘒鏂囩珷灝嗕粠緗戠粶寮鍙戣呯殑瑙掑害鏉ヨ璁烘枃浠朵笂浼犮備竴涓熀浜巜eb鐨刴ail搴旂敤紼嬪簭錛屾瘮濡倅ahoo mail,瀹炵幇浜嗕笂浼犲姛鑳斤紝榪欐牱鐢ㄦ埛鎵嶈兘鍙戦佷俊鎭拰闄勪歡銆傚彟涓涓ソ鐨勪緥瀛愭槸涓涓猨ob緗戠珯蹇呴』璁╀綘鑳藉鍙戦佺畝鍘嗙粰鎷涜仒浜哄憳銆傚湪浣犵殑搴旂敤紼嬪簭涓紝浣犲彲浠ュ涓婁紶鐨勬枃浠朵綔浠諱綍浣犳兂鍋氱殑浜嬫儏錛屾瘮濡傛妸榪欎簺鏂囦歡鐨勫唴瀹瑰偍瀛樺埌鏁版嵁搴撲腑鎴栬呮妸浠栦滑褰撲綔闄勪歡鍙戦佸嚭鍘匯傝繖綃囨枃绔犵殑渚嬪瓙璁$畻浜嗕笂浼犳枃浠剁殑hash鍊箋傜幇鍦紝璁╂垜浠湅鐪嬪浣曞湪涓涓獁eb搴旂敤紼嬪簭涓槸瀹炵幇涓婁紶鍔熻兘銆?BR>
涓涓猦tml琛ㄥ崟鍖呭惈涓涓垨澶氫釜<input type="file"> 鍏冪礌錛岃繖涓厓绱犲皢鍦ㄩ〉闈笂鐢熸垚鏂囦歡杈撳叆妗嗭紝鐢ㄦ埛鍙互鍦ㄨ繖閲屽~鍐欐枃浠惰礬寰勩傜敤鎴風偣鍑昏緭鍏ュ瓧孌靛悗闈㈢殑嫻忚(browse)鎸夐挳鍚庯紝浼氬脊鍑轟竴涓璇濇璁╃敤鎴烽夋嫨璺緞錛?BR>
褰撶敤鎴風偣鍑昏〃鍗曠殑Sumbit鎸夐挳錛屾祻瑙堝櫒瀵硅〃鍗曟暟鎹繘琛岀紪鐮侊紝鍏朵腑鍖呮嫭鏂囦歡鐨勫唴瀹癸紝鍚嶅瓧錛岃礬寰勪互鍙婂叾浠栫殑琛ㄥ崟鍙傛暟銆傜劧鍚庯紝嫻忚鍣ㄦ妸緙栫爜榪囩殑鏁版嵁浼犻掔粰web鏈嶅姟鍣紝鏈嶅姟鍣ㄥ啀鎶婅繖浜涙暟鎹紶閫掔粰鐩稿簲鐨勯〉闈紝姣斿<form>鏍囩閲岀殑action灞炴у箋傚鏋滄槸java緗戠粶搴旂敤紼嬪簭錛宎ction灞炴у煎彲鑳芥槸涓猻ervlet鎴栬呮槸涓猨sp欏甸潰銆?/P>
鍥犱負榛樿鐨勮〃鍗曠紪鐮佸拰get鏂規硶涓嶉傚悎涓婁紶鏂囦歡錛屾墍浠ヤ竴涓寘鍚枃浠惰緭鍏ユ鐨勮〃鍗曞繀欏誨畾涔夌紪鐮佷負multipart/form-data 錛屽茍涓斿湪<form>鏍囩閲屼嬌鐢≒OST鏂規硶錛?/P>
<form enctype="multipart/form-data" method="POST" action="...">
...
<input type="file" name="...">
...
</form>
浣嗘槸錛屼簨鎯呭茍涓嶈薄鐪嬭搗鏉ラ偅涔堢畝鍗曪紝瀹炵幇浜唖ervlet and JSP 鏍囧噯鐨勫簲鐢ㄦ湇鍔″櫒騫舵病鏈夎瑕佹眰澶勭悊 multipart/form-data緙栫爜銆傛墍浠ヤ綘闇瑕佷竴涓В鏋愬櫒鏉ュ鐞嗚姹傜殑杈撳叆嫻?姣斿Apache Commons File Upload緇勪歡錛屽畠鏄釜java鍖咃紝鑳戒粠宸茬紪鐮佺殑鏁版嵁涓鍙栧嚭涓婁紶鏂囦歡鐨勫唴瀹廣傝繖涓寘鐨凙PI寰堢伒媧伙紝鍏佽浣犳妸灝忔枃浠跺瓨鍦ㄥ唴瀛橀噷鑰屽ぇ鏂囦歡鍌ㄥ瓨鍦ㄧ鐩樹笂涓涓復鏃舵枃浠跺す閲屻備綘涓嶄絾鍙互瀹氫箟澶ф枃浠跺拰灝忔枃浠剁殑鐣岄檺錛岃繕鍙互瀹氫箟涓婁紶鏂囦歡鎵鍗犵┖闂寸殑鏈澶у箋?/P>
org.apache.commons.fileupload閲屾湁涓狣iskFileUpload綾伙紝瀹冪殑parseRequest()鍑芥暟鑾峰緱涓涓狧ttpServletRequest錛岃繑鍥炰竴涓狶ist錛屽叾涓寘鍚簡org.apache.commons.fileupload.FileItem鐨勫疄渚嬨俿ervlet璇鋒眰鐨刧etInputStream()鍑芥暟榪斿洖涓涓暟鎹祦錛屽凡緙栬瘧鐨勮〃鍗曟暟鎹氨鏄粠榪欓噷璇誨彇鍑烘潵鐨勩侳ileItem寰堝鏄撹浜鴻瑙o紝鍥犱負榪欎釜鎺ュ彛鐨勫疄渚嬩笉浠呭寘鎷笂浼犳枃浠?榪樻湁鍏朵粬鐨勮姹傚弬鏁般?/P>
Commons File Upload 鍖呮彁渚涚殑API鍙互瑙f瀽鏁版嵁錛屼絾鏄痵ervlet璇鋒眰鐨刧etParameter()鍑芥暟鍜実etParameterValues()鍑芥暟鍗翠笉鑳藉伐浣溿傚洜涓鴻繖涓や釜鍑芥暟琚繍琛屽湪甯哥敤鐨勮緭鍏ユ, 澶嶉夋, 鍗曢夋寜閽? 鍜屼笅鎷夊垪琛ㄥ悗闈㈢殑鏍囧噯JSF緇勪歡璋冪敤錛屾墍浠ヨ繖涓棶棰橀渶瑕佽В鍐熾係ervlets API鎻愪緵鐨勪袱涓姛鑳?filters鍜宺equest wrappers) 鍙互瑙e喅榪欎釜闂銆備笅闈㈢殑绔犺妭鎻忚堪浜嗗湪娌℃湁鐮村潖鍘熸湁JSF緇撴瀯鐨勬儏鍐典笅錛孉pache MyFaces 濡備綍瀹炵幇浜嗕竴涓猣ilter鍔熻兘錛屼粠鑰屾坊鍔犱簡鏇村闇瑕佺殑鏀寔銆傚彟澶栵紝MyFaces鎻愪緵鐨凙PI鍙互鍒涘緩javaBean錛屽拰鐢熸垚<input type="file">鍏冪礌鐨凧SF緇勪歡鐩稿搴斻?/P>
閰嶇疆 JSF 鍜孧yFaces Extensions
鐩墠鏈涓昏鐨勫疄鐜癑SF瑙勮寖鐨勬鏋舵湁JSF Reference Implementation (RI)浠ュ強Apache鎻愪緵鐨凪yFaces銆傝櫧鐒惰繕鏈夊埆鐨勶紝浣嗚繖涓や釜鏄渶嫻佽鐨勩傚緢澶氬紑鍙戣呮洿鍊懼悜浜嶫SF RI錛屽洜涓鴻繖鏄潵鑷簬sun鐨勫畼鏂逛駭鍝併備絾MyFaces鏈変竴浜涙湁瓚g殑鎵╁睍鐨勫姛鑳斤紝姣斿涓婁紶鏂囦歡銆傚鏋滀綘鍠滄錛屼綘鍙互鍚屾椂浣跨敤MyFaces鐨勬墿灞曞姛鑳藉拰JSF RI銆備綘鍙渶瑕佹妸myfaces-extensions.jar鍜孞SF RI鐨刯ar鏂囦歡浠ュ強 commons-fileupload-1.0.jar 鏀懼湪web搴旂敤紼嬪簭鐨刉EB-INF/lib 鐩綍涓嬪嵆鍙備笅闈㈡槸浣犻渶瑕佺殑jar鏂囦歡錛?BR>
JSF 1.1 RI | jsf-api.jar jsf-impl.jar |
JSTL 1.1 RI | jstl.jar standard.jar |
MyFaces Extensions | myfaces-extensions.jar |
Apache Commons (used by JSF and MyFaces Extensions) |
commons-collections.jar commons-digester.jar commons-beanutils.jar commons-logging.jar commons-fileupload-1.0.jar |
org.apache.myfaces.component.html.util鍖呯殑MultipartRequestWrapper綾誨垱寤轟簡MyFaces鍜孋ommons File Upload榪炴帴鐨勬ˉ姊併傝繖涓被緇ф壙浜咹ttpServletRequestWrapper錛岄噸鍐欎簡getParameterMap(), getParameterNames(), getParameter(), 鍜実etParameterValues() 鍑芥暟錛屾墍浠ヤ粬浠兘姝g‘澶勭悊multipart/form-data 緙栫爜鏁版嵁銆傚彟澶栵紝MultipartRequestWrapper鎻愪緵鐨勪袱涓嚱鏁幫紝getFileItem() 鍜実etFileItems(),浣夸綘鍙互閫氳繃org.apache.commons.fileupload.FileItem 鎺ュ彛璁塊棶涓婁紶鏂囦歡銆?/P>
MyFaces鐨?ExtensionsFilter 綾誨湪org.apache.myfaces.component.html.util 鍖呴噷錛屽綋瀹冨彂鐜癿ultipart/form-data緙栫爜鐨勬椂鍊欙紝瀹冧細鍒涘緩浜?MultipartRequestWrapper 鐨勫疄渚嬨傛墍浠ヤ綘涓嶉渶鐞嗕細浠栨槸濡備綍瑙f瀽琛ㄥ崟鏁版嵁鐨勶紝浣嗘槸鐭ラ亾瀹冩槸濡備綍寮濮嬭В鏋愬浣犳兂瑕佷慨鏀逛笂浼犳枃浠剁殑澶勭悊鏂瑰紡鏄湁鐢ㄧ殑銆傚湪涓涓紶緇熺殑搴旂敤紼嬪簭涓紝浣犲彧闇瑕佸湪web.xml鎻忚堪絎︿腑閰嶇疆濂紼xtensionsFilter 錛屽畠灝辮兘鍦↗SF鐨凢acesServlet涔嬪墠鎴幏HTTP璇鋒眰錛?/P>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<servlet>
<servlet-name>FacesServlet</servlet-name>
<servlet-class>
javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<filter>
<filter-name>ExtensionsFilter</filter-name>
<filter-class>
org.apache.myfaces.component.html.util.ExtensionsFilter
</filter-class>
<init-param>
<param-name>uploadMaxFileSize</param-name>
<param-value>10m</param-value>
</init-param>
<init-param>
<param-name>uploadThresholdSize</param-name>
<param-value>100k</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExtensionsFilter</filter-name>
<servlet-name>FacesServlet</servlet-name>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
鍓嶉潰渚嬪瓙涓紝filter鐨勪袱涓弬鏁板憡璇塎yFaces鎶婂皬浜?00K鐨勬枃浠朵繚瀛樺湪鍐呭瓨涓紝鑰屽浜庡ぇ浜?0M鐨勬枃浠跺垯蹇界暐銆傚ぇ灝忓湪uploadThresholdSize鍊煎拰uploadMaxFileSize鍊間箣闂寸殑鏂囦歡鍒欎綔涓轟復鏃舵枃浠跺瓨鍦ㄧ‖鐩樹笂銆傚鏋滀綘涓婁紶寰堝ぇ鐨勬枃浠訛紝褰撳墠鐨凪yFaces鐗堟湰浼氬拷鐣ユ墍鏈夌殑琛ㄥ崟鏁版嵁錛屽氨濂借薄浣犳彁浜や簡涓涓┖琛ㄥ崟銆傚鏋滀綘鎯蟲妸涓婁紶澶辮觸鐨勬秷鎭憡璇夌敤鎴鳳紝浣犲氨寰椾慨鏀筂yFaces涓璏ultipartRequestWrapper綾葷殑婧愮爜銆傝鎴戜滑鎵懼埌鎹曡幏SizeLimitExceededException鐨勫湴鏂癸紝騫朵嬌鐢‵acesContext.getCurrentInstance().addMessage()鏉ヨ鍛婄敤鎴楓?/P>
姝e鍓嶉潰鎵璇寸殑錛孧yFaces Extensions 閲屾湁涓兘鍦↗SF欏甸潰閲屼嬌鐢ㄧ殑涓婁紶緇勪歡銆備笅闈㈢殑绔犺妭灝嗚鏄庡浣曚嬌鐢ㄣ?/P>
涓轟簡鍦╳eb欏甸潰閲屼嬌鐢↗SF鍜孧yFaces錛屼綘蹇呴』浣跨敤<%@taglib%>鎸囦護澹版槑浠栦滑鐨勬爣絳懼簱銆?/P>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%>
JSF鐨?lt;h:form>鏍囩娌℃湁method灞炴э紝鍥犱負瀹冨彧鏀寔post鏂規硶錛屼絾浠栨湁enctype灞炴э紝褰撲綘鎯充笂浼犳枃浠舵椂錛屼綘鍙互鐢ㄥ畠鏉ュ畾涔夎〃鍗曟暟鎹殑緙栫爜綾誨瀷錛?/P>
<f:view>
<h:form id="MyForm" enctype="multipart/form-data" >
...
<x:inputFileUpload id="myFileId"
value="#{myBean.myFile}"
storage="file"
required="true"/>
...
</h:form>
</f:view>
MyFaces鐨?lt;x:inputFileUpload> 鏍囩璁╀綘瀹氫箟UI緇勪歡鐨勫睘鎬э紝瀹冨皢鍦ㄥ墠鍙扮敓鎴?lt;input type="file"> 鍏冪礌銆傚寘org.apache.myfaces.custom.fileupload 鍖呭惈浜嗘帶鍒禪I緇撴瀯鐨凥tmlInputFileUpload綾伙紝瀹冪殑renderer (HtmlFileUploadRenderer), 澶勭悊鐢ㄦ埛鏍囩鐨勭被 (HtmlInputFileUploadTag), UploadedFile 鎺ュ彛, 浠ュ強鍒殑甯姪綾匯?HtmlInputFileUpload 綾?緇ф壙浜嗘爣鍑嗙殑JSF HtmlInputText 緇勪歡 錛岄噸鍐欎簡鍑犱釜鍑芥暟銆侶tmlFileUploadRenderer璐熻矗鍒涘緩 HTML 鏍囩浠ュ強浠嶮ultipartRequestWrapper綾昏繑鍥濬ileItem(鍓嶉潰鎻愯繃)銆?/P>
MyFaces鎻愪緵浜嗚嚜宸辯殑UploadedFile鎺ュ彛璇誨彇涓婁紶鏂囦歡鐨勫唴瀹癸紝鏂囦歡綾誨瀷錛屽悕瀛椾互鍙婂ぇ灝忥紝鑰屼笉鏄浣犵洿鎺ヨ闂敱Commons File Upload緇勪歡鍒涘緩鐨凢ileItem瀹炰緥銆備綘鐨凧SF琛ㄥ崟鑳屽悗鐨刡ean蹇呴』鏈変竴涓猆ploadedFile灞炴с備笅闈㈢殑渚嬪瓙涓紝UI緇勪歡鐨勫奸氳繃JSF琛ㄨ揪寮?#{myBean.myFile})緇戝畾鍒頒竴涓猙ean灞炴т腑銆侸SF妗嗘灦灝嗗彇寰桯tmlInputFileUpload 緇勪歡鐨勫鹼紝榪欐槸涓猆ploadedFile瀹炰緥錛屽茍鎶婂畠浼犻佸埌鑳屽悗bean鐨勫睘鎬т腑銆?/P>
import org.apache.myfaces.custom.fileupload.UploadedFile;
...
public class MyBean {
private UploadedFile myFile;
public UploadedFile getMyFile() {
return myFile;
}
public void setMyFile(UploadedFile myFile) {
this.myFile = myFile;
}
...
}
鎴戜滑搴旇鐭ラ亾MyFaces鏈変袱涓疄鐜?UploadedFile鎺ュ彛鐨勭被:UploadedFileDefaultMemoryImpl鍜?FONT style="BACKGROUND-COLOR: #deb887">UploadedFileDefaultFileImpl銆傚綋<x:inputFileUpload>鏍囩娌℃湁storage灞炴ф垨榪欎釜灞炴у間負memory鏃訛紝浣跨敤鍓嶄竴涓被銆傚綋storage灞炴у間負file鏃剁敤鍚庝竴涓?/P>
綾籙ploadedFileDefaultMemoryImp浠庝竴涓狥ileItem瀹炰緥涓彇寰椾笂浼犳枃浠剁殑鍐呭浠ュ強瀹冪殑鍚嶅瓧錛屽ぇ灝忥紝鏂囦歡綾誨瀷錛屽茍鎶婅繖浜涗俊鎭偍瀛樺湪涓涓鏈夊睘鎬ч噷銆傛墍浠ュ嵆浣緾ommons File Upload 鎶婃枃浠跺瓨鍦ㄧ鐩樹笂錛岃繖涓疄鐜癠ploadedFile鎺ュ彛鐨勭被浠嶆妸涓婁紶鏂囦歡鐨勫唴瀹瑰偍瀛樺湪鍐呭瓨閲岋紝嫻垂緋葷粺璧勬簮銆?/P>
綾籙ploadedFileDefaultFileImpl浣跨敤涓涓復鏃跺睘鎬ф潵淇濆瓨涓涓FileItem瀹炰緥鐨勫紩鐢ㄣ傚彧鏈夊綋getInputStream()琚皟鐢ㄦ椂錛屾墠閫氳繃榪欎釜寮曠敤璇誨彇涓婁紶鏂囦歡鐨勫唴瀹廣傝繖涓被鑺傜渷浜嗗唴瀛樼┖闂達紝浣嗗畠鏄簭鍒楀寲鐨勶紝褰撳叾琚弽搴忓垪鍖栧悗錛屼綘鏃犳硶鍙栧緱鏂囦歡鐨勫唴瀹廣傛墍浠ワ紝涓婁紶鏂囦歡琛ㄥ崟鑳屽悗鐨刡ean鏃犳硶淇濆瓨鍦╯ession scope涓紝鍥犱負搴旂敤鏈嶅姟鍣ㄥ湪搴旂敤紼嬪簭閲嶈搗鎴栨湇鍔″櫒鍏抽棴鏃惰瀵箂ession bean搴忓垪鍖栥?璇戣呮敞錛氳繖涓孌典笉澶槑鐧斤紝甯屾湜澶у緇欎簣鎸囧錛夈?/P>
濡傛灉浣犳兂璁╁畠浠珮鏁堢殑宸ヤ綔錛屽彲浠ユ妸鑳屽悗鐨刡ean淇濆瓨鍦╮equest scope騫朵笖鍦?lt;x:inputFileUpload>涓畾涔?storage="file"鑺傜渷鍐呭瓨璧勬簮銆備綘鍙互鍦║ploadedFileDefaultFileImpl娣誨姞涓涓簭鍒楀寲涓婁紶鏂囦歡鐨勫嚱鏁皐riteObject()錛岃繖鏍峰彲浠ヨВ鍐沖簭鍒楀寲鐨勯棶棰樸備負浜嗕嬌榪欎釜綾繪洿鏈夋晥鐜囷紝鐩稿簲鐨剅eadObject() 搴旇鍒涘緩涓存椂鏂囦歡鑰屼笉鏄粠鍐呭瓨涓鍙栧畠鐨勫唴瀹廣?/P>
搴旂敤紼嬪簭渚嬪瓙
鍓嶉潰鐨勭珷鑺備腑錛屾垜浠弿榪頒簡MyFaces濡備綍浣跨敤Commons File Upload鏀寔涓婁紶鏂囦歡鍔熻兘銆傜幇鍦ㄨ鎴戜滑鏉ョ湅涓涓嬌鐢ㄨ繖涓姛鑳界殑渚嬪瓙銆備竴涓狫SF琛ㄥ崟(MyForm.jsp錛夎鐢ㄦ埛閫夋嫨鏂囦歡浠ュ強message-digest algorithm錛岃儗鍚庣殑bean(MyBean.java)璁$畻瑕佸湪鍒殑欏甸潰(MyResult.jsp)鏄劇ず鐨刪ash鍊箋傝繖浜涢〉闈互鍙婅儗鍚庣殑bean鍜屼竴涓狫SF閰嶇疆鏂囦歡(faces-config.xml)鐩稿叧鑱斻?/P>
MyForm.jsp欏甸潰
榪欓噷鐨凧SF琛ㄥ崟浣跨敤MyFaces鐨?lt;x:inputFileUpload>鏍囩錛屼互鍙婁竴浜涙爣鍑咼SF鏍囩,榪欎簺JSF鏍囩灝嗗湪欏甸潰鐢熸垚labels,messages,浠ュ強涓涓寘鍚玬essage-digest algorithms鐨勪笅鎷夊垪琛紝榪樻湁涓涓嬌鐢ㄤ簡JSF琛ㄨ揪寮忕殑鍛戒護鎸夐挳錛岃繖涓寜閽敤鏉ュ畾涔夊鐞嗕笂浼犳枃浠剁殑action鏂規硶銆?BR>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%>
<f:view>
<h:form id="MyForm" enctype="multipart/form-data" >
<h:messages globalOnly="true" styleClass="message"/>
<h:panelGrid columns="3" border="0" cellspacing="5">
<h:outputLabel for="myFileId" value="File: "/>
<x:inputFileUpload id="myFileId"
value="#{myBean.myFile}"
storage="file"
required="true"/>
<h:message for="myFileId"/>
<h:outputLabel for="myParamId" value="Param: "/>
<h:selectOneMenu id="myParamId"
value="#{myBean.myParam}"
required="true">
<f:selectItem itemLabel="" itemValue=""/>
<f:selectItem itemLabel="MD5" itemValue="MD5"/>
<f:selectItem itemLabel="SHA-1" itemValue="SHA-1"/>
<f:selectItem itemLabel="SHA-256" itemValue="SHA-256"/>
<f:selectItem itemLabel="SHA-384" itemValue="SHA-384"/>
<f:selectItem itemLabel="SHA-512" itemValue="SHA-512"/>
</h:selectOneMenu>
<h:message for="myParamId"/>
<h:outputText value=" "/>
<h:commandButton value="Submit"
action="#{myBean.processMyFile}"/>
<h:outputText value=" "/>
</h:panelGrid>
</h:form>
</f:view>
processMyFile() 鍑芥暟閫氳繃涓涓緭鍏ユ祦鍙栧緱涓婁紶鏂囦歡鐨勫唴瀹癸紝榪欎釜杈撳叆嫻佹槸閫氳繃璋冪敤myFile.getInputStream()鍑芥暟榪斿洖鐨勩俬ash鍊兼槸浣跨敤java.security.MessageDigest璁$畻鍑烘潵鐨勶紝鐒跺悗榪欎釜鍊艱杞崲鎴愪竴涓猻tring,鐢╩yResult灞炴у偍瀛樸?BR>package com.devsphere.articles.jsfupload;
...
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.*;
public class MyBean {
...
public String processMyFile() {
try {
MessageDigest md
= MessageDigest.getInstance(myParam);
InputStream in = new BufferedInputStream(
myFile.getInputStream());
try {
byte[] buffer = new byte[64 * 1024];
int count;
while ((count = in.read(buffer)) > 0)
md.update(buffer, 0, count);
} finally {
in.close();
}
byte hash[] = md.digest();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
int b = hash[i] & 0xFF;
int c = (b >> 4) & 0xF;
c = c < 10 ? '0' + c : 'A' + c - 10;
buf.append((char) c);
c = b & 0xF;
c = c < 10 ? '0' + c : 'A' + c - 10;
buf.append((char) c);
}
myResult = buf.toString();
return "OK";
} catch (Exception x) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_FATAL,
x.getClass().getName(), x.getMessage());
FacesContext.getCurrentInstance().addMessage(
null, message);
return null;
}
}
}
faces-config.xml 鏂囦歡
榪欎釜JSF閰嶇疆鏂囦歡瀹氫箟浜嗚儗鍚庣殑bean鍦╮equest scope浠ュ強涓涓鑸鍒欙細
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>
com.devsphere.articles.jsfupload.MyBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/MyForm.jsp</from-view-id>
<navigation-case>
<from-outcome>OK</from-outcome>
<to-view-id>/MyResult.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
MyResult.jsp 欏甸潰
榪欎釜web欏甸潰鏄劇ず浜嗗叧浜庝笂浼犳枃浠跺拰hash鍊肩殑涓浜涗俊鎭細
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<h:panelGrid columns="2" border="0" cellspacing="5">
<h:outputText value="FileName:"/>
<h:outputText value="#{myBean.myFile.name}"/>
<h:outputText value="FileSize:"/>
<h:outputText value="#{myBean.myFile.size}"/>
<h:outputText value="Param:"/>
<h:outputText value="#{myBean.myParam}"/>
<h:outputText value="Result:"/>
<h:outputText value="#{myBean.myResult}"/>
</h:panelGrid>
</f:view>
浜嬪疄涓婏紝鏄劇ず鐨勬枃浠跺悕瀛楀彲鑳芥槸鍦ㄥ鎴風鏂囦歡緋葷粺鐨勫畬鏁磋礬寰勶紝姝e鍦ㄤ笅闈㈢殑嫻忚鍣ㄤ腑鐪嬪埌鐨勶細
鎬葷粨
鍦ㄥ緢澶氭儏鍐典笅錛岀敤鎴烽渶瑕侀氳繃浠栦滑鐨勬祻瑙堝櫒涓婁紶鏂囦歡錛屼絾鍦ㄦ湇鍔″櫒鏂歸潰騫舵病鏈夊鐞嗚繖浜涙枃浠剁殑鑹ソ鏂瑰紡銆傛妸灝忔枃浠朵繚瀛樺湪鍐呭瓨閲屾槸鍙互鎺ュ彈鐨勶紝浣嗘妸澶ф枃浠朵繚瀛樺湪涓存椂鏂囦歡閲屼細璁╂儏鍐靛鏉傘侻yFaces璁╀綘閫夋嫨鐨勮В鍐蟲柟娉曞浣犵殑搴旂敤紼嬪簭寰堟湁甯姪錛屼絾榪欎釜妗嗘灦鏈夊嚑涓皬闂錛氬綋浣犲凡涓嶅啀闇瑕佹煇涓復鏃舵枃浠舵椂錛屽畠鍗翠笉璁╀綘鍒犻櫎錛涙枃浠跺悕鏈夋椂鍊欐槸鏂囦歡璺緞錛涘茍涓旂敤鎴蜂笂浼犺繃澶ф枃浠舵椂瀹冩病鏈変換浣曡鍛婁俊鎭備絾榪欎簺bug鏄彲浠ヤ慨澶嶇殑錛屽洜涓烘簮鐮佸彲浠ヤ慨鏀圭殑銆傝繖綃囨枃绔犲凡緇忚鏄庡摢浜涘湴鏂圭殑浠g爜鍙互鎻愰珮銆備笉榪囷紝浣犲彲鑳戒細鍙戠幇錛屽浜庡緢澶氬簲鐢ㄧ▼搴忔潵璇達紝鍘熸湁鐨凪yFaces灝卞凡緇忚凍澶熶簡銆傝繖綃囨枃绔犵殑渚嬪瓙鏄湪JSF 1.1.01, MyFaces 1.0.9,鍜?Commons File Upload 1.0涓嬫祴璇曠殑銆?/P>
銆銆JSF EL鏄互#闁嬪錛屽皣璁婃暩鎴栭亱綆楀紡鏀劇疆鍦?
#{someBeanName}
銆銆璁婃暩鍚嶇ū鍙互鏄痜aces-config.xml涓畾緹╃殑鍚嶇ū錛屽鏋滄槸Bean鐨勮┍錛屽彲浠ラ忛亷浣跨敤 '.' 閬嬬畻瀛愪締瀛樺彇瀹冪殑灞э紝渚嬪錛?/P>
...
<f:view>
<h:outputText value="#{userBean.name}"/>
</f:view>
...
銆銆鍦↗SF妯欑堡鐨勫爆鎬т笂錛? 鑸?" 錛堟垨'鑸?錛変箣闁撳鏋滃惈鏈塃L錛屽墖鏈冨姞浠ラ亱綆楋紝鎮ㄤ篃鍙互閫欓杭浣跨敤瀹冿細
...
<f:view>
鍚嶇ū, 騫撮健錛?lt;h:outputText
value="#{userBean.name}, #{userBean.age}"/>
</f:view>
...
銆銆涓鍊嬪煼琛岀殑緄愭灉鍙兘鏄欐ǎ欏ず鐨勶細
鍚嶇ū, 騫撮健錛欽ustin, 29
銆銆EL鐨勮畩鏁稿悕涔熷彲浠ョ▼寮忓煼琛岄亷紼嬩腑鎵瀹e憡鐨勫悕紼憋紝鎴栨槸JSF EL闋愯ō鐨勯毐鍚墿浠訛紝渚嬪涓嬮潰鐨勭▼寮忎嬌鐢╬aram闅卞惈鐗╀歡渚嗗彇寰椾嬌鐢ㄨ呰幾鍏ョ殑鍙冩暩錛?/P>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@page contentType="text/html; charset=Big5"%> <html> <head> <title></title> </head> <body> <f:view> <b> 鎮ㄥソ, <h:outputText value="#{param.name}"/> </b> </f:view> </body> </html>
銆銆param鏄疛SF EL闋愯ō鐨勯毐鍚墿浠惰畩鏁革紝瀹冧唬琛╮equest鎵鏈夊弮鏁哥殑闆嗗悎錛屽闅涙槸涓鍊媕ava.util.Map鍨嬫厠鐗╀歡錛孞SF鎵鎻愪緵鐨勯毐鍚墿浠訛紝澶ц嚧涓婂皪鎳夋柤JSP闅卞惈鐗╀歡錛屼笉閬嶫SF闅卞惈鐗╀歡縐婚櫎浜唒ageScope鑸噋ageContext錛岃屽鍔犱簡facesContext鑸噕iew錛屽畠鍊戝垎鍒ュ皪鎳夋柤 javax.faces.context.FacesContext鑸噅avax.faces.component.UIViewRoot銆?/P>
銆銆灝嶆柤Map鍨嬫厠鐗╀歡錛屾垜鍊戝彲浠ヤ嬌鐢?'.' 閬嬬畻瀛愭寚瀹歬ey鍊間締鍙栧嚭灝嶆噳鐨剉alue錛屼篃鍙互浣跨敤 [ 鑸?] 渚嗘寚瀹氾紝渚嬪錛?/P>
...
<f:view>
<b> 鎮ㄥソ, <h:outputText value="#{param['name']}"/> </b>
</f:view>
...
銆銆鍦?[ 鑸?] 涔嬮枔錛屼篃鍙互鏀劇疆鍏跺畠鐨勮畩鏁稿鹼紝渚嬪錛?/P>
...
<f:view>
<h:outputText value="#{someBean.someMap[user.name]}"/>
</f:view>
...
銆銆濡傛灉璁婃暩鏄疞ist鍨嬫厠鎴栭櫍鍒楃殑瑭憋紝鍓囧彲浠ュ湪 [] 涓寚瀹氱儲寮曪紝渚嬪錛?/P>
.... <f:view> <h:outputText value="#{someBean.someList[0]}"/> <h:outputText value="#{someBean.someArray[1]}"/> <h:outputText value="#{someBean.someListOrArray[user.age]}"/> </f:view> ....
銆銆鎮ㄤ篃鍙互鎸囧畾瀛楅潰甯告暩錛屽皪鏂紅rue銆乫alse銆佸瓧涓層佹暩瀛楋紝JSF EL鏈冨槜瑭﹂茶杞夋彌錛屼緥濡傦細
.... <h:outputText value="#{true}"/> .... <h:outputText value="#{'This is a test'}"/> ....
銆銆濡傛灉瑕佽幾鍑哄瓧涓詫紝蹇呴爤浠ュ柈寮曡櫉 ' 鎴栭洐寮曟暩 " 鎷綇錛屽姝ゆ墠涓嶆渻琚獚鐐烘槸璁婃暩鍚嶇ū銆?/P>
銆銆鍦ㄥ鍛婅畩鏁稿悕紼辨檪錛岃鐣欐剰涓嶅彲鑸嘕SF鐨勪繚鐣欏瓧鎴栭棞閸靛瓧鍚屽悕錛屼緥濡備笉鍙彇浠ヤ笅閫欎簺鍚嶇ū錛?/P>
true false null div mod and or not eq ne lt gt le ge instanceof empty
銆銆浣跨敤EL錛屾偍鍙互鐩存帴瀵﹁涓浜涚畻琛撻亱綆椼侀倧杓亱綆楄垏闂滀總閬嬬畻錛屽叾浣跨敤灝卞鍚屽湪涓鑸父瑕嬬殑紼嬪紡瑾炶█涓箣閬嬬畻銆?/P>
銆銆綆楄閬嬬畻瀛愭湁錛氬姞娉?(+), 娓涙硶 (-), 涔樻硶 (*), 闄ゆ硶 (/ or div) 鑸囬闄?(% or mod) 銆備笅闈㈡槸綆楄閬嬬畻鐨勪竴浜涗緥瀛愶細
閬嬬畻寮?/TH> | 緄愭灉 |
---|---|
#{1} | 1 |
#{1 + 2} | 3 |
#{1.2 + 2.3} | 3.5 |
#{1.2E4 + 1.4} | 12001.4 |
#{-4 - 2} | -6 |
#{21 * 2} | 42 |
#{3/4} | 0.75 |
#{3 div 4} | 0.75錛岄櫎娉?/TD> |
#{3/0} | Infinity |
#{10%4} | 2 |
#{10 mod 4} | 2錛屼篃鏄闄?/TD> |
#{(1==2) ? 3 : 4} | 4 |
銆銆濡傚悓鍦↗ava瑾炴硶涓妯?( expression ? result1 : result2錛夋槸鍊嬩笁鍏冮亱綆楋紝expression鐐簍rue欏ずresult1錛宖alse欏ずresult2銆?/P>
銆銆閭忚集閬嬬畻鏈夛細and(鎴?amp;&)銆乷r(鎴?!)銆乶ot(鎴?)銆備竴浜涗緥瀛愮偤錛?/P>
閬嬬畻寮?/TH> | 緄愭灉 |
---|---|
#{true and false} | false |
#{true or false} | true |
#{not true} | false |
銆銆闂滀總閬嬬畻鏈夛細灝忔柤Less-than (< or lt)銆佸ぇ鏂糋reater-than (> or gt)銆佸皬鏂兼垨絳夋柤Less-than-or-equal (<= or le)銆佸ぇ鏂兼垨絳夋柤Greater-than-or-equal (>= or ge)銆佺瓑鏂糆qual (== or eq)銆佷笉絳夋柤Not Equal (!= or ne)錛岀敱鑻辨枃鍚嶇ū鍙互寰楀埌lt銆乬t絳夐亱綆楀瓙涔嬬府瀵錛屼互涓嬫槸Tomcat鐨勪竴浜涗緥瀛愶細
閬嬬畻寮?/TH> | 緄愭灉 |
---|---|
#{1 < 2} | true |
#{1 lt 2} | true |
#{1 > (4/2)} | false |
#{1 > (4/2)} | false |
#{4.0 >= 3} | true |
#{4.0 ge 3} | true |
#{4 <= 3} | false |
#{4 le 3} | false |
#{100.0 == 100} | true |
#{100.0 eq 100} | true |
#{(10*10) != 100} | false |
#{(10*10) ne 100} | false |
銆銆宸﹂倞鏄亱綆楀瓙鐨勪嬌鐢ㄦ柟寮忥紝鍙抽倞鐨勬槸閬嬬畻緄愭灉錛岄棞淇傞亱綆椾篃鍙互鐢ㄤ締姣旇純瀛楀厓鎴栧瓧涓詫紝鎸夊瓧鍏擱爢搴忎締姹哄畾姣旇純緄愭灉錛屼緥濡傦細
閬嬬畻寮?/TH> | 緄愭灉 |
---|---|
#{'a' < 'b'} | true |
#{'hip' > 'hit'} | false |
#{'4' > 3} | true |
銆銆EL閬嬬畻瀛愮殑鍩瘋鍎厛闋嗗簭鑸嘕ava閬嬬畻瀛愬皪鎳夛紝濡傛灉鏈夌枒鎱殑瑭憋紝涔熷彲浠ヤ嬌鐢ㄦ嫭铏?)渚嗚嚜琛屾焙瀹氬厛寰岄爢搴忋?/P>
.... <navigation-rule> <from-view-id>/pages/index.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>failure</from-outcome> <to-view-id>/pages/index.jsp</to-view-id> </navigation-case> </navigation-rule> ....
銆銆灝嶆柤JSF錛屾瘡涓鍊嬭鍦栵紙View錛夐兘鏈変竴鍊嬬崹鐗圭殑璀樺垾錛坕dentifier錛夛紝紼變箣鐐篤iew ID錛屽湪JSF涓殑View ID鏄緸Web鎳夌敤紼嬪紡鐨勭挵澧冪浉灝嶈礬寰戦枊濮嬭▓綆楋紝璦畾鏅傞兘鏄互/浣滅偤闁嬮牠錛屽鏋滄偍璜嬫眰鏅傜殑璺緫鏄?pages/index.faces錛屽墖JSF鏈冨皣鍓獢鍚嶆敼鐐?pages/index.jsp錛屼互姝や綔鐐簐iew-id銆?/P>
銆銆鍦?lt;navigation-rule>涓殑<from-view-id>鏄嬮伕鎿囨х殑瀹氱京錛屽畠瑕忓畾浜嗕締婧愰爜闈㈢殑姊濅歡錛?lt;navigation-case>涓畾緹╁悇紼皫瑕芥浠訛紝<from-outcome>瀹氱京鐣惰〃鍠祼鏋滅鍚堢殑姊濅歡鏅傦紝鍚勮嚜鏀瑰皫鍚戝摢涓鍊嬬洰鐨勯爜闈紝鐩殑闋侀潰鏄湪<to-view-id>涓畾緹┿?/P>
銆銆鎮ㄩ倓鍙互鍦?lt;navigation-case>涓姞鍏?lt;from-action>錛岄蹭竴姝ヨ綃勮〃鍠祼鏋滃繀闋堟牴鎿氬摢涓鍊嬪嫊浣滄柟娉曪紙action method錛夛紝鐣朵腑鏄嬌鐢?JSF Expression Language 渚嗚ō瀹氾紝渚嬪錛?/P>
.... <navigation-rule> <from-view-id>/pages/index.jsp</from-view-id> <navigation-case> <from-action>#{user.verify}</from-action> <from-outcome>success</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> </navigation-case> .... </navigation-rule> ....
銆銆鍦ㄥ皫鑸檪錛岄爯璦兘鏄嬌鐢╢orward鐨勬柟寮忥紝鎮ㄥ彲浠ュ湪<navigation-case>涓姞鍏ヤ竴鍊?lt;redirect/>錛岃畵JSF鐧煎嚭璁撶忚鍣ㄩ噸鏂板皫鍚戯紙redirect錛夌殑header錛岃畵鐎忚鍣ㄤ富鍕曡姹傛柊綞查爜錛屼緥濡傦細
.... <navigation-rule> <from-view-id>/pages/index.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> <redirect/> </navigation-case> .... </navigation-rule> ....
鎮ㄧ殑渚嗘簮綞查爜鍙兘鏄煇鍊嬬壒瀹氭ā緄勶紝渚嬪鍦?admin/涓嬬殑闋侀潰錛屾偍鍙互鍦?lt;from-view-id>涓嬌鐢╳ildcards錛屼篃灝辨槸浣跨敤 * 瀛楀厓錛屼緥濡傦細
.... <navigation-rule> <from-view-id>/admin/*</from-view-id> <navigation-case> <from-action>#{user.verify}</from-action> <from-outcome>success</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> </navigation-case> .... </navigation-rule> ....
鍦ㄤ笂闈㈢殑璦畾涓紝鍙渚嗘簮綞查爜鏄緸/admin渚嗙殑錛岄兘鍙互闁嬪娓│鎺ヤ笅渚嗙殑<navigation-case>銆?/P>
銆銆<from-view-id>濡傛灉娌掓湁璦畾錛岃〃紺轟締婧愮恫闋佷笉浣滈檺鍒訛紝鎮ㄤ篃鍙互浣跨敤 * 欏紡鐨勫湪瀹氱京妾斾腑琛ㄦ槑錛屼緥濡傦細
....
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
....
</navigation-rule>
....
鎴栬呮槸閫欐ǎ錛?/P>
....
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
....
</navigation-rule>
....
* jsf-impl.jar * jsf-api.jar * commons-digester.jar * commons-collections.jar * commons-beanutils.jar * jstl.jar * standard.jar
銆銆鎺ヤ笅渚嗛厤緗甒eb鎳夌敤紼嬪紡鐨剋eb.xml錛屼嬌鐢↗SF鏅傦紝鎵鏈夌殑璜嬫眰閮介忛亷FacesServlet渚嗚檿鐞嗭紝鎮ㄥ彲浠ュ涓嬪畾緹╋細
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <description> JSF Demo </description> <display-name>JSF Demo</display-name> <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> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
銆銆鍦ㄤ笂闈㈢殑瀹氱京涓紝鎴戝戝皣鎵鏈?faces鐨勮珛姹備氦鐢盕aceServlet渚嗚檿鐞嗭紝FaceServlet鏈冨枤璧風浉灝嶇殑.jsp綞查爜錛屼緥濡傝珛姹傛槸/index.faces鐨勮┍錛屽墖瀵﹂殯涓婃渻鍠氳搗/index.jsp綞查爜錛屽畬鎴愪互涓婄殑閰嶇疆錛屾偍灝卞彲浠ラ枊濮嬩嬌鐢↗SF浜嗐?BR>
鍏堢湅鐪嬫噳鐢ㄧ▼寮忛枊鐧間漢鍝¤浣滀簺浠楹間簨錛屾垜鍊戞挵瀵竴鍊嬬啊鍠殑JavaBean錛?/P>
package onlyfun.caterpillar; public class UserBean { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
銆銆閫欏婤ean灝囧劜瀛樹嬌鐢ㄨ呯殑鍚嶇ū錛岀法璀ソ涔嬪緦鏀劇疆鍦?WEB-INF/classes涓嬨?/P>
銆銆鎺ヤ笅渚嗚ō璦堥爜闈㈡祦紼嬶紝鎴戝戝皣鍏堥’紺轟竴鍊嬬櫥鍏ョ恫闋?pages/index.jsp錛屼嬌鐢ㄨ呭~鍏ュ悕紼變甫閫佸嚭琛ㄥ柈錛屼箣寰屽湪/pages/welcome.jsp涓’紺築ean涓殑浣跨敤鑰呭悕紼辮垏姝¤繋璦婃伅銆?/P>
銆銆鐐轟簡璁揓SF鐭ラ亾鎴戝戞墍璦▓鐨凚ean浠ュ強闋侀潰嫻佺▼錛屾垜鍊戝畾緹╀竴鍊?WEB-INF/faces-config.xml錛?/P>
<?xml version="1.0"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"> <faces-config> <navigation-rule> <from-view-id>/pages/index.jsp</from-view-id> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/pages/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> <managed-bean> <managed-bean-name>user</managed-bean-name> <managed-bean-class> onlyfun.caterpillar.UserBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
銆銆鍦?lt;navigation-rule>涓紝鎴戝戝畾緹╀簡闋侀潰嫻佺▼錛岀暥璜嬫眰渚嗚嚜<from-view- id>涓寚瀹氱殑闋侀潰錛屼甫涓旀寚瀹氫簡<navigation-case>涓殑<from-outcome>鐐簂ogin鏅傦紝鍓囨渻灝囪珛姹傚皫鍚戣嚦<to-view-id>鎵鎸囧畾鐨勯爜闈€?/P>
銆銆鍦?lt;managed-bean>涓垜鍊戝彲浠ョ當涓綆$悊鎴戝戠殑Bean錛屾垜鍊戣ō瀹欱ean鐗╀歡鐨勫瓨媧葷瘎鍦嶆槸session錛屼篃灝辨槸浣跨敤鑰呴枊鍟熺忚鍣ㄨ垏紼嬪紡浜掑嫊閬庣▼涓兘瀛樻椿銆?/P>
銆銆鎺ヤ笅渚嗚鍛婅ù綞查爜璦▓浜哄摗鐨勮硣璦婃槸錛屼粬鍊戝彲浠ヤ嬌鐢ㄧ殑Bean鍚嶇ū錛屽嵆<managed-bean-name>涓ō瀹氱殑鍚嶇ū錛屼互鍙婁笂闈㈡墍瀹氱京鐨勯爜闈㈡祦紼嬨?/P>
銆銆棣栧厛綞查爜璦▓浜哄摗鎾板index.jsp綞查爜錛?/P>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@page contentType="text/html;charset=Big5"%> <html> <head> <title>絎竴鍊婮SF紼嬪紡</title> </head> <body> <f:view> <h:form> <h3>璜嬭幾鍏ユ偍鐨勫悕紼?lt;/h3> 鍚嶇ū: <h:inputText value="#{user.name}"/><p> <h:commandButton value="閫佸嚭" action="login"/> </h:form> </f:view> </body> </html>
銆銆鎴戝戜嬌鐢ㄤ簡JSF鐨刢ore鑸噃tml妯欑堡搴紝core鏄湁闂滄柤UI鍏冧歡鐨勮檿鐞嗭紝鑰宧tml鍓囨槸鏈夐棞鏂糎TML鐨勯查殠妯欑堡銆?/P>
銆銆<f:view>鑸?lt;html>鏈夐浼肩殑浣滅敤錛岀暥鎮ㄨ闁嬪浣跨敤JSF鍏冧歡鏅傦紝閫欎簺鍏冧歡涓瀹氳鍦?lt;f: view>鑸?lt;/f:view>涔嬮枔錛屽氨濡傚悓浣跨敤HTML鏅傦紝鎵鏈夌殑妯欑堡涓瀹氳鍦?lt;html>鑸?lt; /html>涔嬮枔銆?/P>
銆銆html妯欑堡搴腑騫句箮閮芥槸鑸嘓TML妯欑堡鐩擱棞鐨勯查殠妯欑堡錛?lt;h:form>鏈冪敘鐢熶竴鍊嬭〃鍠紝鎴戝戜嬌鐢?lt;h: inputText>渚嗛’紺簎ser閫欏婤ean鐗╀歡鐨刵ame灞э紝鑰?lt;h:commandButton>鏈冪敘鐢熶竴鍊嬫彁浜ゆ寜閳曪紝鎴戝戝湪action灞т腑鎸囧畾灝囨牴鎿氫箣鍓嶅畾緹╃殑login闋侀潰嫻佺▼涓墠寰welcome.jsp闋侀潰銆?/P>
銆銆綞查爜璦▓浜哄摗涓嶅繀鐞嗘渻琛ㄥ柈鍌抽佷箣寰岃浣滀簺浠楹鹼紝浠栧彧瑕佽ō璦堝ソ姝¤繋闋侀潰灝卞ソ浜嗭細
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@page contentType="text/html;charset=Big5"%> <html> <head> <title>絎竴鍊婮SF紼嬪紡</title> </head> <body> <f:view> <h:outputText value="#{user.name}"/> 鎮ㄥソ錛? <h3>姝¤繋浣跨敤 JavaServer Faces錛?lt;/h3> </f:view> </body> </html>
銆銆閫欏嬮爜闈㈡矑浠楹奸渶瑕佽В閲嬬殑浜嗭紝濡傛偍鎵鐪嬪埌鐨勶紝鍦ㄧ恫闋佷笂娌掓湁紼嬪紡閭忚集錛岀恫闋佽ō璦堜漢鍝℃墍浣滅殑灝辨槸閬電収闋侀潰嫻佺▼錛屼嬌鐢ㄧ浉闂滃悕紼卞彇鍑鴻硣鏂欙紝鑰屼笉鐢ㄦ摂蹇冨闅涗笂紼嬪紡鏄浣曢亱浣滅殑銆?/P>
銆銆鎺ヤ笅渚嗗暉鍕旵ontainer錛岄f帴涓婃偍鐨勬噳鐢ㄧ▼寮忕恫鍧錛屼緥濡傦細http://localhost:8080/jsfDemo/pages/index.faces錛屽~鍏ュ悕紼變甫閫佸嚭琛ㄥ柈錛屾偍鐨勬榪庨爜闈㈠氨鏈冮’紺轟簡銆?/P>