HTML 이외의 출력

  • html 이외의 출력을 하고자 하는 경우네느 spring 설정 파일에 BeanNameViewResolver를 추가해야 한다.
    • 이때 기존의 internalResourceViewRecolver의 우선순위를 조정해야 합니다.
  • <bean id="Controller에서 리턴한 뷰 이름" class="View 클래스 경로" />
    • Controller에서 id에 해당하는 View이름을 리턴하면 clss에 설정된 View 클래스를 이용해서 내용을 출력하게 됩니다.

Excel 출력

  • apache poi 라이브러리를 이용
  • AbstractXlsView 클래스를 상속받는 클래스를 만들어서 출력
  • Excel은 파일을 WorkBook 이라고 하고 하나의 화면을 sheet, 하나의 행을 Row, 하나의 칸을 Cell 이라고 합니다.
    • 실제 데이터 출력은 Cell에 합니다.

Excel 출력 실습

1.html 이외의 View를 출력할 수 있도록 설정

1) servlet-context

    <!--  Controller 에서 리턴하는 뷰 이름을 가지고 제 출력할 뷰를 선택하도록 해주는 설정 -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
        <!-- 우선순위를 수정 이부분 추가 -->
        <beans:property name="order" value="1" />
    </beans:bean>

2) 새로운 ViewResolver를 추가

    <!-- html 이외의 출력을 위한 ViewResolver 설정  -->
    <beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <beans:property name="order" value="0"/>
    </beans:bean>

2.Excel 사용을 위한 의존성 라이브러리를 설정을 pom.xml의 dependencies에 추가

        <!--Excel 출력 라이브러리  -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>

3. hom.jsp 파일에 엑셀 요청 파일 생성

    <a href="item.xls">엑셀로내려받기 </a><br/>

4.HomeController 클래스에 item.xls 처리를 위한 메소드를 추가

    @RequestMapping(value="/item.xls", method=RequestMethod.GET)
    public String excel(HttpServletRequest request, Model model ) {
        //서비스 메소드 호출 
        List<Item> list = itemService.allItem(request);
        //데이터저장 
        model.addAttribute("list", list);
        //뷰이름을 리턴 
        return "excel";
    }

5.Excel 출력 뷰를 생성

  • com.gmail.hiwony7933.view.ExcelView
  • AbstractXlsView 로 부터 상속

image-20200221104909018

public class ExcelView extends AbstractXlsView {
    //엑셀데이터 출력을 위한 view
    @Override
    // 첫번째 매개변수는 Controller가 Model 에 저장한 데이터를 가진 Map
    // 두번째 매개변수는 실제 출력할 파일
    // 세번째 와 네번째는 request 와 response객체 
    protected void buildExcelDocument(
            Map<String, Object> model, 
            Workbook workbook, 
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        //데이터 찾아오기 - Controller에서 저장한 이름으로 찾아온다 .
        List<Item> list = (List<Item>)model.get("list");

        //시트 만들기
        Sheet sheet = workbook.createSheet();
        workbook.setSheetName(0, "item");
        //각 열의 너비 설정 - set옵션들에 대한 확인들
        sheet.setColumnWidth(0, 5120);

        //첫번째 행에 제목 출력
        Row firstRow = sheet.createRow(0);
        Cell cell = firstRow.createCell(0);
        cell.setCellValue("아이디");
        cell = firstRow.createCell(1);
        cell.setCellValue("이름");
        cell = firstRow.createCell(2);
        cell.setCellValue("가격");
        cell = firstRow.createCell(3);
        cell.setCellValue("효과");

        //데이터 출력
        int idx = 1;
        for(Item item : list) {
            Row row = sheet.createRow(idx) ;
            cell = row.createCell(0);
            cell.setCellValue(item.getItemid());
            cell = row.createCell(1);
            cell.setCellValue(item.getItemname());
            cell = row.createCell(2);
            cell.setCellValue(item.getPrice());
            cell = row.createCell(3);
            cell.setCellValue(item.getDescription());

            idx = idx  + 1; 
        }
    }
}

6HomeController 에서 요청 후에 리턴한 뷰 이름과 엑셀 뷰 클래스를 연결하는 코드를 servlet-context.xml 파일에 작성

    <!-- Controller가 리턴한 뷰이름과 뷰 클래스 매핑  -->
    <beans:bean id="excel" class="com.gmail.hiwony7933.view.ExcelView"/>

csv, Excel 파일 읽기

  • csv는 supercsv 라이브러리를 이용
  • excel은 poi-ooxml 이라는 라이브러리를 이용

pdf 출력 - 엑셀처럼 테이블에 데이터를 출력

  • pdf는 기본적으로 한글 출력이 안된다.
    • 한글 출력이 가능한 폰트를 설정해야한다.

1. pdf 출력을 위한 의존성 라이브러리 설정

  • pom.xml 파일의 dependency 태그에 추가
<!-- pdf 출력 라이브러리  -->
<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
</dependency>

2.home.jsp 파일에 pdf 출력 링크를 추가

<a href="item.pdf">pdf로내려받기 </a><br/>

3.HomeController 클래스에 item.pdf 요청을 처리해주는 메소드 생성


    @RequestMapping(value="/item.pdf", method=RequestMethod.GET)
    public String pdf(HttpServletRequest request, Model model ) {
        //서비스 메소드 호출 
        List<Item> list = itemService.allItem(request);
        //데이터저장 
        model.addAttribute("list", list);
        //뷰이름을 리턴 
        return "pdf";
    }

4.PDF 출력을 위한 View를 생성

  • AbstractPdfView로 부터 상속
public class PdfView extends AbstractPdfView {

    // pdf 출력을 위한 메소드
    // model은 Controller가 넘겨준 데이터 
    // document는 출력한 문서 파일
    // writer는 직접 그려서 출력하고자 할때 사용하는 객체 
    // request 와 response는 이전과 동일 
    @Override
    protected void buildPdfDocument(
            Map<String, Object> model, 
            Document document, 
            PdfWriter writer,
            HttpServletRequest request, 
            HttpServletResponse response) throws Exception {

        // 데이터 찾아오기
        List<Item> list = (List<Item>) model.get("list");

        // 한글 출력을 하고자 하는 경우에는 한글을 지원하는 폰트를 설정
        BaseFont dfKorean = BaseFont.createFont("/Users/jw/javalab/spring02202/malgun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(dfKorean);

        // 테이블 생성 - 첫번째 매개변수는 열의 개수, 두번째 행의 개수 
        Table table = new Table(4, list.size() + 1) ;
        table.setPadding(10);     // 여백 

        //제목 만들기 
        Cell cell = new Cell(new Paragraph("코드", font));
        cell.setHeader(true);
        table.addCell(cell);
        cell = new Cell(new Paragraph("이름", font));
        cell.setHeader(true);
        table.addCell(cell);
        cell = new Cell(new Paragraph("가격", font));
        cell.setHeader(true);
        table.addCell(cell);
        cell = new Cell(new Paragraph("설명", font));
        cell.setHeader(true);
        table.addCell(cell);
        table.endHeaders();

        //데이터 출력하기 
        for(Item item : list) {
            Cell imsi = new Cell(
                    new Paragraph(item.getItemid()+"", font));
            table.addCell(imsi);
            imsi = new Cell(
                    new Paragraph(item.getItemname(), font));
            table.addCell(imsi);
            imsi = new Cell(
                    new Paragraph(item.getPrice()+"", font));
            table.addCell(imsi);
            imsi = new Cell(
                    new Paragraph(item.getDescription(), font));
            table.addCell(imsi);
        }
        //테이블을 문서에 추가 
        document.add(table);

            //이미지 추가 
        String path = request.getRealPath("/img");

        Image image = Image.getInstance(path + "/grape.jpg");
        image.scaleToFit(100, 60);
        image.setAbsolutePosition(100, 100);
        document.add(image);
    }

}

5.servlet-context.xml 파일에 Controller가 리턴한 뷰 이름과 출력할 뷰 클래스를 연결

    <!-- Controller가 리턴한 뷰이름과 뷰 클래스 매핑  -->
    <beans:bean id="pdf" class="com.gmail.hiwony7933.view.PdfView"/>

Json 출력

  • jaon : 자바스크립트 객체 표현법으로 데이터를 표현하는 방식(스마트 폰의 push 메시지, 센서의 데이터 등을 json 표현법으로 주고 받고 mongo db 와 같은 NoSQL에서도 데이터를 json 방식으로 표현 - 자바스크립트나 파이썬은 json 형식의 데이터를 쉽게 을 수 있습니다. )
  • json은 이전의 html, excel, pdf 와 다르게 데이터를 전달하는 것입니다.
    • view를 생성할 필요가 없다
  • json 출력을 위해서는 jackson-databind 라이브러리가 필요
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.4</version>
        </dependency>
  • 출력하는 방법은 여러 가지

1. 출력하는 뷰를 MappingJacksonJsonView로 출력하면 데이터를 json으로 출력해줍니다.

1) home.jsp 파일에 json 출력 요청을 생성

2) HomeController 클래스에 item1.json 요청을 처리하는 메소드를 작성

    @RequestMapping(value="/item1.json", method=RequestMethod.GET)
    public String item1json(HttpServletRequest request, Model model ) {
        //서비스 메소드 호출 
        List<Item> list = itemService.allItem(request);
        //데이터저장 
        model.addAttribute("list", list);
        //뷰이름을 리턴 
        return "item1json";
    }

3) servlet-context.xml 파일에 item1json 과 json view와 연결

    <!-- Controller가 리턴한 뷰이름과 뷰 클래스 매핑  -->
    <beans:bean id="item1json" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>

2.Restful(Erpersentational State Transfer) API

  • 접속하는 기기에 상관없이 동일한 데이터를 요구하는 요청은 하나의 URL로 만들자는 개념
  • URL을 이용해서 요청하면 View 대신에 Data를 주자는 개념
    • 출력은 Data를 받은 클라이언트에서 자신에게 맞게 파싱해서 사용

3.RestController

  • 요청을 처리하는 클래스인데 이 클래스의 요청 처리 메소드에서 문자열을 리턴하면 문자열로 출력하고 기본 자료형을 제외한 자료형으로 리턴하면 json 형식으로 출력
  • spring 4.0 이상에서만 사용 가능
  • 클래스 위에 @RestController 만 추가하면 됩니다.
  • Jackson-Databing 라이브러리는 추가되어 있어야 한다.

4.RestController 를 이용해서 문자열과 JSON 출력

1) home.jsp 파일에 문자열

    <a href="item.csv">csv로 내려받기 </a><br/>
    <a href="tiem2.json">json로 내려받기 </a><br/>

2) 프로젝트에 RestController로 사용할 클래스를 추가

  • com.gmail.hiwony7933.
    // 기본형이나 String 또는 Date 클래스를 제외한 형태로 리턴하면 json으로 응답 
    @RequestMapping(value="/item2.json", method=RequestMethod.GET)
    public List<Item> json(HttpServletRequest request) {
        List<Item> list = itemService.allItem(request);
        // list ApI는 뷰가 없기 때문에 데이터만 리턴해주면 됨. 
        return list;
    }
}

results matching ""

    No results matching ""