- jrxml파일 컴파일
이제 궁극의 자바 연동을 시켜보자
타이틀을 넣고싶으면 우측 elements패널에서 static text을 선택해서 title로 끌어와준다
타이틀을 쓰고 우측에 빨간색으로 표시한 버튼을 클릭
jrxml를 jasper파일로 컴파일하는 버튼이다
java에서 jrxml을 컴파일할 수 있지만 소스한줄쓰는 것보다
버튼 클릭 한 번이 간단하게 때문에 컴파일해준 파일을 넣어주겠다
- jasper파일 경로
컴파일하면 이렇게 Jasper Studio의 project controler에
똑같은 제목의 jasper파일이 생긴다
그럼 그 파일을 이클립스로 끌어와준다
경로는 java resources하단에 넣어준다
- jasper를 위처럼 java/src/resources에 넣었다면 getClass()를 통해 경로를 가져오면 된다
하지만 WEB-INF하단에 넣어놔도 아래 코드에 있는 getServletContext()를 사용하면 경로를 가져올 수 있다
InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/files/jaseper/TestReport.jasper");
두 경로 중 어디에 넣느냐는 프로젝트나 파일의 성격에 따라 선택하면 된다
src/resources는는 보통 Java프로젝트에서 리소스 파일(Jasper, properties, 설정 파일 등)을 지정하는 표준경로이고,
빌드되는 동안 클래스패스에 포함되어 war or jar 파일 안으로 복사된다
WEB-INF/files 에 사용자가 다운로드할 수 있는 PDF, Jasper, 템플릿 등의 기타 자원 등이 저장 될 수 있고, 보안상의 이유로 외부에서 접근할 수 없으며 서블릿을 통해서만 제공되어야 할 때 이 경로를 사용한다
보통 Jasper파일과 같은 정적 리소스나 템플릿은 일반적으로 src/resources에 둬서 애플리케이션 코드와 함께 패키징하고 클래스로더를 통해서 접근하니까 나는 전자로 설정을 해놨다
- java 소스코드
@GetMapping("/download/doReport")
public void doReport(HttpServletRequest request, HttpServletResponse response) {
String jdbcUrl = "jdbc:postgresql://{ip}:{port}/{dbname}";
String username = "{username}";
String password = "{password}";
// 리소스 관리를 위한 try-with-resources 구문
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
//해당 경로에 있는 jasper파일을 가져와준다
InputStream reportStream = this.getClass().getResourceAsStream("/jasper/TestReport.jasper")) {
//해당경로에 jasper 없을 시 에러처리
if (reportStream == null) {
throw new FileNotFoundException("Jasper file not found in /jasper/TestReport.jasper");
}
//리포트 파일 로드
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportStream);
//파라미터 필요한 경우
Map<String, Object> parameters = new HashMap<>();
//jasperReport 채우기
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
//응답 헤더 설정
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=report.pdf");
// PDF로 응답 스트림에 출력
JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
코드에 대한 내용은 주석으로 간단히 달아놓았다
예시나 구체적인 내용은 아래에 자세히 적어보겠다
- datasource 혹은 connection
jasper 리포트를 채우는 과정에서 어떻게 데이터를 연동을 할 것이냐인데
빈 데이터 소스를 보낼 수도 있고, 가지고 있는 데이터들을 보낼 수도 있다
- 빈 데이터 소스(아래)
JRDataSource dataSource = new JREmptyDataSource();
- 두개의 레코드에 데이터를 넣어 보내는 데이터 소스(아래)
//아래 형태와 같은 그릇을 만들어준다
List<Map<String, Object>> dataList = new ArrayList<>();
//테스트로 첫번째행 만들기
Map<String, Object> row1 = new HashMap<>();
row1.put("column1", "Value 1A");
row1.put("column2", "Value 1B");
row1.put("column3", "Value 1C");
//datalist에 추가
dataList.add(row1);
//두번째 행 만들기
Map<String, Object> row2 = new HashMap<>();
row2.put("column1", "Value 2A");
row2.put("column2", "Value 2B");
row2.put("column3", "Value 2C");
//datalist에 추가
dataList.add(row2);
//JRDataSource만들어주기
JRDataSource dataSource = new JRMapCollectionDataSource(dataList);
- 나는 바로 db연동을 해서 쿼리로 데이터를 가져올 것이기 때문에 connection만 연결을 해주면됐다
연결하려면 아래와 같이 커넥션과 설정을 해주고 그 커넥션을 보내서 리포트를 채워주면 된다
리소스 관리를 위해 아래 코드에서 try-with-resources구문으로 바꿔줬다
String jdbcUrl = "jdbc:postgresql://hostname:port/dbname";
String username = "username";
String password = "password";
// PostgreSQL JDBC 커넥션 생성
Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
.....
// 커넥션 보내서 리포트 채우기
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
자세한 내용은 아래글 참고..
https://wogus789789.tistory.com/430
- 파라미터
- DB를 연결하면 거의 무조건 파라미터를 사용해야할텐데 아래와 같이 사용해서 parameter을 보내주면된다
실제로는 서버나 클라이언트 단에서 받은 데이터로 대체할 수 있겠다
Map<String, Object> parameters = new HashMap<>();
parameters.put("ReportTitle", "제목");
parameters.put("Writer", "나야나");
- 파라미터
그럼 이렇게 리포트가 표출된다
제목이 저렇게 ? 되는 이유는 jasper studio에서 한글을 기본적으로 지원안하기 때문
다 한글설정 방법 설명하려고 저렇게 설계한겁니다..ㅎㅎ
한글 설정은 다음 게시글에서 설명해보겠다
'JAVA > JasperStudio' 카테고리의 다른 글
[japserstudio] #7 jasper로 기본차트 만들기, 차트만드는 방법 (0) | 2023.11.15 |
---|---|
[japserstudio] #6 한글깨질 때 한글설정하는 법, java jasper 폰트 설정, font추가, fonts.xml, 폰트 경로 (0) | 2023.11.01 |
[jasperstudio] #4 JasperReports 라이브러리 추가, 종속성 에러문제 해결(collections4,openPDF,jfreechart) (0) | 2023.10.31 |
[jasperstudio] #3 연결한 db에서 쿼리를 통해 데이터를 리포트에 표출하기 (0) | 2023.10.31 |
[jasperstudio] #2 data adapter로 db연결하기(jdbc connection) (0) | 2023.10.31 |
댓글