이미 이전 글에서 XML 형식으로 모델 데이타를 보여주는 방법을 살펴 봤기 때문에 PDF와 Exel로 출력하는 방법도 비슷하게 배울 수 있을 것 같습니다.

문제는 view 클레스를 만드는 기술인데 XSLT 만드는 방법은 쉬웠는데 PDF와 Exel 만드는 코딩은 어떨지 해봐야겠네요. :)

1. 먼저 추가 적인 jar 파일들이 필요합니다.

Exel은 poi.jar PDF는 iText.jar가 필요합니다.

2. 이번에도 컨트롤러 만들고 등록 합니다.

public class ViewMemberListWithPDFController extends AbstractController{

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        List<MemberInfo> infos = ServiceManager.getMemberInfoService().getAll();
        Map<String, Object> members = new HashMap<String, Object>();
        members.put("members", infos);
        return new ModelAndView("memberListPdf", members);
    }

}

<bean name="/viewMemberListWithPdf.html" class="net.ailgejava.members.controller.ViewMemberListWithPDFController" />

Xstl 예제랑 거의 같은데 view 이름만 다릅니다.

3. view 클레스들을 만듭니다.

public class MemberListPdfView extends AbstractPdfView {

    @SuppressWarnings("unchecked")
    @Override
    protected void buildPdfDocument(Map model, Document document, PdfWriter writer, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        List<MemberInfo> memberInfos = (List<MemberInfo>) model.get("members");

        for(MemberInfo memberInfo : memberInfos){
            document.add(new Paragraph(
                memberInfo.getName() + " " +
                memberInfo.getEmail() + " " +
                memberInfo.getHome()
            ));
        }
    }

}

몬지 모르겠지만 Paragraph 객체로 찍는 것 같군요.

4. view 프로퍼티에 등록합니다.

memberListXml.class = net.ailgejava.members.view.xml.MemberListXMLView
memberListXml.stylesheetLocation=/WEB-INF/xsl/memberList.xslt
memberListXml.root=memberInfos

memberListPdf.class=net.ailgejava.members.view.pdf.MemberListPdfView

이전 글에 등록했던 내용과 같이 있습니다.

5. 데모

사용자 삽입 이미지사용자 삽입 이미지이런.. 이름이 안 찍혔네요. 흠... 왜이럴까요; 이름은 한글이라 인코딩 문제가 있는 걸까요. 흠... confluence에서 PDF로 빼낼 때도 한글 문제가 있었는데 어떻게 해결했었는지 살펴봐야겠네요.