Spring MVC會根據請求方法的簽名不同,將請求消息中的信息以一定的方式轉換并綁定到請求方法的參數中。
1.文件上傳
文件上傳,必須將表單的method設置為POST,并將enctype設置為multipart/form-data。只有這樣,才能將文件的二進制數據發送給服務器。
Spring 3.0規范提供了方法來處理文件上傳,但是這種上傳需要在Servlet中完成。而Spring MVC封裝了上傳功能,使用了Apache Commons FileUpload技術來實現了一個MultipartResolver實現類。
Spring MVC依賴的組件包
xml配置
1
2
3
4
5
6
7
8
|
< bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > < property name = "maxUploadSize" > < value >10485760</ value > </ property > < property name = "defaultEncoding" > < value >UTF-8</ value > </ property > </ bean > |
后臺代碼
新建上傳FileModel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class FileDataModel implements Serializable { private String filename; private MultipartFile file; public String getFilename() { return filename; } public void setFilename(String filename) { this .filename = filename; } public MultipartFile getFile() { return file; } public void setFile(MultipartFile file) { this .file = file; } } |
Controller代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Controller @RequestMapping ( "file" ) public class FileController { @RequestMapping ( "upload" ) public String upload() { return "upload" ; } @RequestMapping (value = "upload" , method = RequestMethod.POST) public String uoload(FileDataModel fileDataModel, HttpServletRequest request, Model model) { FileResult fileResult = new FileResult(); try { if (fileDataModel.getFilename().isEmpty() || fileDataModel.getFile() == null ) throw new IllegalArgumentException( "上傳文件名稱為空或者無上傳文件" ); String filePath = request.getServletContext().getRealPath( "/files" ); String filename = fileDataModel.getFile().getOriginalFilename(); File savePath = new File(filePath, filename); if (!savePath.getParentFile().exists()) savePath.getParentFile().mkdir(); fileDataModel.getFile().transferTo( new java.io.File(filePath + java.io.File.separator + filename)); fileResult.setTitle( "上傳成功" ); fileResult.setMessage( "上傳成功" ); fileResult.setSuccess( true ); } catch (Exception ex) { fileResult.setTitle( "上傳失敗!" ); fileResult.setMessage(ex.getMessage()); } model.addAttribute( "fileResult" , fileResult); return "fileresult" ; } } |
前臺JSP頁面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<%@ page contentType= "text/html;charset=UTF-8" language= "java" %> <html> <head> <title>Upload</title> </head> <body> <form action= "/file/upload" enctype= "multipart/form-data" method= "post" > <table> <tr> <td>文件描述:</td> <td><input type= "text" name= "filename" /></td> </tr> <tr> <td>請選擇文件:</td> <td><input type= "file" name= "file" /></td> </tr> <tr> <td> <input type= "submit" value= "上傳" /> </td> </tr> </table> </form> </body> </html> |
1.1Spring MVC的MultipartFile的常用方法
獲取文件數據
1.[] getBytes() throws IOException;
獲取文件的MIME類型,如image/jpeg等
2.String getContentType();
獲取文件流
3.InputStream getInputStream() throws IOException;
獲取表單中文件組件的名字
4.String getName();
獲取上傳文件的原名
5.String getOriginalFilename();
獲取文件的字節大小,單位為byte
6.long getSize();
是否有上傳的文件
7.boolean isEmpty();
將上傳文件保存到一個目標文件中
8.void transferTo(File dest) throws IOException, IllegalStateException;
2.文件下載
Spring MVC提供了一個ResponseEntity類型,使用它可以很方便的定義返回的HttpHeader和HttpStatus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@RequestMapping ( "download" ) public ResponseEntity< byte []> download(HttpServletRequest request, @RequestParam ( "filename" ) String filename, Model model) { ResponseEntity< byte []> responseEntity = null ; try { String path = request.getServletContext().getRealPath( "/files" ); String realPath = path + File.separator + filename; File file = new File(realPath); HttpHeaders headers = new HttpHeaders(); String downFileName = new String(filename.getBytes( "UTF-8" ), "iso-8859-1" ); //通知瀏覽器以attachment(下載方式)打開圖片 headers.setContentDispositionFormData( "attachment" , downFileName); //以二進制流數據方式進行下載 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); responseEntity = new ResponseEntity< byte []>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); } catch (Exception ex) { ex.printStackTrace(); } return responseEntity; |
1
2
3
4
5
6
7
8
9
10
|
<%@ page contentType= "text/html;charset=UTF-8" language= "java" %> <html> <head> <title>${requestScope.fileResult.title}</title> </head> <body> <h1>${requestScope.fileResult.message}</h1><br/> <a href= "/file/download?filename=${requestScope.fileResult.fileName}" rel= "external nofollow" >${requestScope.fileResult.fileName}</a> </body> </html> |
3.攔截器
Interceptor攔截器是Spring MVC中相當重要的功能,它的功能作用是攔截用戶的請求并進行相對應的處理。比如通過攔截器進行用戶權限驗證,或者判斷用戶是否已經登錄等。
Spring MVC 攔截器是可插拔式的設計。如果需要使用某個攔截器,只需要在配置文件中應用攔截器即可。
3.1 HandlerInterceptor接口
Spring MVC中的Interceptor攔截器請求是通過實現HandlerInterceptor接口來完成的。
3.2實現攔截器
1.自定義類實現Spring的HandlerInterceptor接口
重要接口
該請求方法將在請求處理之前被調用。這個方法的作用是對進行調用方法前進行一些前置初始化操作,進行判斷用戶請求是否可以進行下去。當方法返回false的時候,后續的Interceptor及Controller都不會繼續執行。
1
2
|
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; |
該方法是在perHandle返回true時,在調用目標方法處理之后,在返回視圖之前調用。這時候我們可以針對Controller處理之后的ModelAndView對象進行操作。
1
2
3
|
void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; |
該方法是在整個請求處理結束之后,也就是在DispatcherServlet渲染了對應的視圖之后執行。主要用于清理資源。
1
2
3
|
void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; |
2.自定義類繼承HandlerInterceptorAdapter
代碼演示
實現HandlerInterceptor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public class AuthorizationInterceptor implements HandlerInterceptor { /** * 不攔截用戶登錄頁面及注冊頁面 */ private static final String[] IGNORE_URI = { "user/login" , "user/signup" }; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { boolean flag = false ; String servletPath = request.getServletPath(); for (String url : IGNORE_URI) { if (servletPath.contains(url)) { flag = true ; break ; } } if (!flag) { User user = (User) request.getSession().getAttribute( "user" ); if (user == null ) { request.setAttribute( "message" , "請先登錄再訪問網站" ); request.getRequestDispatcher( "user/login" ).forward(request, response); } else flag = true ; } return flag; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } } |
xml配置
1
2
3
4
5
6
|
< mvc:interceptors > < mvc:interceptor > < mvc:mapping path = "/home/index" /> < bean class = "utils.AuthorizationInterceptor" /> </ mvc:interceptor > </ mvc:interceptors > |
當訪問home/index的時候需要進行驗證
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.jianshu.com/p/0e936395066b?utm_source=tuicool&utm_medium=referral