文件的上傳+下載+表單的重複提交問題 +自定義攔截器:

1. 文件的上傳+下載+表單的重複提交問題 +自定義攔截器:

1). 表單需要注意的 3 點

2). Struts2 的文件上傳實際上使用的是 Commons FileUpload 組件, 所以需要導入

commons-fileupload-1.3.jar
commons-io-2.0.1.jar

3). Struts2 進行文件上傳需要使用 FileUpload 攔截器

4). 基本的文件的上傳: 直接在 Action 中定義如下 3 個屬性, 並提供對應的 getter 和 setter

//文件對應的 File 對象
private File [fileFieldName];
//文件類型
private String [fileFieldName]ContentType;
//文件名
private String [fileFieldName]FileName;

5). 使用 IO 流進行文件的上傳即可.

6). 一次傳多個文件怎麼辦 ?

若傳遞多個文件, 則上述的 3 個屬性, 可以改爲 List 類型! 多個文件域的 name 屬性值需要一致.

7). 可以對上傳的文件進行限制嗎 ? 例如擴展名, 內容類型, 上傳文件的大小 ? 若可以, 則若出錯, 顯示什麼錯誤消息呢 ? 消息可以定製嗎 ?

可以的!

可以通過配置 FileUploadInterceptor 攔截器的參數的方式來進行限制

maximumSize (optional) - 默認的最大值爲 2M. 上傳的單個文件的最大值

allowedTypes (optional) - 允許的上傳文件的類型. 多個使用 , 分割

allowedExtensions (optional) - 允許的上傳文件的擴展名. 多個使用 , 分割.

注意: 在 org.apache.struts2 下的 default.properties 中有對上傳的文件總的大小的限制. 可以使用常量的方式來修改該限制

struts.multipart.maxSize=2097152

定製錯誤消息. 可以在國際化資源文件中定義如下的消息:

struts.messages.error.uploading - 文件上傳出錯的消息

struts.messages.error.file.too.large - 文件超過最大值的消息

struts.messages.error.content.type.not.allowed - 文件內容類型不合法的消息

struts.messages.error.file.extension.not.allowed - 文件擴展名不合法的消息

問題: 此種方式定製的消息並不完善. 可以參考 org.apache.struts2 下的 struts-messages.properties, 可以提供更多的定製信息.

2. 文件的下載:

1). Struts2 中使用 type="stream" 的 result 進行下載即可

2). 具體使用細節參看 struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html

3). 可以爲 stream 的 result 設定如下參數

contentType: 結果類型
contentLength: 下載的文件的長度
contentDisposition: 設定 Content-Dispositoin 響應頭. 該響應頭指定接應是一個文件下載類型, 一般取值爲  attachment;filename="document.pdf".

inputName: 指定文件輸入流的 getter 定義的那個屬性的名字. 默認爲 inputStream

bufferSize: 緩存的大小. 默認爲 1024
allowCaching: 是否允許使用緩存
contentCharSet: 指定下載的字符集

4). 以上參數可以在 Action 中以 getter 方法的方式提供!

3. 表單的重複提交問題

1). 什麼是表單的重複提交

    > 在不刷新表單頁面的前提下: 
        >> 多次點擊提交按鈕
        >> 已經提交成功, 按 "回退" 之後, 再點擊 "提交按鈕".
        >> 在控制器響應頁面的形式爲轉發情況下,若已經提交成功, 然後點擊 "刷新(F5)"

    > 注意:
        >> 若刷新表單頁面, 再提交表單不算重複提交
        >> 若使用的是 redirect 的響應類型, 已經提交成功後, 再點擊 "刷新", 不是表單的重複提交

2). 表單重複提交的危害:             

3). Struts2 解決表單的重複提交問題:

I. 在 s:form 中添加 s:token 子標籤

    > 生成一個隱藏域
    > 在 session 添加一個屬性值
    > 隱藏域的值和 session 的屬性值是一致的.

II. 使用 Token 或 TokenSession 攔截器.

    > 這兩個攔截器均不在默認的攔截器棧中, 所以需要手工配置一下
    > 若使用 Token 攔截器, 則需要配置一個 token.valid 的 result
    > 若使用 TokenSession 攔截器, 則不需要配置任何其它的 result

III. Token VS TokenSession

    > 都是解決表單重複提交問題的
    > 使用 token 攔截器會轉到 token.valid 這個 result
    > 使用 tokenSession 攔截器則還會響應那個目標頁面, 但不會執行 tokenSession 的後續攔截器. 就像什麼都沒發生過一樣!

IV. 可以使用 s:actionerror 標籤來顯示重複提交的錯誤消息.
該錯誤消息可以在國際化資源文件中覆蓋. 該消息可以在 struts-messages.properties 文件中找到

struts.messages.invalid.token=^^The form has already been processed or no token was supplied, please try again.

4. 自定義攔截器

1). 具體步驟

I. 定義一個攔截器的類

    > 可以實現 Interceptor 接口
    > 繼承 AbstractInterceptor 抽象類

II. 在 struts.xml 文件配置.   

    <interceptors>

        <interceptor name="hello" class="com.atguigu.struts2.interceptors.MyInterceptor"></interceptor>

    </interceptors>

    <action name="testToken" class="com.atguigu.struts2.token.app.TokenAction">
        <interceptor-ref name="hello"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
        <result>/success.jsp</result>
        <result name="invalid.token">/token-error.jsp</result>
    </action>

III. 注意: 在自定義的攔截器中可以選擇不調用 ActionInvocation 的 invoke() 方法. 那麼後續的攔截器和 Action 方法將不會被調用.
Struts 會渲染自定義攔截器 intercept 方法返回值對應的 result
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章