Наверное у многих разработчиков на APEX возникал вопрос "Как это работает?"
Не стану детально все расписывать, для этого понадобится целая книга. Лучше покажу на простом примере как сделать тоже, что делает APEX, а именно, как сгенерировать HTML страницу и выдать ее по запросу пользователя. Пример для конфигурации APEX Embedded PL/SQL Gateway (EPG).
Начнем от браузера, вернее от адресной строки. Типичный пример URL страницы APEX http://myserver:8080/apex/f?p=100:1:1311836722169.
Подробно про структуру URL написано в документации Understanding URL Syntax - Oracle Documentation, но про вот этот элемент "f?p=" сказано весьма сухо. Попытаюсь раскрыть эту тему подробнее:
f - это имя процедуры, которая первая получает управление от Listener-a. Здесь можно получить дополнительную информацию.
? - разделитель между названием процедуры и ее параметрами
p - название параметра процедуры. После знака равенства значение параметра.
Вооружившись этой информацией, сделаем свой APEX.
1. Создадим свой собственный DAD с именем MYAPEX. Для этого под пользователем SYS выполним скрипт:
BEGIN
dbms_epg.create_dad('MYAPEX','/myapex/*');
dbms_epg.set_dad_attribute('MYAPEX','database-username','ANONYMOUS');
dbms_epg.set_dad_attribute('MYAPEX','request-validation-function','appx.validation_function');
END;
2. В своей схеме, например APPX, создаем функцию "validation_function":
CREATE OR REPLACE FUNCTION validation_function(procedure_name IN VARCHAR2) RETURN BOOLEAN IS
l_result BOOLEAN := FALSE;
BEGIN
IF UPPER(procedure_name) IN ('PAGE', 'APPX.PAGE') THEN
l_result := TRUE;
END IF;
RETURN l_result;
END;
Данная функция проверяет и разрешает или запрещает вызов из HTTP запроса процедуры переданной в параметре "procedure_name".
3. В своей схеме APPX создаем процедуру "page":
create or replace procedure page(arg IN VARCHAR2 := NULL) is
begin
htp.htmlopen;
htp.headopen;
htp.title('Hello');
htp.headclose;
htp.bodyopen;
htp.p(arg);
htp.bodyclose;
htp.htmlclose;
END;
Это процедура и есть основной движок нашего "APEX-а", которая генерирует HTML страницу.
4. На созданные процедуры выдаем привилегии пользователю PUBLIC:
GRANT EXECUTE ON appx.validation_function TO PUBLIC;
GRANT EXECUTE ON appx.page TO PUBLIC;
Собственно все.
Открываем браузер. Вводим http://myserver:8080/myapex/appx.page?arg=test_ok и получаем простейшую HTML страницу с надписью test_ok.
Название схемы из адресной сроки можно убрать. Для этого достаточно создать публичный синоним:
CREATE PUBLIC SYNONYM page FOR appx.page;
Тогда URL немного упростится: http://myserver:8080/myapex/page?arg=test_ok