on
Spring 스프링 데이터 화면에 출력
Spring 스프링 데이터 화면에 출력
반응형
Spring 스프링 데이터 화면에 출력
이전 프로젝트 git: https://github.com/it
=>기본 패키지.dao.HibernateDao 안에 HibernateDao라는 클래스를 생성
//Bean(스프링이 생성하는 인스턴스)을 자동생성해주고 //데이터 관련된 클래스라는 것을 알려주기 위한 어노테이션 @Repository public class HibernateDao { //하이버네이트를 사용할 수 있는 인스턴스를 주입 @Autowired private SessionFactory sessionFactory; //전체 데이터를 가져오는 메소드 public List allItem(){ return sessionFactory.getCurrentSession() .createCriteria(Item.class).list(); } //데이터 1개를 가져오는 메소드 public Item getItem(int itemid) { return sessionFactory.getCurrentSession().get(Item.class, itemid); } }
//Bean을 자동생성해주는 어노테이션 @Service public class ItemServiceImpl implements ItemService { //ItemDao 타입의 Bean이 있으면 자동으로 주입시켜주는 어노테이션 @Autowired //Dao 변수생성 private ItemDao itemDao; //Hibernate 연동하는 Bean을 자동 주입 //동일한 자료형의 Bean이 있으면 자동 주입 @Autowired private HibernateDao hibernateDao; @Override public List allItem(HttpServletRequest request) { //Dao의 메소드에 파라미터가 없는 경우 Dao 메소드를 호출해서 리턴 //return itemDao.allItem(); return hibernateDao.allItem(); } @Override public Item getItem(HttpServletRequest request) { //파라미터 읽어오기 String itemid = request.getParameter("itemid"); //파라미터를 정수로 변환해서 Dao 메소드를 호출 //return itemDao.getItem(Integer.parseInt(itemid)); return hibernateDao.getItem(Integer.parseInt(itemid)); } @Override public Item getItem(HttpServletRequest request, int itemid) { //return itemDao.getItem(itemid); return hibernateDao.getItem(itemid); } }
3.실행했는데 트랜잭션 적용이 안되면 root-context.xml 파일에 있는 트랜잭션 관련 설정을 servlet-context.xml로
이동
=>servlet-context.xml 파일에 tx 네임스페이스를 추가
**html 이외의 출력
=>html 이외의 출력을 하고자 할때는 spring 설정 파일에 BeanNameViewResolver를 추가해야한다.
이 때 기존의 InternalResourceViewResolver의 우선순위를 조정해야 한다.
=>
Controller에서 id에 해당하는 View이름을 리턴하면 class에 설정된 View 클래스를 이용해서 내용을 출력하게됩니다.
**Excel 출력
=>apache poi 라는 라이브러리를 이용
=>AbstractXlsView 클래스를 상속받는 클래스를 만들어서 출력
=>Excel은 파일을 WorkBook 이라고 하고 하나의 화면을 Sheet, 하나의 행을 Row, 하나의 칸을 Cell 이라고합니다.
실제 데이터 출력은 Cell에 합니다.
**Excel 출력 실습
1.html 이외의 View를 출력할 수 있도록 설정
=>servlet-context.xml
1)기존의 ViewResolver를 수정
2)새로운 ViewResolver를 추가
2.Excel 사용을 위한 의존성 라이브러리 설정을 pom.xml 의 dependencies에 추가
org.apache.poi poi 3.16
3.home.jsp 파일에 엑셀 요청생성
엑셀로 내려받기
4.HomeController 클래스에 item.xls 처리를 위한 메소드를 추가
@RequestMapping(value="/item.xls", method=RequestMethod.GET) public String excel(HttpServletRequest request, Model model) { //서비스 메소드 호출 List list = itemService.allItem(request); //데이터 저장 model.addAttribute("list", list); //뷰 이름 리턴 return "excel"; }
5.Excel 출력 뷰를 생성
=>com.pk.db.view.ExcelView
=>AbstractXlsView 로 부터 상속
package com.pk.db.view; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.hibernate.cache.spi.support.AbstractReadWriteAccess.Item; import org.springframework.web.servlet.view.document.AbstractXlsView; public class ExcelView extends AbstractXlsView { //엑셀 데이터 출력을 위한 View @Override //첫번째 매개변수는 Controller가 Model 에 저장한 데이터를 가진 Map //두번째 매개변수는 실제 출력할 파일 //세번째 와 네번째는 request와 response객체 protected void buildExcelDocument( Map model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { //데이터 찾아오기 - Controller에서 저장한 이름으로 찾아오기 List list = (List) model.get("list"); //시트 만들기 Sheet sheet = workbook.createSheet(); workbook.setSheetName(0, "item"); //각 열의 너비 설정 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; } } }
6.HomeController에서 요청 후에 리턴한 뷰 이름과 엑셀 뷰 클래스를 연결하는 코드를
servlet-context.xml 파일에 작성
*hibernate관련 오류
org.hibernate.HibernateException
가 뜬다면 ItemServiceImpl 클래스 의 코드를 다시한번 살펴보시길 바랍니다!
**csv. Excel 파일 읽기
=>csv 는 supercsv 라이브러리를 이용
=>excel 은 poi-ooxml 이라는 라이브러리를 이용한다.
**pdf 출력
=>itext api를 주로 이용 : http://itextpdf.com/product
=>의존성 설정을 해야 합니다.
com.lowagie
itext
2.1.7
=>pdf는 기본적으로 한글 출력이 안됩니다.
한글 출력이 가능한 폰트를 설정해야 합니다.
1.pdf 출력을 위한 의존성 라이브러리 설정
=>pom.xml 파일의 dependencies 태그에 추가
com.lowagie
itext
2.1.7
2.home.jsp 파일에 pdf 출력 링크 추가!
pdf로 내려받기
3.HomeController 클래스에 item.pdf 요청을 처리해주는 메소드를 생성
@RequestMapping(value = "/item.pdf", method = RequestMethod.GET) public String pdf(HttpServletRequest request, Model model) { // 서비스 메소드 호출 List list = itemService.allItem(request); // 데이터 저장 model.addAttribute("list", list); // 뷰 이름 리턴 return "pdf";
4.PDF 출력을 위한 View를 생성
=>AbstractPdfView로 부터 상속
=>tistory에 있는 폰트를 내컴퓨터\C드라이브\Fonts 에 넣어줍니다
package com.pk.db.view; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.view.document.AbstractPdfView; import com.lowagie.text.Cell; import com.lowagie.text.Document; import com.lowagie.text.Font; import com.lowagie.text.Paragraph; import com.lowagie.text.Table; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfWriter; import com.pk.db.domain.Item; public class PdfView extends AbstractPdfView { //pdf 출력을 위한 메소드 //model은 Controller가 넘겨준 데이터 //document는 출력한 문서 파일 //writer는 직접 그려서 출력하고자 할 때 사용하는 객체 //request 와 response는 이전과 동일 @Override protected void buildPdfDocument( Map model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception { //데이터 찾아오기 List list = (List)model.get("list"); //한글 출력을 하고자 하는 경우 한글을 지원하는 폰트 설정! BaseFont dfKorean = BaseFont.createFont("C:\\windows\\fonts\\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(1000, 600); image.setAbsolutePosition(100, 100); document.add(image); } }
5.servlet-context.xml 파일에 Controller 가 리턴한 뷰 이름과 출력할 뷰 클래스를 연결
코드 작성이 완료되었습니다!
이렇게 웹페이지에 출력이 됩니다. 그림이 방해가 된다면 맨밑의 테이블관련 코드를 지워주시면 됩니다.
데이터 Json출력은 다음 시간에 이어서 알아보겠습니다!
반응형
from http://bucheoneduc.tistory.com/30 by ccl(A) rewrite - 2021-12-26 01:27:56