Html 5 的有一些File API,對Form表單增強的特性,讓我們輕松支持多文件上傳,看下面的Html片斷代碼:
創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括成都做網(wǎng)站、成都網(wǎng)站建設(shè)、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)建站為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)建站核心團隊十載專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。
form action="/Home/Upload" enctype="multipart/form-data" id="form2" method="post"
input type="file" name="fileToUpload" id="fileToUpload2" multiple="multiple" /
input type="submit" value="submit" /
/form
那在Asp.net MVC web application中,我們可以這么實現(xiàn):
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data", id = "form2" }))
{
label for="file"Upload Image:/label
input type="file" name="fileToUpload" id="fileToUpload2" multiple="multiple" /
input type="submit" value="Upload Image by submit" /
}
假設(shè)這是一個HomeController下View, 即將提交到Upload的Action,看下面服務(wù)端的代碼:
[HttpPost]
public ActionResult Upload(HttpPostedFileBase[] fileToUpload)
{
foreach (HttpPostedFileBase file in fileToUpload)
{
string path = System.IO.Path.Combine(Server.MapPath("~/App_Data"), System.IO.Path.GetFileName(file.FileName));
file.SaveAs(path);
}
ViewBag.Message = "File(s) uploaded successfully";
return RedirectToAction("Index");
}
@Order(2)
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
SpringMVC 中的Interceptor 攔截器也是相當(dāng)重要和相當(dāng)有用的,它的主要作用是攔截用戶的請求并進行相應(yīng)的處理。比如通過它來進行權(quán)限驗證,或者是來判斷用戶是否登陸,或者是像12306 那樣子判斷當(dāng)前時間是否是購票時間。
1、定義Interceptor的實現(xiàn)類
SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實現(xiàn)的。在SpringMVC 中定義一個Interceptor 非常簡單,主要有兩種方式:
第一種方式是要定義的Interceptor類要實現(xiàn)了Spring 的HandlerInterceptor
接口,或者是這個類繼承實現(xiàn)了HandlerInterceptor 接口的類,比如Spring
已經(jīng)提供的實現(xiàn)了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;
第二種方式是實現(xiàn)Spring的WebRequestInterceptor接口,或者是繼承實現(xiàn)了WebRequestInterceptor的類。
2、實現(xiàn)HandlerInterceptor接口
HandlerInterceptor 接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進行攔截處理的。
(1 )preHandle (HttpServletRequest
request, HttpServletResponse response, Object handle)
方法,顧名思義,該方法將在請求處理之前進行調(diào)用。SpringMVC 中的Interceptor
是鏈?zhǔn)降恼{(diào)用的,在一個應(yīng)用中或者說是在一個請求中可以同時存在多個Interceptor 。每個Interceptor
的調(diào)用會依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor
中的preHandle
方法,所以可以在這個方法中進行一些前置初始化操作或者是對當(dāng)前請求的一個預(yù)處理,也可以在這個方法中進行一些判斷來決定請求是否要繼續(xù)進行下去。該方法
的返回值是布爾值Boolean 類型的,當(dāng)它返回為false 時,表示請求結(jié)束,后續(xù)的Interceptor 和Controller
都不會再執(zhí)行;當(dāng)返回值為true 時就會繼續(xù)調(diào)用下一個Interceptor 的preHandle
方法,如果已經(jīng)是最后一個Interceptor 的時候就會是調(diào)用當(dāng)前請求的Controller 方法。
(2 )postHandle (HttpServletRequest
request, HttpServletResponse response, Object handle, ModelAndView
modelAndView) 方法,由preHandle 方法的解釋我們知道這個方法包括后面要說到的afterCompletion
方法都只能是在當(dāng)前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調(diào)用。postHandle
方法,顧名思義就是在當(dāng)前請求進行處理之后,也就是Controller 方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet
進行視圖返回渲染之前被調(diào)用,所以我們可以在這個方法中對Controller 處理之后的ModelAndView
對象進行操作。postHandle 方法被調(diào)用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor
的postHandle 方法反而會后執(zhí)行,這和Struts2 里面的Interceptor 的執(zhí)行過程有點類型。Struts2
里面的Interceptor
的執(zhí)行過程也是鏈?zhǔn)降?,只是在Struts2 里面需要手動調(diào)用ActionInvocation 的invoke
方法來觸發(fā)對下一個Interceptor 或者是Action 的調(diào)用,然后每一個Interceptor 中在invoke
方法調(diào)用之前的內(nèi)容都是按照聲明順序執(zhí)行的,而invoke 方法之后的內(nèi)容就是反向的。
(3
)afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handle, Exception ex) 方法,該方法也是需要當(dāng)前對應(yīng)的Interceptor
的preHandle 方法的返回值為true 時才會執(zhí)行。顧名思義,該方法將在整個請求結(jié)束之后,也就是在DispatcherServlet
渲染了對應(yīng)的視圖之后執(zhí)行。這個方法的主要作用是用于進行資源清理工作的。
下面是一個簡單的代碼說明:
[java] view plain copy
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SpringMVCInterceptor implements HandlerInterceptor {
/**
* preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行調(diào)用,SpringMVC中的Interceptor攔截器是鏈?zhǔn)降?,可以同時存在
* 多個Interceptor,然后SpringMVC會根據(jù)聲明的前后順序一個接一個的執(zhí)行,而且所有的Interceptor中的preHandle方法都會在
* Controller方法調(diào)用之前調(diào)用。SpringMVC的這種Interceptor鏈?zhǔn)浇Y(jié)構(gòu)也是可以進行中斷的,這種中斷方式是令preHandle的返
* 回值為false,當(dāng)preHandle的返回值為false的時候整個請求就結(jié)束了。
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
return false;
}
/**
* 這個方法只會在當(dāng)前這個Interceptor的preHandle方法返回值為true的時候才會執(zhí)行。postHandle是進行處理器攔截用的,它的執(zhí)行時間是在處理器進行處理之
* 后,也就是在Controller的方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet進行視圖的渲染之前執(zhí)行,也就是說在這個方法中你可以對ModelAndView進行操
* 作。這個方法的鏈?zhǔn)浇Y(jié)構(gòu)跟正常訪問的方向是相反的,也就是說先聲明的Interceptor攔截器該方法反而會后調(diào)用,這跟Struts2里面的攔截器的執(zhí)行過程有點像,
* 只是Struts2里面的intercept方法中要手動的調(diào)用ActionInvocation的invoke方法,Struts2中調(diào)用ActionInvocation的invoke方法就是調(diào)用下一個Interceptor
* 或者是調(diào)用action,然后要在Interceptor之前調(diào)用的內(nèi)容都寫在調(diào)用invoke之前,要在Interceptor之后調(diào)用的內(nèi)容都寫在調(diào)用invoke方法之后。
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
/**
* 該方法也是需要當(dāng)前對應(yīng)的Interceptor的preHandle方法的返回值為true時才會執(zhí)行。該方法將在整個請求完成之后,也就是DispatcherServlet渲染了視圖執(zhí)行,
* 這個方法的主要作用是用于清理資源的,當(dāng)然這個方法也只能在當(dāng)前這個Interceptor的preHandle方法的返回值為true時才會執(zhí)行。
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
3、定義的攔截器類加到SpringMVC的攔截體系中
[html] view plain copy
span style="font-size:12px;" mvc:interceptors
!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 --
bean class="com.host.app.web.interceptor.AllInterceptor"/
mvc:interceptor
mvc:mapping path="/test/number.do"/
!-- 定義在mvc:interceptor下面的表示是對特定的請求才進行攔截的 --
bean class="com.host.app.web.interceptor.LoginInterceptor"/
/mvc:interceptor
/mvc:interceptors/span
由上面的示例可以看出可以利用mvc:interceptors標(biāo)簽聲明一系列的攔截器,然后它們就可以形成一個攔截器鏈,攔截器的執(zhí)行順序是按聲明的先
后順序執(zhí)行的,先聲明的攔截器中的preHandle方法會先執(zhí)行,然而它的postHandle方法和afterCompletion方法卻會后執(zhí)
行。
在mvc:interceptors標(biāo)簽下聲明interceptor主要有兩種方式:
(1)直接定義一個Interceptor實現(xiàn)類的bean對象。使用這種方式聲明的Interceptor攔截器將會對所有的請求進行攔截。
(2)使用mvc:interceptor標(biāo)簽進行聲明。使用這種方式進行聲明的Interceptor可以通過mvc:mapping子標(biāo)簽來定義需要進行攔截的請求路徑。
經(jīng)過上述兩步之后,定義的攔截器就會發(fā)生作用對特定的請求進行攔截了。
分享名稱:mvchtml5,mvc 5
文章位置:http://m.rwnh.cn/article12/dsdhhgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、微信小程序、標(biāo)簽優(yōu)化、網(wǎng)站內(nèi)鏈、自適應(yīng)網(wǎng)站、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)