Технологія сервлетов СУБД для доступу до даних БД

Люди часто роблять старі помилки, але при цьому посилаються на нові обставини.
А. Ейнштейн.

Анотація


Встановлена в БД XML DB дозволяє засобами СУБД, без залучень зовнішнього контейнера сервлетів, організувати сервлетний доступ до даних в базі. Фактично це означає можливість організувати для доступу до даних сервер web «всередині СУБД». У статті показано на прикладах, як це можна зробити. 


Введення


Ця стаття є продовженням раніше опублікованих статей «XML DB – новий вимір в організації даних в Oracle», «Що дає репозитарій XML DB і як з ним працювати» і «Як зареєструвати схему XML в XML DB і як цим скористатися ».


Сховище XML DB забезпечує можливість доступу до даних БД на основі технології сервлетов HTTP / HTTPS. Конфігурацію сервлетів можна спостерігати і встановлювати в ресурсі-файлі /xdbconfig.xml.


Створювати сервлети «всередині БД» можна на C і на Java, проте на першому випадку фірма дає в розпорядження користувачам тільки готовий для вживання сервлет, а в другому – правила самостійного побудови.


Якщо говорити про реалізацію на Java, то це частина можливостей по організації роботи СУБД з різнохарактерними програмними елементами на Java, що були в Oracle у версіях з 8.1 по 9.0, але виконаних на інший технологічній основі.


Вбудований сервлет DBURIServlet


Сервлет DBURIServlet написаний на C і готовий для вживання при встановленому репозитарії за адресою / oradb / Схема_БД / ім'я_таблиці[… ]. Тим не менш він параметризовані, і тому представляє інтерес для кінцевих споживачів БД.


Приклад звернення:


 


 

 

 

 

 

 

 

 

 

Правила формування адреси відповідають правилам типу DBURITYPE.

Вправа. Перевірити роботу сервлета DBURIServlet на наступних зверненнях:


http://localhost:8080/oradb/SCOTT/DEPT/ROW[DEPTNO=”30″]


http://localhost:8080/oradb/SCOTT/DEPT/ROW [DEPTNO = "30"] / DNAME / text ()


http://localhost:8080/oradb/SCOTT/EMPXML_SCHEMA_VIEW/ROW/employee [@ empno = "7499"]


Сервлет DBURIServlet має параметри:


– rowsettag – Для зміни імені кореневого елемента, наприклад: http://localhost:8080/oradb/SCOTT/DEPT?rowsettag=Departments


– contenttype – Для вказівки типу MIME, наприклад: http://localhost:8080/oradb/SCOTT/DEPT?contenttype=text/plain


– transform – Для перетворення тексту XML засобами XSLT.


Зареєструємо в якості ресурсу /public/dept.xsl наступний текст:


<?xml version=”1.0″?>

<xsl:stylesheet version=”1.0″


 xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”


>


<xsl:output method=”html” />


<xsl:template match=”ROW”>


  <tr>


  <td><xsl:value-of select=”DEPTNO”/></td>


  <td><xsl:value-of select=”DNAME”/></td>


  <td><xsl:value-of select=”LOC”/></td>


  </tr>


</xsl:template>


<xsl:template match=”DEPT”>


<html> <head> </ head> <body> <title> Departments </ title>


<table class=borderall bordercolor=”green”>


  <xsl:apply-templates select=”ROW”/>


</table>


</body></html>


</xsl:template>


</xsl:stylesheet>


Тепер звернення до XML DB за адресою:


http://localhost:8080/oradb/SCOTT/DEPT?transform=/public/dept.xsl&contenttype=text/html


дасть такий результат:


 


 

 

 

 

 

Текст з визначенням перетворення XSLT можна розмістити і в таблиці БД, звернувшись за ним знов-таки через DBURITYPE приблизно так:

transform = / oradb / SCOTT / XSLTDEFS / ROW [TAB = "DEPT"] / DEFINITION / text ()


Вправа. Створити таблицю XSLTDEFS з визначенням перетворення XSLT для таблиці DEPT (стовпець TAB для імені таблиці і стовпець DEFINITION для тексту перетворення) і вказати сервлету взяти дані перетворення звідти, а не з ресурсу XML DB. Вказівка: поле DEFINITION визначити типом VARCHAR2.


Інші властивості сервлета наведені в документації по XML DB.


Створення сервлета на Java


Oracle XML DB підтримує Java Servlet API версії 2.2 з деякими обмеженнями, і з можливістю додатково встановити сервлет підтримки JSP.


Підготуємо текст сервлета у файлі XMLDBServlet.java:


import java.io.PrintWriter;

import java.io.IOException;


import javax.servlet.GenericServlet;


import javax.servlet.ServletRequest;


import javax.servlet.ServletResponse;


import javax.servlet.ServletException;


public class XMLDBServlet extends GenericServlet {


  public void service (


              ServletRequest  request


            , ServletResponse response


  )


  throws ServletException, IOException {


    String s = request.getParameter ( “rex” );


    response.setContentType ( “text/xml” );


    PrintWriter out = response.getWriter ( );


    out.println ( “<?xml version=”1.0″?>” );


    out.println ( “<html><head>” );


    out.println ( “<title>My XMLDBServlet servlet demo</title>” );


    out.println ( “</head><body>” );


    out.println ( “<h2>Ave, ” + s + ” !</h2>” );


    out.println ( “</body></html>” );


    out.close ( );


  }


}


Приклад заради спільності розглядає вживання суперкласу GenericServlet, а не HttpServlet.


Завантажимо сервлет в БД одним з можливих способів:


>loadjava -grant public -u scott/tiger -r XMLDBServlet.java


Перевіркою легко переконатися, що СУБД не тільки завантажить вихідний текст, але й отримає з нього клас.


Щоб сервлет міг викликатися ззовні, відомості про нього потрібно занести в ресурс-файл /xdbconfig.xml в репозитарії XML DB. Це файл з «об'єктно-реляційних» зберіганням, і підправити його можна або через WebDAV (системами, що забезпечують таку правку), або звичайними функціями UPDATEXML та іншими. (Саме цей файл не допускає видалення з репозитарія, тому вивантажити його, підправити і завантажити заново неможливо).


Однак при бажанні, для зручності редагування файлу /xdbconfig.xml можна використовувати спеціально створені для цього підпрограми пакету DBMS_XDB. Виконаємо в SQL * Plus від імені користувача XDB:


DECLARE


xval XMLTYPE;


xnode1 XMLTYPE := XMLTYPE (



<servlet xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd">


  <servlet-name>XMLDBServletPrimer</servlet-name>


  <servlet-language>Java</servlet-language>


<display-name> Oracle XML DB Servlet Primer </ display-name>


  <servlet-class>XMLDBServlet</servlet-class>


  <servlet-schema>SCOTT</servlet-schema>


</servlet>


“);


xnode2 XMLTYPE := XMLTYPE (



<servlet-mapping xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd">


  <servlet-pattern>/xdbserv</servlet-pattern>


  <servlet-name>XMLDBServletPrimer</servlet-name>


</servlet-mapping>


“);


BEGIN


SELECT DBMS_XDB.CFG_GET ( ) INTO xval FROM dual;


SELECT


 INSERTCHILDXML (


   xval, “/xdbconfig//servlet-list”, “servlet”, xnode1


 )


INTO xval FROM dual


;


SELECT


 INSERTCHILDXML (


xval, "/ xdbconfig / / servlet-mappings", "servlet-mapping", xnode2


 )


INTO xval FROM dual


;


DBMS_XDB.CFG_UPDATE ( xval );


COMMIT;


END;


/


Тепер звернення за адресою:


http://localhost:8080/xdbserv?rex=Caesor


дасть результат:


 


 

 

 

 

 

 

 

Видача даних у форматі HTML і звернення до БД робиться як звичайно.

Наприклад, для переходу до HTML в даному випадку навіть не обов'язково користуватися класом HttpServlet. Досить в описі сервлета замінити text / xml на text / html і вилучити рядок out.println ("<? Xml version =" 1.0 "?>");. Перетрансліровав сервлет, отримаємо за тією ж адресою:


 


 

 

 

 

 

 

 

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*