Читать «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>