이 섹션에서는 좀 더 복잡한 라이브러리 구현을 작성하는 데 도움이 되는 몇 가지 팁을 설명합니다.
자체 서블릿 사용
가장 간단한 데이터 소스 구현은 라이브러리의 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형식으로 시각화로 반환합니다.