1. 程式人生 > >SSM框架——springmvc檔案上傳和攔截器

SSM框架——springmvc檔案上傳和攔截器

檔案上傳 1.檔案上傳前提 form表單的enctype取值必須是:mutipart/form-data(預設值是:application/x-www-form-urlencoded) method屬性取值必須是Post 提供一個檔案選擇域

2.使用 Commons-fileupload 元件實現檔案上傳,需要匯入該元件相應的支撐 jar 包:Commons-fileupload 和commons-io。因為Commons-fileupload 元件從 1.1 版本開始,需要 commons-io 包的支援。

3.jsp頁面

<h3>傳統檔案上傳</h3>
    <form action="/upload/fileupload1" method="post" enctype="multipart/form-data">
        選擇檔案:<input type="file" name="upload" /><br/>
        <input type="submit" value="上傳" />
    </form>

<h3>Springmvc檔案上傳</h3>
    <form action="/upload/fileupload2" method="post" enctype="multipart/form-data">
        選擇檔案:<input type="file" name="upload" /><br/>
        <input type="submit" value="上傳" />
    </form>

<h3>跨伺服器檔案上傳</h3>
    <form action="/upload/fileupload3" method="post" enctype="multipart/form-data">
        選擇檔案:<input type="file" name="upload" /><br/>
        <input type="submit" value="上傳" />
    </form>

一、傳統方式上傳 1.檔案上傳程式碼

public String fileupload1(HttpServletRequest request) throws Exception {
        //上傳的位置
        String path = request.getSession().getServletContext().getRealPath( "/uploads/" );
        //判斷該路徑是否存在
        File file = new File( path );
        if (!file.exists()){
            //建立該檔案
            file.mkdir();
        }
        //解析request物件,獲取上傳檔案項
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload( factory );
        //解析request
        List<FileItem> fileItems = upload.parseRequest( request );
        //遍歷
        for (FileItem item : fileItems) {
            //進行判斷,當前item是否是要上傳的檔案
            if (item.isFormField()){
                //普通表單項
            }else {
                //上傳檔案項
                //獲取上傳檔案的名稱
                String fileName = item.getName();
                //把檔名稱設定成唯一值
                String uuid = UUID.randomUUID().toString().replace( "-", "" );
                fileName=uuid+"_"+fileName;
                //完成檔案上傳
                item.write( new File( path,fileName ) );
                //刪除臨時檔案
                item.delete();
            }
        }
        return "success";
    }

二、springmvc方式上傳 1.表單提交後前端控制器要經過檔案解析器處理檔案後回到前端控制器去呼叫方法,在springmvc.xml中配置

<!--配置檔案解析器物件-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--配置最大檔案大小-->
        <property name="maxUploadSize" value="10485760" />
    </bean>

2.修改傳統方式程式碼: 在方法中加一個引數:MultipartFile upload,引數名稱必須和表單的name屬性一樣,用upload物件獲取檔名稱和完成檔案上傳。

@RequestMapping("/fileupload2")
    public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        //上傳的位置
        String path = request.getSession().getServletContext().getRealPath( "/uploads/" );
        //判斷該路徑是否存在
        File file = new File( path );
        if (!file.exists()){
            //建立該檔案
            file.mkdir();
        }
        //獲取上傳檔案的名稱
        String filename = upload.getOriginalFilename();
        //把檔名稱設定成唯一值
        String uuid = UUID.randomUUID().toString().replace( "-", "" );
        filename=uuid+"_"+filename;
        //完成檔案上傳
        upload.transferTo( new File( path,filename ) );
        return "success";
    }

三、跨伺服器檔案上傳 1.搭建圖片伺服器 建立新的tomcat,跟之前的埠號不同,設定成了(9090);建立新的專案部署到新的tomcat上 2.匯入依賴

<dependency>
	<groupId>com.sun.jersey</groupId>
	<artifactId>jersey-core</artifactId>
	<version>1.18.1</version>
</dependency>
<dependency>
	<groupId>com.sun.jersey</groupId>
	<artifactId>jersey-client</artifactId>
	<version>1.18.1</version>
</dependency>

2.實現上傳:目標伺服器中需要有uploads路徑

@RequestMapping("/fileupload3")
public String fileupload3(MultipartFile upload) throws Exception {
	// 定義圖片伺服器的請求路徑
	String path = "http://localhost:9090/targetService/uploads/";
	// 獲取到上傳檔案的名稱
	String filename = upload.getOriginalFilename();
	String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
	// 把檔案的名稱唯一化
	filename = uuid+"_"+filename;
	// 向圖片伺服器上傳檔案
	// 建立客戶端物件
	Client client = Client.create();
	// 連線圖片伺服器
	WebResource webResource = client.resource(path+filename);
	// 上傳檔案
	webResource.put(upload.getBytes());
	return "success";
}

異常處理和攔截器 一、異常處理 Controller呼叫service,service呼叫dao,異常都是向上丟擲的,最終由DispatcherServlet找異常處理器進行異常的處理。 二、攔截器 1.攔截器概述:springmvc的處理器攔截器類似於Servlet開發中的過濾器Filter,用來對處理器進行預處理和後處理。過濾器用來攔截後臺資源。攔截器是AOP思想的一種實現方式。 2.過濾器和攔截器區別 過濾器是Servlet規範的一部分,任何框架都可以使用過濾器技術。攔截器是SpringMVC框架獨有的。 過濾器配置了/*,可以攔截任何資源。攔截器只會對控制器中的方法進行攔截。 3.自定義攔截器: 建立類,實現HandlerInterceptor介面,重寫需要的方法

public class MyInterceptor implements HandlerInterceptor{
	/**
	* controller方法執行前,進行攔截的方法
	* return true放行,return false攔截
	* 可以使用轉發或者重定向直接跳轉到指定的頁面。
	*/
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {
		System.out.println("攔截器執行了...");
		return true;
		}
}

在springmvc.xml中配置攔截器類(可配置多個攔截器物件)

<!-- 配置攔截器 -->
<mvc:interceptors>
	<mvc:interceptor>
		<!-- 哪些方法進行攔截 -->
		<mvc:mapping path="/user/*"/>
		<!-- 哪些方法不進行攔截<mvc:exclude-mapping path=""/>-->
		<!-- 註冊攔截器物件 -->
		<bean class="cn.itcq.demo1.MyInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>

4.HandlerInterceptor介面使用 preHandle方法是controller方法執行前攔截的方法 可以使用request或者response跳轉到指定的頁面 return true放行,執行下一個攔截器,如果沒有攔截器,執行controller中的法。 return false不放行,不會執行controller中的方法。 2. postHandle是controller方法執行後執行的方法,在JSP檢視執行前。 可以使用request或者response跳轉到指定的頁面 如果指定了跳轉的頁面,那麼controller方法跳轉的頁面將不會顯示。 3. postHandle方法是在JSP執行後執行 request或者response不能再跳轉頁面了