해결 방법


Project (마우스 오른쪽) > Properties > Project Facets


Java Version 설정 해당 버전으로 바꿔준다. 아래 그림을 참고 하자.



1. unzip


yum install unzip


2. Execute


unzip xxx.zip


About


아직 Beta 버전이지만 Eclipse 보다 IntelliJ 가 속도적인 측면에서도 뛰어나고, 다중 프로젝트 관리가 아닌, 단일 프로젝트 관리이기 때문에 개발하는대 있어 훨씬 편하다고 생각 한다.


Installation


  1. Java
  2. Android Studio
  3. Execute


1. JAVA



JAVA 기반으로 동작 하기 때문에 JDK (Java SE Development Kit) 우선 적으로 설치 해야 한다.
원하는 버전으로 설치 하도록 한다.


IntelliJ 를 사용하기 위해서는 JDK 경로 설정을 해줘야 한다. JAVA_HOME 설정을 하자.


2. Android Studio



원하는 버전을 다운로드 하여 설치를 진행 한다. Windows 환경이기 때문에 next 버튼만 잘 본다면 설치가 완료 되었을 것이다.


3. Execute


  • 32bit - D:\Project\android-studio\bin\studio.exe
  • 64bit - D:\Project\android-studio\bin\studio64.exe

설치 경로에 들어가보면 bin 폴더가 있다. 실행 명령어는 보통 bin 에 저장되어 있다. OS 버전에 맞게 위 경로를 참고하여 실행 하자.


Sample


<c:forEach var="entry" items="${sampleMap}">
    Key: <c:out value="${entry.key}"/>
    Value: <c:out value="${entry.value}"/>
</c:forEach>

참고사이트


설명


HashMap의 경우에는 무작위로 Key, Value 가 들어간다. 활용 용도에 따라서 정렬이 필요 할수 있는대 TreeMap 에서 제공 하고 있다. 기본적인 Map에 정렬 기능이 추가 되있다고 생각하면 되겠다.


Sample


private Map<String, String> testMaps() {
    Map<String, String> testMaps = new HashMap<String, String>();

    // Doing (PUT)

    testMaps = new TreeMap<String, String>(actionCodes);

    logger.debug(testMaps.toString()); // ASC
    logger.debug(testMaps.descendingMap().toString()); // DESC

    return testMaps;
}


TreeMap은 객체 생성 시 Map을 생성자 인자로 받게 되어 있다. 오름차순 정렬이 기본이다. 내림차순을 이용하려면 descendingMap() 메소드를 사용하자.


참고사이트


설명


Spring MVC 에서 Excel 기능을 제공하는 View 가 있다.


  • AbstractExcelView (라이브러리에서 제공 하는 소스 일부 이다.)
@Component("AbstractExcelView")
public abstract class AbstractExcelView extends AbstractView {

    @Override
    protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // doing
    }

    /**
     * Subclasses must implement this method to create an Excel HSSFWorkbook document,
     * given the model.
     * @param model the model Map
     * @param workbook the Excel workbook to complete
     * @param request in case we need locale etc. Shouldn't look at attributes.
     * @param response in case we need to set cookies. Shouldn't write to it.
     */
    protected abstract void buildExcelDocument(
            Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response)
            throws Exception;
}


AbstractView 기능을 구현하기 위해서는 기본적으로 renderMergedOutputModel 메소드를 구현해야 한다. 시점은 Controller 처리 후 라고 보면 쉽게 이해 할 수 있다. model 값은 Controller 에서 modelMap, ModelAndView 에 넣었던 데이터들 이라고 생각 하면 된다.


AbstractExcelView 의 경우에는 Excel 생성 부분 buildExcelDocument 메소드만 Override 하여 구현 하면 됬는대, 인자로 넘어오는 HSSFWorkbook 는 Excel2003 버전을 지원 한다. 확장자 (.xls) 그 이상 버전을 지원하는 poi 라이브러리를 사용 하는 경우 AbstractView 를 직접 구현해야 한다.


적용 방법

1. Dependency Library 추가


<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.10.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.10.1</version>
</dependency>


2. SampleController 구현 하기


  • SampleController
@Controller("SampleController")
public class SampleController {

    @RequestMapping(value="/sample", method=RequestMethod.POST)
    public ModelAndView sample () {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("SampleExcelView");

        return mav;
    }

}


3. SampleExcelView 구현 하기


  • SampleExcelView
@Component("SampleExcelView")
public class SampleExcelView extends AbstractView {

    /** The content type for an Excel response */
    private static final String CONTENT_TYPE = "application/vnd.ms-excel";

    public AdminExcelView() {
        setContentType(CONTENT_TYPE);
    }

    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            Workbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = (XSSFSheet) workbook.createSheet();

            // Doing

            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);

            if (out != null) out.close();
        } catch (Exception e) {
            throw e;
        }
    }
}


Doing 부분을 AbstractExcelView 의 buildExcelDocument 구현하는 것 처럼 작성 하면 Excel2007 이상 지원하는 (.xlsx) 파일을 작성 할 수 있다.


참고 사이트


문제 발생


Maven Dependencies 라이브러리가 Tomcat 시작 시점에서 WEB-INF/lib 폴더로 배포가 되지 않았기 때문에 발생 한다.


해결 방법


  1. Eclipse Project 마우스 오른쪽 Properties
  2. Deployment Assembly Add 클릭
  3. Select Directive Type (Java Build Path Entries) 선택
  4. Maven Dependencies 추가
  5. Tomcat Start


아래 그림을 참고 하자. 설정 화면 이다.



문제가 해결 되었을 것 이다.


1. Dependency Library 추가


Java Poi 라이브러리를 사용 Maven pom.xml 에 추가 하자.


<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.0.2-FINAL</version>
</dependency>


2. AbstractExcelView 구현 하기


Spring 에서 제공 하는 AbstractView 기능을 확장하여 사용 한다.

TestExcelView.java
@Component("TestExcelView")
public class TestExcelView extends AbstractExcelView {

    @Override
    protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        HSSFSheet sheet = workbook.createSheet();
        HSSFRow header = sheet.createRow(0);
        header.createCell((short) 0).setCellValue("Test1");
        header.createCell((short) 1).setCellValue("Test2");
        header.createCell((short) 2).setCellValue("Test3");
        header.createCell((short) 3).setCellValue("Test4");
        header.createCell((short) 4).setCellValue("Test5");

        HSSFRow row = sheet.createRow(1);
        row.createCell((short) 0).setCellValue("Test1");
        row.createCell((short) 1).setCellValue("Test2");
        row.createCell((short) 2).setCellValue("Test3");
        row.createCell((short) 3).setCellValue("Test4");
        row.createCell((short) 4).setCellValue("Test5");
    }

}


3. Controller 구현 하기


ModelAndView Return 시 앞서 구현한 TestExcelView 로 변경 하자.

TestController.java
@RequestMapping(value="/testExcel.xls", method=RequestMethod.GET)
public ModelAndView testExcel(HttpServletRequest request) {
    ModelAndView mav = new ModelAndView();

    mav.setViewName("TestExcelView");

    return mav;
}


4. 요청 하기


http://localhost:8080/testExcel.xls

참고 서적
  • Spring Recipes - A Problem-Solution Approach, 2nd Edition (Apress, 2010) (364~365)


+ Recent posts