Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 439

Ильдар Шаукатович Хабибуллин

public JspWriter getEnclosingWriter();

класса BodyContent.

Приведем пример. Пусть тег query, описанный в TLD-файле sdotaglib.tld следующим образом:

<tag>

<name>query</name>

<tag-class>sdotags.QueryTag</tag-class>

<body-content>tagdependent</body-content>

<attribute>

<name>size</name> <required>false</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

содержит в своем теле SQL-запросы, например:

<sdo: query>

SELECT * FROM students </sdo:query>

В листинге 27.8 приведен фрагмент обработчика этого тега.

Листинг 27.8. Пользовательский тег обработки SQL-запросов

package sdotags;

import java.sql.*;

import javax.servlet.jsp.*;

import j avax.servlet.jsp.tagext.*;

public class QueryTag extends BodyTagSupport{

private Connection conn; private ResultSet rs;

public int doStartTag(){

// . . .

return EVAL_BODY_BU FFERED;

}

public void doInitBody(){

conn = DriverManager.getConnection(. . .); // Проверка соединения

}

public int doAfterBody(){

BodyContent bc = getBodyContent(); if (bc == null) return SKIP BODY;

String query = bc.getString();

try{

Statement st = conn.createStatement(); rs = st.executeQuery(query);

// Обработка результата запроса

JspWriter out = bc.getEnclosingWriter();

out.print("Вывод результатов"); }catch(Exception e){

System.err.println(e);

return SKIP_BODY;

}

public int doEndTag(){ conn = null; return EVAL_PAGE;

}

}

Обработка взаимодействующих тегов

Часто пользовательские теги, расположенные на одной странице JSP, должны взаимодействовать друг с другом. Например, тело тега может содержать другие, вложенные, теги JSP. Они могут быть самостоятельными по отношению к внешнему тегу или зависеть от него. Так, например, в языке HTML тег <tr> может появиться только внутри тега <table>. При этом атрибуты тега <table> могут использоваться в теге <tr>, а также могут быть переопределены внутри него. Таких примеров много в языке XML.

В языке JSP тоже могут появиться теги, зависящие друг от друга. Например, мы можем определить тег

<sdo:connection source="источник данных" >

устанавливающий соединение с базой данных, указанной в атрибуте source. Внутри этого тега допустимо обращение к базе данных, например:

<sdo:connection source="SDO" >

<sdo:query >

SELECT * FROM students </sdo:query>

<sdo:insert>

INSERT INTO students (name) VALUES ('Иванов')

</sdo:insert>

</sdo:connection>

Конечно, вложенные теги можно реализовать вложенными классами-обработчиками или расширениями внешних классов. Но в классах-обработчиках пользовательских тегов есть свои средства. Внешний и вложенный теги реализуются отдельными классами, расширяющими классы TagSupport или BodyTagSupport. Описания тегов в TLD-файле тоже не вложены, они записываются независимо друг от друга, например:

<tag>

<name>connection</name>

<tag-class>sdotags.ConnectionTag</tag-class>

</tag>

<tag>

<name>query</name>

<tag-class>sdotags.QueryTag</tag-class>