文件的上傳+下載+表單的重複提交問題 +自定義攔截器:
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.