Struts2面試題(轉(zhuǎn))

1、struts2工作流程

Struts 2框架本身大致可以分為3個部分:

核心控制器FilterDispatcher绑青、業(yè)務(wù)控制器Action和用戶實(shí)現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件梧喷。

核心控制器FilterDispatcher是Struts 2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制汇四。

業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶來自己實(shí)現(xiàn)的锯玛。

用戶在開發(fā)Action和業(yè)務(wù)邏輯組件的同時咐柜,還需要編寫相關(guān)的配置文件,
供核心控制器FilterDispatcher來使用攘残。

基本簡要流程如下:


1 拙友、客戶端初始化一個指向Servlet容器的請求;

2歼郭、 這個請求經(jīng)過一系列的過濾器(Filter)

(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器献宫,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)

3 实撒、接著FilterDispatcher被調(diào)用姊途,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個請是否需要調(diào)用某個Action

4涉瘾、如果ActionMapper決定需要調(diào)用某個Action,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy

5捷兰、ActionProxy通過Configuration Manager詢問框架的配置文件立叛,找到需要調(diào)用的Action類

6、ActionProxy創(chuàng)建一個ActionInvocation的實(shí)例贡茅。

7秘蛇、ActionInvocation實(shí)例使用命名模式來調(diào)用,在調(diào)用Action的過程前后顶考,涉及到相關(guān)攔截器(Intercepter)的調(diào)用赁还。

8、一旦Action執(zhí)行完畢驹沿,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果 艘策。返回結(jié)果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版渊季。 在表示的過程中可以使用Struts2 框架中繼承的標(biāo)簽朋蔫。 在這個過程中需要涉及到ActionMapper

9、響應(yīng)的返回是通過我們在web.xml中配置的過濾器

10却汉、如果ActionContextCleanUp是當(dāng)前使用的驯妄,則FilterDispatecher將不會清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會去清理sreadlocals合砂。


2青扔、Struts2的設(shè)計模式

MVC模式: web應(yīng)用程序啟動時就會加載并初始化ActionServler。用戶提交表單時翩伪,一個配置好的ActionForm對象被創(chuàng)建赎懦,并被填入表單相應(yīng)的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗(yàn)證幻工,如果需要就調(diào)用ActionForm的Validate()驗(yàn)證后選擇將請求發(fā)送到哪個Action,如果Action不存在黎茎,ActionServlet會先創(chuàng)建這個對象囊颅,然后調(diào)用Action的execute()方法。Execute()從ActionForm對象中獲取數(shù)據(jù)傅瞻,完成業(yè)務(wù)邏輯踢代,返回一個ActionForward對象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指定的jsp組件嗅骄,ActionForward對象指定的jsp生成動態(tài)的網(wǎng)頁胳挎,返回給客戶。

3溺森、攔截器和過濾器的區(qū)別

1慕爬、攔截器是基于java反射機(jī)制的窑眯,而過濾器是基于函數(shù)回調(diào)的。

2医窿、過濾器依賴于servlet容器磅甩,而攔截器不依賴于servlet容器。

3姥卢、攔截器只能對Action請求起作用卷要,而過濾器則可以對幾乎所有請求起作用。

4独榴、攔截器可以訪問Action上下文僧叉、值棧里的對象,而過濾器不能棺榔。

5瓶堕、在Action的生命周期中,攔截器可以多次調(diào)用掷豺,而過濾器只能在容器初始化時被調(diào)用一次捞烟。

4、struts1于struts2的比較

1当船、Action 類:
Struts1要求Action類繼承一個抽象基類题画。Struts1的一個普遍問題是使用抽象類編程而不是接口。
Struts 2 Action類可以實(shí)現(xiàn)一個Action接口德频,也可實(shí)現(xiàn)其他接口苍息,使可選和定制的服務(wù)成為可能。Struts2提供一個ActionSupport基類去 實(shí)現(xiàn)常用的接口壹置。Action接口不是必須的竞思,任何有execute標(biāo)識的POJO對象都可以用作Struts2的Action對象。

2钞护、線程模式:
Struts1 Action是單例模式并且必須是線程安全的盖喷,因?yàn)閮H有Action的一個實(shí)例來處理所有的請求。單例策略限制了Struts1 Action能作的事难咕,并且要在開發(fā)時特別小心课梳。Action資源必須是線程安全的或同步的。
Struts2 Action對象為每一個請求產(chǎn)生一個實(shí)例余佃,因此沒有線程安全問題暮刃。(實(shí)際上,servlet容器給每個請求產(chǎn)生許多可丟棄的對象爆土,并且不會導(dǎo)致性能和垃圾回收問題)

3椭懊、Servlet 依賴:
Struts1 Action 依賴于Servlet API ,因?yàn)楫?dāng)一個Action被調(diào)用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
Struts 2 Action不依賴于容器步势,允許Action脫離容器單獨(dú)被測試氧猬。如果需要背犯,Struts2 Action仍然可以訪問初始的request和response。但是狂窑,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性媳板。

4、可測性:
測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)泉哈。一個第三方擴(kuò)展--Struts TestCase--提供了一套Struts1的模擬對象(來進(jìn)行測試)蛉幸。
Struts 2 Action可以通過初始化、設(shè)置屬性丛晦、調(diào)用方法來測試奕纫,“依賴注入”支持也使測試更容易。

5烫沙、捕獲輸入:
Struts1 使用ActionForm對象捕獲輸入匹层。所有的ActionForm必須繼承一個基類。因?yàn)槠渌鸍avaBean不能用作ActionForm锌蓄,開發(fā)者經(jīng) 常創(chuàng)建多余的類捕獲輸入升筏。動態(tài)Bean(DynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是瘸爽,開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存 在的JavaBean(仍然會導(dǎo)致有冗余的javabean)您访。
Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求剪决。輸入屬性可能是有自己(子)屬性的rich對象類型灵汪。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式柑潦。rich對象類型享言,包括業(yè)務(wù)對象,能夠用作輸入/輸出對象渗鬼。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用览露。

6、表達(dá)式語言:
Struts1 整合了JSTL譬胎,因此使用JSTL EL差牛。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱银择。
Struts2可以使用JSTL,但是也支持一個更強(qiáng)大和靈活的表達(dá)式語言-- "Object Graph Notation Language " (OGNL).

7累舷、綁定值到頁面(view):
Struts 1使用標(biāo)準(zhǔn)JSP機(jī)制把對象綁定到頁面中來訪問浩考。
Struts 2 使用 "ValueStack "技術(shù),使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來被盈。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)析孽。

8搭伤、類型轉(zhuǎn)換:
Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進(jìn)行類型轉(zhuǎn)換袜瞬。每個類一個轉(zhuǎn)換器怜俐,對每一個實(shí)例來說是不可配置的。
Struts2 使用OGNL進(jìn)行類型轉(zhuǎn)換邓尤。提供基本和常用對象的轉(zhuǎn)換器拍鲤。

9、校驗(yàn):
Struts 1支持在ActionForm的validate方法中手動校驗(yàn)汞扎,或者通過Commons Validator的擴(kuò)展來校驗(yàn)季稳。同一個類可以有不同的校驗(yàn)內(nèi)容,但不能校驗(yàn)子對象澈魄。
Struts2支持通過validate方法和XWork校驗(yàn)框架來進(jìn)行校驗(yàn)景鼠。XWork校驗(yàn)框架使用為屬性類類型定義的校驗(yàn)和內(nèi)容校驗(yàn),來支持chain校驗(yàn)子屬性

10痹扇、Action執(zhí)行的控制:
Struts1支持每一個模塊有單獨(dú)的Request Processors(生命周期)铛漓,但是模塊中的所有Action必須共享相同的生命周期。
Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創(chuàng)建不同的生命周期鲫构。堆棧能夠根據(jù)需要和不同的Action一起使用浓恶。

5、為什么要使用Struts2

Struts2 是一個相當(dāng)強(qiáng)大的Java Web開源框架芬迄,是一個基于POJO的Action的MVC Web框架问顷。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點(diǎn)禀梳,同時做了相當(dāng)?shù)母倪M(jìn)杜窄。

1.Struts2基于MVC架構(gòu),框架結(jié)構(gòu)清晰算途,開發(fā)流程一目了然塞耕,開發(fā)人員可以很好的掌控開發(fā)的過程。

2.使用OGNL進(jìn)行參數(shù)傳遞

OGNL提供了在Struts2里訪問各種作用域中的數(shù)據(jù)的簡單方式嘴瓤,你可以方便的獲取Request扫外,Attribute,Application廓脆,Session筛谚,Parameters中的數(shù)據(jù)。大大簡化了開發(fā)人員在獲取這些數(shù)據(jù)時的代碼量停忿。

3.強(qiáng)大的攔截器

Struts2 的攔截器是一個Action級別的AOP驾讲,Struts2中的許多特性都是通過攔截器來實(shí)現(xiàn)的,例如異常處理,文件上傳吮铭,驗(yàn)證等时迫。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗(yàn)證谓晌,權(quán)限驗(yàn)證等置于攔截器中以完成一些Java Web項目中比較通用的功能掠拳。在我實(shí)現(xiàn)的的一Web項目中,就是使用Struts2的攔截器來完成了系統(tǒng)中的權(quán)限驗(yàn)證功能纸肉。

4.易于測試

Struts2的Action都是簡單的POJO溺欧,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了5Java Web項目的測試毁靶。

5.易于擴(kuò)展的插件機(jī)制

在Struts2添加擴(kuò)展是一件愉快而輕松的事情胧奔,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設(shè)置就可以實(shí)現(xiàn)擴(kuò)展预吆。

6.模塊化管理

Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想龙填,可以通過三種方法來將應(yīng)用程序模塊化:將配置信息拆分成多個文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性,即將與特定應(yīng)用無關(guān)的新功能組織成插件拐叉,以添加到多個應(yīng)用中去岩遗。

7.全局結(jié)果與聲明式異常

為應(yīng)用程序添加全局的Result,和在配置文件中對異常進(jìn)行處理凤瘦,這樣當(dāng)處理過程中出現(xiàn)指定異常時宿礁,可以跳轉(zhuǎn)到特定頁面。
他的如此之多的優(yōu)點(diǎn)蔬芥,是很多人比較的青睞梆靖,與spring ,Hibernate進(jìn)行結(jié)合,組成了現(xiàn)在比較流行的ssh框架笔诵,當(dāng)然每個公司都要自己的框架返吻,也是ssh變異的產(chǎn)品。

6乎婿、struts2有哪些優(yōu)點(diǎn)测僵?

1)在軟件設(shè)計上Struts2的應(yīng)用可以不依賴于Servlet API和struts API。 Struts2的這種設(shè)計屬于無侵入式設(shè)計谢翎;

2)攔截器捍靠,實(shí)現(xiàn)如參數(shù)攔截注入等功能;

3)類型轉(zhuǎn)換器森逮,可以把特殊的請求參數(shù)轉(zhuǎn)換成需要的類型榨婆;

4)多種表現(xiàn)層技術(shù),如:JSP褒侧、freeMarker良风、Velocity等颜武;

5)Struts2的輸入校驗(yàn)可以對指定某個方法進(jìn)行校驗(yàn);

6)提供了全局范圍拖吼、包范圍和Action范圍的國際化資源文件管理實(shí)現(xiàn)

7、struts2是如何啟動的这吻?

struts2框架是通過Filter啟動的吊档,即StrutsPrepareAndExecuteFilter,此過濾器為struts2的核心過濾器唾糯;

StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認(rèn)的配置文件struts.xml完成初始化操作怠硼。struts2讀取到struts.xml的內(nèi)容后,是將內(nèi)容封裝進(jìn)javabean對象然后存放在內(nèi)存中移怯,以后用戶的每次請求處理將使用內(nèi)存中的數(shù)據(jù)香璃,而不是每次請求都讀取struts.xml文件。

8舟误、struts2框架的核心控制器是什么葡秒?它有什么作用?

1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter嵌溢。

2)作用:
負(fù)責(zé)攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求眯牧,當(dāng)用戶請求到達(dá)時,該Filter會過濾用戶的請求赖草。默認(rèn)情況下学少,如果用戶請求的路徑 不帶后綴或者后綴以.action結(jié)尾,這時請求將被轉(zhuǎn)入struts2框架處理秧骑,否則struts2框架將略過該請求的處理版确。

可以通過常量"struts.action.extension"修改action的后綴,如:

<constant name="struts.action.extension" value="do"/>  

如果用戶需要指定多個請求后綴乎折,則多個后綴之間以英文逗號(,)隔開绒疗。

<constant name="struts.action.extension" value="do,go"/>   

9、struts2配置文件的加載順序笆檀?

struts.xml ——> struts.properties

常量可以在struts.xml或struts.properties中配置忌堂,如果在多個文件中配置了同一個常量,則后一個文件中配置的常量值會覆蓋前面文件中配置的常量值.

struts.xml文件的作用:通知Struts2框架加載對應(yīng)的Action資源

10酗洒、struts2常量的修改方式士修?

常量可以在struts.xml或struts.properties中配置,兩種配置方式如下:

1)在struts.xml文件中配置常量

<constant name="struts.action.extension" value="do"/>  

2)在struts.properties中配置常量(struts.properties文件放置在src下):

struts.action.extension=do

11樱衷、struts2如何訪問HttpServletRequest棋嘲、HttpSession、ServletContext三個域?qū)ο螅?/h2>

方案一:

HttpServletRequest request =ServletActionContext.getRequest();  

HttpServletResponse response =ServletActionContext.getResponse();  

HttpSession  session=   request.getSession(); 

ServletContext servletContext=ServletActionContext.getServletContext();  

方案二:

類 implements ServletRequestAware,ServletResponseAware矩桂,SessionAware沸移,ServletContextAware

注意:框架自動傳入對應(yīng)的域?qū)ο?/p>

12、struts2是如何管理action的?這種管理方式有什么好處雹锣?

struts2框架中使用包來管理Action网沾,包的作用和java中的類包是非常類似的。

主要用于管理一組業(yè)務(wù)功能相關(guān)的action蕊爵。在實(shí)際應(yīng)用中辉哥,我們應(yīng)該把一組業(yè)務(wù)功能相關(guān)的Action放在同一個包下。

13攒射、struts2中的默認(rèn)包struts-default有什么作用醋旦?

1)struts-default包是由struts內(nèi)置的,它定義了struts2內(nèi)部的眾多攔截器和Result類型会放,而Struts2很多核心的功能都是通過這些內(nèi)置的攔截器實(shí)現(xiàn)饲齐,如:從請求中

把請求參數(shù)封裝到action、文件上傳和數(shù)據(jù)驗(yàn)證等等都是通過攔截器實(shí)現(xiàn)的咧最。當(dāng)包繼承了struts-default包才能使用struts2為我們提供的這些功能捂人。

2)struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2默認(rèn)配置文件矢沿。 Struts2每次都會自動加載 struts-default.xml文件先慷。

3)通常每個包都應(yīng)該繼承struts-default包。

14咨察、struts2如何對指定的方法進(jìn)行驗(yàn)證论熙?

1)validate()方法會校驗(yàn)action中所有與execute方法簽名相同的方法;

2)要校驗(yàn)指定的方法通過重寫validateXxx()方法實(shí)現(xiàn)摄狱, validateXxx()只會校驗(yàn)action中方法名為Xxx的方法脓诡。其中Xxx的第一個字母要大寫;

3)當(dāng)某個數(shù)據(jù)校驗(yàn)失敗時媒役,調(diào)用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗(yàn)失敗信息(為了使用addFieldError()方法祝谚,action可以繼承ActionSupport), 如果系統(tǒng) 的fieldErrors包含失敗信息酣衷,struts2會將請求轉(zhuǎn)發(fā)到名為input的result交惯;

4)在input視圖中可以通過<s:fielderror/>顯示失敗信息。

5)先執(zhí)行validateXxxx()->validate()->如果出錯了穿仪,會轉(zhuǎn)發(fā)<result name="input"/>所指定的頁面席爽,如果不出錯,會直接進(jìn)行Action::execute()方法

15啊片、struts2默認(rèn)能解決get和post提交方式的亂碼問題嗎只锻?

不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題紫谷。

16齐饮、請你寫出struts2中至少5個的默認(rèn)攔截器捐寥?

fileUpload 提供文件上傳功能

i18n 記錄用戶選擇的locale

cookies 使用配置的name,value來是指cookies

checkbox 添加了checkbox自動處理代碼,將沒有選中的checkbox的內(nèi)容設(shè)定為false祖驱,而html默認(rèn)情況下不提交沒有選中的checkbox握恳。

chain 讓前一個Action的屬性可以被后一個Action訪問,現(xiàn)在和chain類型的result()結(jié)合使用捺僻。

alias 在不同請求之間將請求參數(shù)在不同名字件轉(zhuǎn)換睡互,請求內(nèi)容不變

17、值棧ValueStack的原理與生命周期陵像?

1)ValueStack貫穿整個 Action 的生命周期,保存在request域中寇壳,所以ValueStack和request的生命周期一樣醒颖。當(dāng)Struts2接受一個請求時,會迅速創(chuàng)建ActionContext壳炎,

ValueStack泞歉,action。然后把a(bǔ)ction存放進(jìn)ValueStack匿辩,所以action的實(shí)例變量可以被OGNL訪問腰耙。 請求來的時候,action铲球、ValueStack的生命開始挺庞,請求結(jié)束,action稼病、 ValueStack的生命結(jié)束选侨;

2)action是多例的,和Servlet不一樣然走,Servelt是單例的援制;

3)每個action的都有一個對應(yīng)的值棧,值棧存放的數(shù)據(jù)類型是該action的實(shí)例芍瑞,以及該action中的實(shí)例變量晨仑,Action對象默認(rèn)保存在棧頂;

4)ValueStack本質(zhì)上就是一個ArrayList拆檬;

5)關(guān)于ContextMap洪己,Struts 會把下面這些映射壓入 ContextMap 中:

parameters : 該 Map 中包含當(dāng)前請求的請求參數(shù)

request : 該 Map 中包含當(dāng)前 request 對象中的所有屬性 session :該 Map 中包含當(dāng)前 session 對象中的所有屬性

application :該 Map 中包含當(dāng)前 application 對象中的所有屬性

attr:該 Map 按如下順序來檢索某個屬性: request, session, application

6)使用OGNL訪問值棧的內(nèi)容時,不需要#號竟贯,而訪問request码泛、session、application澄耍、attr時噪珊,需要加#號晌缘;

7)注意: Struts2中,OGNL表達(dá)式需要配合Struts標(biāo)簽才可以使用痢站。如:<s:property value="name"/>

8)在struts2配置文件中引用ognl表達(dá)式 ,引用值棧的值 磷箕,此時使用的"$",而不是#或者%;

18阵难、ActionContext岳枷、ServletContext、pageContext的區(qū)別呜叫?

1)ActionContext是當(dāng)前的Action的上下文環(huán)境空繁,通過ActionContext可以獲取到request、session朱庆、ServletContext等與Action有關(guān)的對象的引用盛泡;

2)ServletContext是域?qū)ο螅粋€web應(yīng)用中只有一個ServletContext娱颊,生命周期伴隨整個web應(yīng)用傲诵;

3)pageContext是JSP中的最重要的一個內(nèi)置對象,可以通過pageContext獲取其他域?qū)ο蟮膽?yīng)用箱硕,同時它是一個域?qū)ο笏┲瘢饔梅秶会槍Ξ?dāng)前頁面,當(dāng)前頁面結(jié)束時剧罩,pageContext銷毀栓拜,生命周期是JSP四個域?qū)ο笾凶钚〉摹?/p>

19、result的type屬性中有哪幾種結(jié)果類型惠昔?

一共10種:

dispatcher

struts默認(rèn)的結(jié)果類型菱属,把控制權(quán)轉(zhuǎn)發(fā)給應(yīng)用程序里的某個資源不能把控制權(quán)轉(zhuǎn)發(fā)給一個外部資源,若需要把控制權(quán)重定向到一個外部資源, 應(yīng)該使用

redirect結(jié)果類型

redirect 把響應(yīng)重定向到另一個資源(包括一個外部資源)

redirectAction 把響應(yīng)重定向到另一個 Action

freemarker舰罚、velocity纽门、chain、httpheader营罢、xslt赏陵、plainText、stream

20饲漾、攔截器的生命周期與工作過程蝙搔?

1)每個攔截器都是實(shí)現(xiàn)了Interceptor接口的 Java 類;

2)init(): 該方法將在攔截器被創(chuàng)建后立即被調(diào)用, 它在攔截器的生命周期內(nèi)只被調(diào)用一次. 可以在該方法中對相關(guān)資源進(jìn)行必要的初始化考传;

3)intercept(ActionInvocation invocation): 每攔截一個動作請求, 該方法就會被調(diào)用一次吃型;

4)destroy: 該方法將在攔截器被銷毀之前被調(diào)用, 它在攔截器的生命周期內(nèi)也只被調(diào)用一次;

5)struts2中有內(nèi)置了18個攔截器僚楞。

21勤晚、struts2如何完成文件的上傳枉层?

1、JSP頁面:

1)JSP頁面的上傳文件的組件:<s: file name=”upload” />赐写,如果需要一次上傳多個文件, 就必須使用多個 file 標(biāo)簽, 但它們的名字必須是相同的鸟蜡,即: name=“xxx”的值必須一樣;

2)必須把表單的enctype屬性設(shè)置為:multipart/form-data挺邀;

3)表單的方法必須為post揉忘,因?yàn)閜ost提交的數(shù)據(jù)在消息體中,而無大小限制端铛。

2泣矛、對應(yīng)的action:

1)在 Action 中新添加 3 個和文件上傳相關(guān)的屬性;

2)如果是上傳單個文件, uploadImage屬性的類型就是 java.io.File, 它代表被上傳的文件, 第二個和第三個屬性的類型是 String, 它們分別代表上傳文件的文件名和文件類型禾蚕,定義方式是分別是:

jsp頁面file組件的名稱+ContentType, jsp頁面file組件的名稱+FileName

3)如果上上傳多個文件, 可以使用數(shù)組或 List

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末您朽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夕膀,更是在濱河造成了極大的恐慌,老刑警劉巖美侦,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件产舞,死亡現(xiàn)場離奇詭異,居然都是意外死亡菠剩,警方通過查閱死者的電腦和手機(jī)易猫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來具壮,“玉大人准颓,你說我怎么就攤上這事」准耍” “怎么了攘已?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怜跑。 經(jīng)常有香客問我样勃,道長,這世上最難降的妖魔是什么性芬? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任峡眶,我火速辦了婚禮俱恶,結(jié)果婚禮上态兴,老公的妹妹穿的比我還像新娘。我一直安慰自己匹摇,他們只是感情好俊庇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布狮暑。 她就那樣靜靜地躺著鸡挠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪心例。 梳的紋絲不亂的頭發(fā)上宵凌,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音止后,去河邊找鬼瞎惫。 笑死,一個胖子當(dāng)著我的面吹牛译株,可吹牛的內(nèi)容都是我干的瓜喇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼歉糜,長吁一口氣:“原來是場噩夢啊……” “哼乘寒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匪补,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤伞辛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后夯缺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚤氏,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年踊兜,在試婚紗的時候發(fā)現(xiàn)自己被綠了竿滨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡捏境,死狀恐怖于游,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垫言,我是刑警寧澤贰剥,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站筷频,受9級特大地震影響鸠澈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜截驮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一笑陈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葵袭,春花似錦涵妥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窒所。三九已至,卻和暖如春帆锋,著一層夾襖步出監(jiān)牢的瞬間吵取,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工锯厢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皮官,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓实辑,卻偏偏與公主長得像捺氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剪撬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容