mybatis랑 연동해서 사용할 것이기때문에 web.xml부터 설정한다
[web.xml]
1 2 3 4 5 6 7 8 9 10 11 12 13 | <servlet> <servlet-name>dispatcherNonHtml</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mybatis.xml,/WEB-INF/dispatcherNonHtml-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherNonHtml</servlet-name> <url-pattern>/download/*</url-pattern> </servlet-mapping> | cs |
<param-value> 태그로 하나의 요청이 들어왔을때 dispatcher가 읽어들일 xml을 직접 명시해준다.
이번 예제같은 경우는 mybatis.xml과 dispatcherNonHtml-servlet.xml 두개를 쓰기위해 init-param태그를 썻다.
또 하나, 지금까지 url-pattern으로 요청이 들어왔을때 자동으로 servlet-name과 이름이 같은
서블릿이름-servlet.xml 을 읽어들인다고 했는데
init-param 태그로 여러개의 xml을 설정할때에는 서블릿이름과 같은 xml도 반드시 명시해주어야한다
[dispatcherNonHtml.xml]
1 2 3 4 5 6 7 | <context:annotation-config /> <context:component-scan base-package="login.controller,spring.view,excel.controller,excel.view,spring.jdbc,ajax.controller" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" /> | cs |
내가 사용할 Controller와 Bean객체로 사용할 패키지를 전부 스캔한다.
그 후
1 | <a href = "download/addData">mybatis연동 엑셀다운로드</a><br> | cs |
링크로 요청을하면 요청에 맞는 servlet이 작동한다
'/addData' 에 맞는 RequestMapping을 찾아간다.
[PageRanksController.java]
1 2 3 4 5 6 | @RequestMapping("/addData") public ModelAndView addFileData() { List<FileDataDTO> dataList = service.listFileData(); return new ModelAndView("addData", "dataList", dataList); } | cs |
List에 mybatis랑 연동한 데이터를 들고와서 저장한다
그것을 ModelAndView 객체에 'viewName'과 'modelname' , 데이터 로 return한다
ModelAndView로 리턴했으니 viewName을 viewResolver가 받아서 수행한다.
1 2 | <bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" /> | cs |
viewResolver가 BeanName이므로, view페이지에 뿌릴 내용들을 수행할 beanname을 찾아간다.
난 addData로 viewName을 보냈으니 addData라는 이름을 가진 bean객체를 찾아간다.
[PageFileView.java]
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | package excel.view; @Component("addData") public class PageFileView extends AbstractXlsView { @SuppressWarnings("unchecked") protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setHeader("Content-Disposition", "attachment; filename=\"fileData.xls\";"); Sheet sheet = createFirstSheet(workbook); //시트를 만들어주는 메서드 createColumnLabel(sheet); //시트의 이름과 사이즈를 지정해주는 메서드 List<FileDataDTO> fileDataList = (List<FileDataDTO>) model.get("dataList"); //모델데이터를 사용하기위해 .get modelName으로 보낸걸로 get한다. int rowNum = 1; for (FileDataDTO fileDataDTO : fileDataList) { createPageRankRow(sheet, fileDataDTO, rowNum++); //엑셀의 '셀'에 내용을 담아 만들어주는 메서드. /* List에 있는 내용을 꺼내서 DTO에 담고 1. createColumnLabel() 로 실행해 첫번째 줄 행의 데이터를담고 2. createPageRankRow() 를 실행할때에는 list의 길이만큼 돌리는데 첫번째 row에서 다음 row로 이동해야하기때문에 int rowNum = 1; 로 선언한 후에 메서드를 실행한다 */ } } private Sheet createFirstSheet(Workbook workbook) { Sheet sheet = workbook.createSheet(); workbook.setSheetName(0, "FileData"); sheet.setColumnWidth(1, 256 * 20); return sheet; } private void createColumnLabel(Sheet sheet) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, InstantiationException { Row firstRow = sheet.createRow(0); //맨 첫번째 행과 열을 가진 셀 //1번째 행 + A번째 열 Cell cell = null; Class<FileDataDTO> empClass = FileDataDTO.class; Field[] fields = empClass.getDeclaredFields(); System.out.println("fields : " + fields); for(int i =0; i < fields.length; i++) { Field f = fields[i]; f.setAccessible(true); cell = firstRow.createCell(i); cell.setCellValue(f.getName()); System.out.println("f.getName() : " + f.getName()); } /* for (Field f : fields) { f.setAccessible(true); cell = firstRow.createCell(i++); cell.setCellValue(f.getName()); System.out.println("f.getName() : " + f.getName()); }*/ } private void createPageRankRow(Sheet sheet, FileDataDTO fileDataDTO, int rowNum) { Row row = sheet.createRow(rowNum); Cell cell = row.createCell(0); cell.setCellValue(fileDataDTO.getOrig_name()); cell = row.createCell(1); cell.setCellValue(fileDataDTO.getRegdate()); cell = row.createCell(2); cell.setCellValue(fileDataDTO.getSno()); cell = row.createCell(3); cell.setCellValue(fileDataDTO.getSys_name()); cell = row.createCell(4); cell.setCellValue(fileDataDTO.getF_size()); } } | cs |
'JAVA > Spring' 카테고리의 다른 글
Spring MVC - 파일다운로드(view,model설정법) (0) | 2018.09.20 |
---|---|
Spring MVC - Tiles로 jsp구성하기 (1) | 2018.09.20 |
Spring MVC - itemLabel, itemValue 예제. (1) | 2018.09.19 |
Spring이 제공하는 폼 관련 커스텀 태그(밑에 글과 연동) (5) | 2018.09.19 |
Spring MVC - 두번째 LoginController (0) | 2018.09.19 |