이 섹션에서는 좀 더 복잡한 라이브러리 구현을 작성하는 데 도움이 되는 몇 가지 팁을 다룹니다.
자체 서블릿 사용
가장 간단한 데이터 소스 구현은 라이브러리의 DataSourceServlet
클래스에서 상속받습니다.
DataSourceServlet
이외의 클래스에서 상속받으려면 다음과 같이 데이터 소스를 구현합니다.
-
DataTableGenerator
인터페이스를 구현하고getCapabilities()
및generateDataTable()
를 재정의합니다. - 서블릿 코드 내에서
DataSourceHelper.executeDataSourceServletFlow()
를 호출하여 데이터 소스 흐름을 실행합니다.이 메서드는 다음 매개변수를 사용합니다.HttpServletRequest
객체HttpServletResponse
객체- 위 1단계의
DataTableGenerator
인터페이스 구현 - 제한 또는 무제한 액세스 모드를 지정하는 불리언입니다.
예를 들어 내장 인증을 제공하는 AuthServlet
라는 다른 서블릿 클래스에서 서블릿을 상속하려는 경우 다음과 같이 SimpleServletExample
를 다시 작성하여 DataSourceServlet
가 아닌 AuthServlet
를 상속할 수 있습니다.
-
DataTableGenerator
인터페이스를 구현합니다. -
generateDataTable()
를DataSourceServlet
구현에서DataTableGenerator
구현으로 이동합니다. -
Capabilities.None
를 반환하도록DataTableGenerator
구현에서getCapabilities()
를 재정의합니다. - 서블릿 코드 (
doGet()
또는doPost()
) 내에서DataSourceHelper.executeDataSourceServletFlow()
를 호출하고DataTableGenerator
구현을 전달합니다. 이 메서드는 데이터 소스 결과를 서블릿 응답에 렌더링하는 것을 포함하여 데이터 소스의 전체 흐름을 실행합니다.
일반적으로 프레임워크에서 제공하는 추상 클래스를 상속하는 서블릿 프레임워크를 사용하는 경우에도 동일한 기법을 사용할 수 있습니다.
예를 들어 WebWork를 사용하는 경우 ActionSupport
클래스를 상속해야 할 수 있습니다.
기능 정의
데이터 저장소에 대량의 데이터가 포함되어 있고 데이터 소스의 효율성을 높이려는 경우 데이터 저장소의 쿼리 기능을 사용하면 됩니다. 예를 들어 데이터 저장소가 데이터베이스이고 데이터베이스에 많은 열이 있다고 가정해 보겠습니다. 시각화에서 이러한 열 중 일부만 요청하는 경우 모든 열을 검색하고 라이브러리의 쿼리 기능을 사용하여 SELECT
를 수행하는 것보다 데이터베이스 내에서 SELECT
작업을 실행하는 것이 더 효율적입니다.
SELECT
기능을 구현하려면 데이터베이스 내에서 SELECT
작업을 실행하고 데이터 테이블을 반환하는 코드를 작성합니다.
Capabilities
enum을 사용하여 코드에서 제공하는 쿼리 기능을 정의합니다. 사용 가능한 옵션은 다음과 같습니다.
NONE
: 기본값이며 코드는 쿼리 작업을 제공하지 않습니다.SQL
: 코드가 SQL 쿼리 작업을 제공합니다.SORT_AND_PAGINATION
: 코드는 정렬 및 페이지로 나누기 쿼리 작업을 모두 제공합니다.SELECT
: 코드에서 선택 작업을 제공합니다.ALL
: 코드가SQL
,SORT_AND_PAGINATION
,SELECT
작업을 제공합니다.
참고: 라이브러리는 항상 코드에서 제공하지 않는 쿼리 작업을 처리합니다.
NONE
이외의 기능을 구현하려면 Capabilities.getCapabilities()
를 재정의하고 DataTable.generateDataTable()
를 구현하여 데이터 저장소를 쿼리하고 데이터 테이블을 반환합니다.
세 가지 예(AdvancedExampleServlet
, AdvancedExampleServlet2
, SqlDataSourceServlet
)는 기능을 구현하는 방법을 보여줍니다.
모든 항목은 example
패키지에 포함됩니다. AdvancedExampleServlet2
은 기능 및 이벤트 흐름 정의에서 설명합니다.
이벤트 흐름 맞춤설정
이벤트의 기본 흐름은 DataSourceHelper.executeDataSourceServletFlow
에 정의되어 있습니다.
기본 흐름은 다음과 같습니다.
- 쿼리 매개변수 추출 및 파싱
- 제한된 액세스 모드인 경우에만 요청이 서블릿과 동일한 도메인에서 시작되었는지 확인합니다.
- 요청을 파싱하여 데이터 소스 쿼리와 완료 쿼리라는 두 가지 쿼리 객체를 만듭니다. 데이터 소스 쿼리를
generateDataTable()
구현에 전달합니다. generateDataTable()
의 구현은 데이터 테이블을 생성합니다.- 5단계에서 생성된 데이터 테이블에서 완료 쿼리를 실행합니다.
- 데이터 테이블을 시각화에서 지정한 형식으로 렌더링하고 서블릿 응답을 설정합니다.
자체 이벤트 흐름을 지정하려면 datasource.DataSourceHelper
에서 도우미 함수를 호출합니다. 구현 예는 기능 및 이벤트 흐름 정의를 참고하세요.
DataTableGenerator.generateDataTable
에 매개변수 전달
HttpServletRequest.setAttribute
를 사용하여 쿼리 또는 HttpServletRequest
객체의 일부가 아닌 데이터를 DataTableGenerator.generateDataTable
에 전달할 수 있습니다. 코드 예는 아래와 같습니다.
서블릿 코드에 HttpServletRequest
에 전달하려는 객체를 다음과 같이 입력합니다.
request.setAttribute("my_object_name", myObject); DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);
dataTableGenerator
인터페이스 구현에서 다음과 같이 HttpServletRequest
에서 객체를 가져옵니다.
public DataTable generateDataTable(Query query, HttpServletRequest request){ Object myObject = request.getAttribute("my_object_name"); // Add your code to manipulate myObject here }
서블릿이 아닌 데이터 소스 구현
서블릿을 사용하지 않고 라이브러리를 구현하는 경우 서블릿 환경이 필요하지 않은 클래스와 도우미 함수만 사용할 수 있습니다. 여기에는 Query
및 DataTable
클래스와 parseQuery
, applyQuery
, validateQuery
, splitQuery
과 같은 일부 DataSourceHelper
함수가 포함됩니다.
이러한 클래스와 함수를 사용하여 다음 작업을 할 수 있습니다.
- 시각화 쿼리를 파싱합니다.
- 쿼리를 데이터 소스 쿼리와 완료 쿼리로 분할합니다.
- 완료 쿼리를 실행하여 데이터 테이블을 생성합니다.
- 데이터 테이블을
HTML
,CSV
또는JSON
형식의 시각화로 반환합니다.