Спецификация Java Server Pages 1.2

         

A.1 Простейшая JSP-Страница


Мы начинаем с простейшей JSP-страницы HelloWorld.jsp.

<%@ page info="Пример предварительно скомпилированной JSP" %>

<p>

Hello World

</p>



A.2 JSP-Страница, Упакованная как Источник/source в WAR-Файл


JSP-страница может быть упакована в WAR-файл простым помещением её в "/HelloWorld.jsp", где отображение расширения JSP-страницы по умолчанию будет её получать.

Web.xml тривиален:
 

<!DOCTYPE webapp

SYSTEM "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<webapp>

<session-config>

<session-timeout> 1 </session-timeout>

</session-config>

</webapp>



A.3 Сервлет/Servlet для Откомпилированной JSP-Страницы


В качестве альтернативы мы покажем, как можно откомпилировать JSP-страницу в Servlet-класс для запуска на прогон в JSP-контейнере.

JSP-страница компилируется в Сервлет с некоторым зависящим от реализации именем _jsp_HelloWorld_XXX_Impl. Servlet-код, зависящий только от API JSP 1.2 и Servlet 2.3, таков:

imports javax.servlet.*;



imports javax.servlet.http.*;

imports javax.servlet.jsp.*;

class _jsp_HelloWorld_XXX_Impl

extends_PlatformDependent_Jsp_Super_Impl {

public void _jspInit() {

// ...

}

public void jspDestroy() {

// ...

}

static JspFactory_factory= JspFactory.getDefaultFactory();

public void _jspService(HttpServletRequest request,

HttpServletResponse response)

throws IOException;

{

Object page= this;

HttpSessionsession= request.getSession();

ServletConfigconfig= getServletConfig();

ServletContextapplication = config.getServletContext();

PageContextpageContext

= _factory.getPageContext(this,

request,

response,

(String)NULL,

true,

JspWriter.DEFAULT_BUFFER,

true

);

JspWriterout= pageContext.getOut();

// контекст страницы создаёт начальный JspWriter "out"

try {

out.println("<p>");

out.println("Hello World");

out.println("</p>");

} catch (Exception e) {

pageContext.handlePageException(e);

} finally {

_factory.releasePageContext(pageContext);

}

}

}



A.4 Дескриптор Web-Приложения


Servlet начинает выглядеть как JSP-страница в следующем web.xml:
 

<!DOCTYPE webapp

SYSTEM "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<webapp>

<servlet>

<servlet-name> HelloWorld </servlet-name>

<servlet-class> _jsp_HelloWorld_XXX_Impl.class </servlet-class>

</servlet>

<servlet-mapping>

<servlet-name> HelloWorld </servlet-name>

<url-pattern> /HelloWorld.jsp </url-pattern>

</servlet-mapping>

<session-config>

<session-timeout> 1 </session-timeout>

</session-config>

</webapp>



A.5 WAR для Откомпилированной JSP-Страницы


Наконец, всё это упаковывается в WAR:
 

/WEB-INF/web.xml

/WEB-INF/classes/_jsp_HelloWorld_XXX_Impl.class

Заметьте, что, если класс Servlet, сгенерированный для JSP-страницы, зависел от некоторых классов поддержки, они также должны были быть включены в WAR.



API Развёртывания Тэгов


В этой главе описываются обработчики тэгов и другие классы развёртывания тэгов, а также методы доступа к файлам Tag Library Descriptor/Дескриптора Библиотеки Тэгов. Это дополняет предыдущую главу описанием формата файлов Tag Library Descriptor и их использование в директивах taglib.


Эта глава включает содержимое, сгенерированное автоматически из javadoc, внедрённых в реальные Java-классы и интерфейсы. Это позволяет создавать единый авторизованный документ-спецификацию.


Специальные акции могут использоваться авторами и утилитами авторизации JSP для упрощения процесса написания JSP-страниц. Специальные акции могут быть пустыми или непустыми акциями.


Пустой тэг не имеет тела. Есть два эквивалентных синтаксиса, один - с отдельными начальным и конечным тэгами, другой - в котором начальный и конечный тэги скомбинированы в один тэг.


Следующие два пример идентичны:


<x:foo att=“myObject” />

<x:foo att=“myObject” ></foo>


Непустой тэг имеет начальный тэг, тело и конечный тэг.


Пример-прототип имеет форму:


<x:foo att=“myObject” >

BODY

</x:foo/>

Спецификация JavaServer Pages(тм) (JSP) 1.2 предоставляет переносимый механизм для описания библиотек тэгов, включающий:

Tag Library Descriptor (TLD)/Дескриптор Библиотеки Тэгов (ДБТ)

Несколько классов обработчика тэга, определяющих поведение времени запроса

Несколько классов, определяющих поведение времени трансляции

Дополнительные ресурсы, используемые этими классами


Данная глава разбита на три раздела:

Первый раздел представляет базовые классы обработчика тэга.

Во втором разделе описаны более сложные обработчики тэга, которым необходим доступ к обсчёту их тела.

Последний раздел посвящён вопросам этапа/времени трансляции.



B.1 ОТД для Документов JSP


Далее идут ОТД для JSP-документов. Поскольку JSP-документ "знает" о пространстве имён, это ОТД включено здесь просто для информационных целей.

<!-- ОТД для JSP 1.2 -->

<!--

Это ОТД не является объектом условия или параметра во внутреннем поднаборе и не экспортирует никаких общих объектов.

-->

<!-- Constrained Names/Ограниченные Имена -->

<!ENTITY % URI “CDATA”>

<!-- Uniform Resource Identifier, см. [RFC2396] -->

<!ENTITY % UriList “CDATA”>

<!-- список разделённых пробелами Uniform Resource Identifiers -->

<!ENTITY % URL “CDATA”>

<!-- относительный urlSpec, см. в Разделе 2.10.2. -->

<!ENTITY % BeanID “IDREF”>

<!-- ранее объявленный ID боба в текущей области видимости -->

<!ENTITY % Prefix “CDATA”>

<!-- Name, не содежащее символов :  -->

<!ENTITY % ClassName “CDATA”>

<!-- полное квалифицированное имя класса -->

<!ENTITY % TypeName “CDATA”>

<!-- полное квалифицированное имя класса или интерфейса -->

<!ENTITY % BeanName “CDATA”>

<!-- имя боба/bean, как предполагается методом java.beans.Beans instantiate(). -->

<!ENTITY % Content “CDATA”>

<!-- MIME-тип с последующим набором символов IANA, как “ type [; S? [‘charset=’] char-set]

“ -->

<!ENTITY % Length “CDATA”>

<!-- nn для пикселной или nn% для процентной величины -->

<!ENTITY % Pixels “CDATA”>

<!-- целое, представляющее величину в пикселах -->

<!ENTITY % Bool “(true|false|yes|no)”>

<!-- булев -->

<!-- используется для object, applet, img, input и iframe -->

<!ENTITY % ImgAlign “(top|middle|bottom|left|right)”>

<!-- Группы Элементов -->

<!ENTITY % Directives “jsp:directive.page|jsp:directive.include”>

<!ENTITY % Scripts “jsp:scriptlet|jsp:declaration|jsp:expression”>

<!ENTITY % Actions “jsp:useBean|jsp:setProperty|jsp:getProperty|jsp:include

|jsp:forward|jsp:plugin”>

<!ENTITY % Body “(jsp:text|%Directives;|%Scripts;|%Actions;)*”>


<!-- Элемент -->

<!-- Корневой элемент JSP-страницы.-->

<!ELEMENT jsp:root %Body;>

<!ATTLIST jsp:root

xmlns:jsp CDATA “http://java.sun.com/JSP/Page”

version CDATA #REQUIRED

>

<!ELEMENT jsp:directive.page EMPTY>

<!ATTLIST jsp:directive.page

language CDATA “java”

extends %ClassName; #IMPLIED

contentType %Content; “text/html; ISO-8859-1”

import CDATA #IMPLIED

session %Bool; “true”

buffer CDATA “8kb”

autoFlush %Bool; “true”

isThreadSafe %Bool; “true”

info CDATA #IMPLIED

errorPage %URL; #IMPLIED

isErrorPage %Bool; “false”

>

<!-- элемент jsp:directive. include появляется только в JSP-документах и не появляется

в XML-просмотрах JSP-страниц -->

<!ELEMENT jsp:directive.include EMPTY>

<!ATTLIST jsp:directive.include

file %URI; #REQUIRED

>

<!ELEMENT jsp:scriptlet (#PCDATA)>

<!ELEMENT jsp:declaration (#PCDATA)>

<!ELEMENT jsp:expression (#PCDATA)>

<!ELEMENT jsp:useBean %Body;>

<!ATTLIST jsp:useBean

id ID #REQUIRED

class %ClassName; #IMPLIED

type %TypeName; #IMPLIED

beanName %BeanName; #IMPLIED

scope (page

|session

|request

|application) “page”

>

<!ELEMENT jsp:setProperty EMPTY>

<!ATTLIST jsp:setProperty

name %BeanID; #REQUIRED

property CDATA #REQUIRED

value CDATA #IMPLIED

param CDATA #IMPLIED

>

<!ELEMENT jsp:getProperty EMPTY>

<!ATTLIST jsp:getProperty

name %BeanID; #REQUIRED

property CDATA #REQUIRED

>

<!ELEMENT jsp:include (jsp:param*)>

<!ATTLIST jsp:include

flush %Bool; “false”

page %URL; #REQUIRED

>

<!ELEMENT jsp:forward (jsp:param*)>

<!ATTLIST jsp:forward

page %URL; #REQUIRED

>

<!ELEMENT jsp:plugin (jsp:params?, jsp:fallback?)>

<!ATTLIST jsp:plugin

type (bean|applet) #REQUIRED

code %URI; #IMPLIED

codebase %URI; #IMPLIED

align %ImgAlign; #IMPLIED

archive %UriList; #IMPLIED

height %Length; #IMPLIED

hspace %Pixels; #IMPLIED

jreversion CDATA “1.2”

name NMTOKEN #IMPLIED

vspace %Pixels; #IMPLIED

width %Length; #IMPLIED

nspluginurl %URI; #IMPLIED

iepluginurl %URI; #IMPLIED

>

<!ELEMENT jsp:params (jsp:param+)>

<!ELEMENT jsp:param EMPTY>

<!ATTLIST jsp:param

name CDATA #REQUIRED

value CDATA #REQUIRED

>

<!ELEMENT jsp:text #PCDATA>


B.2 XSchema-Описание для Документов JSP


Далее идёт описание, использующее XML Schema:
 

<?xml version ="1.0"?>

<!DOCTYPE schema [

<!-- Патэрны -->

<!ENTITY Identifier "(\p{L}|_|$)(\p{N}|\p{L}|_|$)*">

<!ENTITY TypeName "&Identifier;(\.&Identifier;)*">

<!ENTITY WS "\s*">

<!ENTITY Import "&TypeName;(\.\*)?">

<!ENTITY ImportList "&Import;(&WS;,&WS;&Import;)*">

<!ENTITY SetProp "(&Identifier;|\*)">

<!ENTITY RelativeURL "[^:#/\?]*(:{0,0}|[#/\?].*)">

<!ENTITY Length "[0-9]*&#x25;?">

<!ENTITY AsciiName "[A-Za-z0-9_-]*">

<!ENTITY ValidContentType

"&AsciiName;/&AsciiName;(;&WS;(charset=)?&AsciiName;)?">

<!ENTITY ValidPageEncoding "&AsciiName;/&AsciiName;">

<!ENTITY Buffer "[0-9]+kb">

<!ENTITY RTexpr "&#x25;=.*&#x25;">

]>

<!--Соответствует w3c http://www.w3.org/2001/XMLSchema -->

<xsd:schema

xmlns = "http://java.sun.com/JSP/Page"

xmlns:xsd = "http://www.w3.org/2001/XMLSchema"

xmlns:jsp = "http://java.sun.com/JSP/Page"

targetNamespace = "http://java.sun.com/JSP/Page"

elementFormDefault = "qualified"

attributeFormDefault = "unqualified">

<xsd:annotation>

<xsd:documentation>

XML Schema для JSP 1.2.

Эта схема базируется на последних (от 5 мая 2001) Рекомендациях W3C по XML Schema.

JSP-транслятор должен отбрасывать файл XML-формата, который не соответствует строго этой схеме или не соблюдает описанных здесь ограничений. Транслятор не обязан использовать эту схему для проверки либо использовать проверяющий разборщик.

</xsd:documentation>

</xsd:annotation>

<!-- Сложные Типы -->

<xsd:complexType name = "Body">

<xsd:annotation>

<xsd:documentation>

Body определяет элементы "верхнего уровня/top-level" в root и beanInfo.


Возможно есть другие элементы, которые должны его использовать.

</xsd:documentation>

</xsd:annotation>

<xsd:group ref = "Bodygroup" minOccurs = "0" maxOccurs = "unbounded"/>

</xsd:complexType>

<xsd:complexType name = "BasicType">

<xsd:simpleContent>

<xsd:extension base = "xsd:string">

<xsd:attribute ref = "jsp:id"/>

</xsd:extension>

</xsd:simpleContent>

</xsd:complexType>

<!-- группы -->

<xsd:group name = "Bodygroup">

<xsd:choice>

<xsd:element ref = "directive.page"/>

<xsd:element ref = "directive.include"/>

<xsd:element ref = "scriptlet"/>

<xsd:element ref = "declaration"/>

<xsd:element ref = "expression"/>

<xsd:element ref = "useBean"/>

<xsd:element ref = "setProperty"/>

<xsd:element ref = "getProperty"/>

<xsd:element ref = "include"/>

<xsd:element ref = "forward"/>

<xsd:element ref = "plugin"/>

<xsd:element ref = "text"/>

<xsd:any namespace="##other" processContents = "lax"/>

</xsd:choice>

</xsd:group>

<!-- jsp:id attribute -->

<xsd:attribute name = "id" type = "xsd:string"/>

<!--Должно иметься ограничение, что jsp:id является уникальным среди всех элементов документа. -->

<!-- Далее идут простые типы -->

<xsd:simpleType name = "RTE">

<xsd:annotation>

<xsd:documentation>

Значение выражения времени запроса

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&RTexpr;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "Bool">

<xsd:annotation>

<xsd:documentation>

Bool мог бы быть булевым, если бы принимал 1 и 0.



</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:NMTOKEN" >

<xsd:enumeration value = "true"/>

<xsd:enumeration value = "false"/>

<xsd:enumeration value = "yes"/>

<xsd:enumeration value = "no"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "Identifier">

<xsd:annotation>

<xsd:documentation>

Identifier это неквалифицированный Java-идентификатор.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&Identifier;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "TypeName">

<xsd:annotation>

<xsd:documentation>

TypeName это один или более Java-идентификаторов, разделённых точками без пробелов.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&TypeName;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "ImportList">

<xsd:annotation>

<xsd:documentation>

ImportList это один или более typeNames, разделённых запятыми.

Допускаются пробелы до и после запятой.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&ImportList;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "SetProp">

<xsd:annotation>

<xsd:documentation>

SetProp это Identifier или *.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&SetProp;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "RelativeURL">

<xsd:annotation>

<xsd:documentation>



RelativeURL это uriReference без символов двоеточия до первой  /, ? или #, если имеются (RFC2396).

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:anyURI">

<xsd:pattern value = "&RelativeURL;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "RTERelativeURL">

<xsd:union memberTypes = "RelativeURL RTE"/>

</xsd:simpleType>

<xsd:simpleType name = "Length">

<xsd:annotation>

<xsd:documentation>

Length это nn или nn%.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&Length;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "ExplicitBufferSize">

<xsd:annotation>

<xsd:documentation>

Размер Буфера с точным значением.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&Buffer;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "NoneBufferSize">

<xsd:annotation>

<xsd:documentation>

Размер Буфера/Buffer Size со значением "none".

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:enumeration value = "none"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "BufferSize">

<xsd:annotation>

<xsd:documentation>

Размер Буфера имеет значение xkb или none.

</xsd:documentation>

</xsd:annotation>

<xsd:union memberTypes = "ExplicitBufferSize NoneBufferSize"/>

</xsd:simpleType>

<xsd:simpleType name = "ContentType">

<xsd:annotation>

<xsd:documentation>

Contetn Type/Тип Содержимого для данной страницы.

</xsd:documentation>

</xsd:annotation>



<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&ValidContentType;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "PageEncoding">

<xsd:annotation>

<xsd:documentation>

Кодировка Страницы/ Page Encoding для данной страницы. По умолчанию - та же, что и в ContentType.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:string">

<xsd:pattern value = "&ValidPageEncoding;"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "Scope">

<xsd:annotation>

<xsd:documentation>

верные значения scope

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:NMTOKEN">

<xsd:enumeration value = "page"/>

<xsd:enumeration value = "session"/>

<xsd:enumeration value = "request"/>

<xsd:enumeration value = "application"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "PlugInType">

<xsd:annotation>

<xsd:documentation>

верные значения типа plugin'а

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:NMTOKEN">

<xsd:enumeration value = "bean"/>

<xsd:enumeration value = "applet"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name = "AlignType">

<xsd:annotation>

<xsd:documentation>

Размер буфера - xkb.

</xsd:documentation>

</xsd:annotation>

<xsd:restriction base = "xsd:NMTOKEN">

<xsd:enumeration value = "top"/>

<xsd:enumeration value = "middle"/>

<xsd:enumeration value = "bottom"/>

<xsd:enumeration value = "left"/>

<xsd:enumeration value = "right"/>

</xsd:restriction>

</xsd:simpleType>



<!-- Элементы -->

<xsd:element name = "root">

<xsd:annotation>

<xsd:documentation>

Корневой элемент всех JSP-документов называется root.

Авторы могут, если хотят, включать информацию о месте размещения схемы.

Если специфицирована, информация может появляться как атрибут элемента root так:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/JSP/Page xsd-file-location"

Документы не должны специфицировать системный идентификатор DTD/ОТД

- Определении Типа Данных - в объявлении DOCTYPE.

</xsd:documentation>

</xsd:annotation>

<xsd:complexType>

<xsd:complexContent>

<xsd:extension base = "Body">

<xsd:attribute name = "version" fixed = "1.2" type = "xsd:string"/>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

</xsd:element>

<xsd:element name = "directive.page">

<xsd:annotation>

<xsd:documentation>

directive.page это "директива page".

</xsd:documentation>

</xsd:annotation>

<xsd:complexType>

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "language" default = "java" type = "xsd:string"/>

<xsd:attribute name = "extends" type = "TypeName"/>

<xsd:attribute name = "contentType"

default = "text/html; ISO-8859-1" type = "ContentType"/>

<xsd:attribute name = "pageEncoding"

use = "optional" type = "PageEncoding"/>

<xsd:attribute name = "import" type = "ImportList"/>

<xsd:attribute name = "session" default = "true" type = "Bool"/>

<xsd:attribute name = "buffer" default = "8kb" type = "BufferSize"/>

<xsd:attribute name = "autoFlush" default = "true" type = "Bool"/>



<xsd:attribute name = "isThreadSafe" default = "true" type = "Bool"/>

<xsd:attribute name = "info" type = "xsd:string"/>

<xsd:attribute name = "errorPage" type = "RelativeURL"/>

<xsd:attribute name = "isErrorPage" default = "false" type = "Bool"/>

</xsd:complexType>

</xsd:element>

<xsd:element name = "directive.include">

<xsd:annotation>

<xsd:documentation>

directive.include это "директива include".

Этот элемент не появляется в XML-просмотре JSP-страниц.

</xsd:documentation>

</xsd:annotation>

<xsd:complexType>

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "file" use = "required" type = "RelativeURL"/>

</xsd:complexType>

</xsd:element>

<xsd:element name = "scriptlet" type = "BasicType">

<xsd:annotation>

<xsd:documentation>

Представление скриптлета.

</xsd:documentation>

</xsd:annotation>

</xsd:element>

<xsd:element name = "declaration" type = "BasicType">

<xsd:annotation>

<xsd:documentation>

Представление объявления.

</xsd:documentation>

</xsd:annotation>

</xsd:element>

<xsd:element name = "expression" type = "BasicType">

<xsd:annotation>

<xsd:documentation>

Представление выражения.

</xsd:documentation>

</xsd:annotation>

</xsd:element>

<xsd:element name = "text" type = "BasicType">

<xsd:annotation>

<xsd:documentation>

Точно переданный шаблонный текст.

</xsd:documentation>

</xsd:annotation>

</xsd:element>

<xsd:element name = "useBean">

<xsd:annotation>

<xsd:documentation>

useBean инстанциирует или имеет доступ к bean в специфицированной области видимости.



Ограничение: Допустимыми комбинациями атрибутов являются:

class [type] | type [( class | beanName)]

</xsd:documentation>

</xsd:annotation>

<xsd:complexType>

<xsd:complexContent>

<xsd:extension base="Body">

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "id" use = "required" type = "Identifier"/>

<xsd:attribute name = "class" type = "TypeName"/>

<xsd:attribute name = "type" type = "TypeName"/>

<xsd:attribute name = "beanName" type = "TypeName"/>

<xsd:attribute name = "scope" default = "page" type = "Scope"/>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

</xsd:element>

<xsd:element name = "setProperty">

<xsd:annotation>

<xsd:documentation>

setProperty изменяет значение  свойства объекта.

Ограничение: Именованный объект обязан быть

"представлен" JSP-процессору через использование либо

акции jsp:useBean, либо специальной акции с ассоциированным

входом VariableInfo для этого имени.

Точные верные комбинации не выражаются в XML Schema.

Это:

name="Identifier" property="*"

name="Identifier" property="Identfiier" param="string"

name="Identifier" property="Identifier" value="string"

</xsd:documentation>

</xsd:annotation>

<xsd:complexType>

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "name" use = "required" type = "Identifier"/>

<xsd:attribute name = "property" use = "required" type = "SetProp"/>

<xsd:attribute name = "param" type = "xsd:string"/>

<xsd:attribute name = "value" type = "xsd:string"/>

</xsd:complexType>

</xsd:element>



<xsd:element name = "getProperty">

<xsd:annotation>

<xsd:documentation>

getProperty получает значение свойства объекта.

Ограничение: Именованный объект обязан быть

"представлен" JSP-процессору через использование либо

акции jsp:useBean, либо специальной акции с ассоциированным

входом VariableInfo для этого имени.

</xsd:documentation>

</xsd:annotation>

<xsd:complexType>

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "name" use = "required" type = "Identifier"/>

<xsd:attribute name = "property" use = "required" type = "Identifier"/>

</xsd:complexType>

</xsd:element>

<xsd:element name = "include">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref = "param" minOccurs = "0" maxOccurs = "unbounded"/>

</xsd:sequence>

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "flush" default = "false" type = "Bool"/>

<xsd:attribute name = "page" use = "required" type = "RTERelativeURL"/>

</xsd:complexType>

</xsd:element>

<xsd:element name = "forward">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref = "param" minOccurs = "0" maxOccurs = "unbounded"/>

</xsd:sequence>

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "page" use = "required" type = "RTERelativeURL"/>

</xsd:complexType>

</xsd:element>

<xsd:element name = "plugin">

<xsd:complexType> <!-- content only! -->

<xsd:sequence>

<xsd:element ref = "params" minOccurs = "0" maxOccurs = "1"/>

<xsd:element name = "fallback"

minOccurs = "0" maxOccurs = "1" type = "Body"/>

</xsd:sequence>



<xsd: attribute ref = "jsp:id"/>

<xsd:attribute name = "type" use = "required" type = "PlugInType"/>

<xsd:attribute name = "code" type = "xsd:anyURI"/>

<xsd:attribute name = "codebase" type = "xsd:anyURI"/>

<xsd:attribute name = "align" type = "AlignType"/>

<xsd:attribute name = "archive">

<xsd:simpleType>

<xsd:list itemType="xsd:anyURI"/>

</xsd:simpleType>

</xsd:attribute>

<xsd:attribute name = "height" type = "Length"/>

<xsd:attribute name = "hspace" type = "xsd:int"/>

<xsd:attribute name = "jreversion" default = "1.2" type = "xsd:string"/>

<xsd:attribute name = "name" type = "xsd:NMTOKEN"/>

<xsd:attribute name = "vspace" type = "xsd:int"/>

<xsd:attribute name = "width" type = "Length"/>

<xsd:attribute name = "nspluginurl" type = "xsd:anyURI"/>

<xsd:attribute name = "iepluginurl" type = "xsd:anyURI"/>

</xsd:complexType>

</xsd:element>

<xsd:element name = "params">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref = "param" minOccurs = "1" maxOccurs = "unbounded"/>

</xsd:sequence>

<xsd:attribute ref = "jsp:id"/>

</xsd:complexType>

</xsd:element>

<xsd:element name = "param">

<xsd:complexType>

<xsd:attribute ref = "jsp:id"/>

<xsd:attribute name = "name" use = "required" type = "xsd:NMTOKEN"/>

<xsd:attribute name = "value" use = "required" type = "xsd:string"/>

</xsd:complexType>

</xsd:element>

</xsd:schema>


C.1 ОТД для Файлов TagLibrary-Дескриптора


Это ОТД, описывающее файл Tag Library Descriptor/Дескриптора Библиотеки Тэгов в формате JSP 1.2.
 

<!--Это ОТД, определяющее формат/синтаксис файла Дескриптора Библиотеки Тэгов (.tld) (XML) JavaServer Pages 1.2.

Tag Library/Библиотека Тэгов это JAR-файл (архив), содержащий верный экземпляр файла Дескриптора Библиотеки Тэгов (taglib.tld) в субдиректории META-INF, а также соответствующие классы реализации и другие ресурсы, необходимые для выполнения определённых в нём акций.

Использование является субъектом лицензирования.
-->

<!NOTATION WEB-JSPTAGLIB.1_2 PUBLIC “-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN”>

<!--Все ДБТ JSP 1.2 обязаны включать DOCTYPE в следующей форме:

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-->
<!--Элемент

taglib является корнем документа, он определяет:

tlib-version - версию данной реализации библиотеки тэгов;

jsp-version - версию JSP, на которой основана библиотека тэгов;

short-name - простое имя по умолчанию, которое может использоваться JSP-утилитами авторизации для создания имён с мнемоническим значением; например, it может быть использовано как значение префикса в директивах taglib, uri как uri, уникально идентифицирующий эту taglib;

display-name - элемент display-name содержит краткое имя, предназначенное для отображения утилитами;

small-icon - необязательная маленькая иконка, которая может использоваться утилитами;

large-icon необязательная большая иконка, которая может использоваться утилитами;

description - обычная строка, описывающая “use/использование” этой taglib, должна быть понятна пользователю;

validator - информация по выбору/optional TagLibraryValidator'а;

listener - по выбору, спецификация прослушивателя событий.

-->

<!ELEMENT taglib (tlib-version, jsp-version, short-name, uri?, display-name?, small-icon?, large-icon?, description?, validator?, listener*, tag+)>


<!ATTLIST taglib

id ID #IMPLIED

xmlns CDATA #FIXED “http://java.sun.com/JSP/TagLibraryDescriptor”>

 

<!-- Значение элемента

tlib-version описывает версию (номер) этой библиотеки тэгов.

Этот элемент является мандатным/обязательным.

#PCDATA ::= [0-9]*{ “.”[0-9] }0..3

-->

<!ELEMENT tlib-version (#PCDATA)

 

<!-- Значение элемента

jsp-version описывает JSP-версию (номер), который необходим данной библиотеке тэгов для правильного функционирования. Этот элемент является мандатным. Для JSP 1.2 значение будет  "1.2" (без кавычек).

#PCDATA ::= [0-9]*{ “.”[0-9] }0..3

-->

<!ELEMENT jsp-version (#PCDATA)>

 

<!-- Значением элемента

short-name является имя, которое может использоваться утилитами авторизации JSP для создания имён с мнемоническим значением; например, оно может быть использовано предпочтительное значение префикса в директивах taglib. Не используйте пробелы и не начинайте имя с цифры или символа подчёркивания.

#PCDATA ::= NMTOKEN

-->

<!ELEMENT short-name (#PCDATA)>

<!-- Значением элемента

uri является публичный URI, уникально идентифицирующий точную семантику этой библиотеки тэгов.

-->

<!ELEMENT uri (#PCDATA)>

<!-- Значением элемента

description является произвольная текстовая строка, описывающая библиотеку тэгов.

-->
<!ELEMENT description(#PCDATA)>

<!-- Элемент validator предоставляет информацию о необязательном проверщике, который можно использовать для проверки соответствия использования JSP-страницей данной библиотеки тэгов.

-->
<!ELEMENT validator (validator-class, init-param*, description?)>

<!-- Элемент

validator-class

определяет класс TagLibraryValidator, который может использоваться для проверки соответствия использования JSP-страницей данной библиотеки тэгов.

-->

<!ELEMENT validator-class (#PCDATA)>

<!-- Элемент init-param

содержит пару имя/значение как параметр инициализации.

-->
<!ELEMENT init-param (param-name, param-value, description?)>



<!-- Элемент param-name

содержит имя параметра.

-->
<!ELEMENT param-name (#PCDATA)>

<!-- Элемент param-value

содержит значение параметра.

-->
<!ELEMENT param-value (#PCDATA)>

<!-- Элемент listener определяет возможный/ optional объект прослушивателя событий, инстанциируемый и регистрируемый автоматически.

-->
<!ELEMENT listener (listener-class)>

<!-- Элемент listener-class

объявляет класс приложения, который обязан быть зарегистрирован как компонент/bean прослушивателя web-приложения.
См. детали в спецификации Servlet 2.3.

-->
<!ELEMENT listener-class (#PCDATA)>

<!-- Элемент tag определяет акцию в данной библиотеке тэгов. Элемент tag имеет один атрибут,id.

Элемент tag может иметь несколько субэлементов, определяющих:
name - уникальное имя акции

tag-class - класс обработчика тэга, реализующий javax.servlet.jsp.tagext.Tag

tei-class - необязательный подкласс класса javax.servlet.jsp.tagext.TagExtraInfo

body-content - тип содержимого тела

display-name - краткое имя, предназначенное для отображения утилитами

small-icon - необязательная небольшая иконка, которая может использоваться утилитами

large-icon - необязательная большая иконка, которая может использоваться утилитами

description - необязательная специфическая информация о тэге

variable - необязательная информация о переменной скриптинга
attribute - все атрибуты данной акции

example - необязательное неформальное описание примера использования данной акции.

-->
<!ELEMENT tag (name, tag-class, tei-class?, body-content?, display-name?, small-icon?, large-icon?, description?, variable*, attribute*, example?)>

<!-- Элемент

tag-class указывает подкласс класса javax.serlvet.jsp.tagext.Tag, реализующий семантику времени запроса для данного тэга. Этот элемент необходим.

#PCDATA ::= полное квалифицированное имя Java-класса

-->
<!ELEMENT tag-class (#PCDATA)>

<!-- Элемент tei-class указывает подкласс класса javax.serlvet.jsp.tagext.TagExtraInfo для данного тэга. Этот класс инстанциируется на этапе трансляции. Это элемент по выбору/optional.



#PCDATA ::= полное квалифицированное имя Java-класса

-->
<!ELEMENT tei-class (#PCDATA)>

<!-- Элемент body-content

предоставляет информацию о содержимом тела данного тэга. Этот элемент предназначается прежде всего для утилитами компоновки страниц.

В настоящее время специфицировано 3 значения:

tagdependent - тело тэга интерпретируется самой реализацией тэга и как правило на другом “langage”, например, встроенные операторы SQL

JSP - тело тэга содержит вложенный JSP-синтаксис

empty - тело тэга обязано быть пустым

Это необязательный для использования элемент; значение по умолчанию - JSP.

#PCDATA ::= tagdependent | JSP | empty
-->
<!ELEMENT body-content (#PCDATA)>

<!-- Элемент display-name

содержит краткое имя, которое предназначено для отображения утилитами.
-->
<!ELEMENT display-name (#PCDATA)>

<!-- Элемент large-icon

содержит имя файла, содержащего большое (32 x 32) изображение-иконку. Эта иконка может использоваться утилитами.

Имя файла задано в относительном пути библиотеки тэгов. Изображение обязано иметь формат JPEG или GIF, а имя файла обязано заканчиваться суффиксом “.jpg” или “.gif”, соответственно.

-->
<!ELEMENT large-icon (#PCDATA)>

<!-- Элемент small-icon

содержит имя файла, содержащего маленькое (16 x 16) изображение-иконку. Эта иконка может использоваться утилитами.

Имя файла задано в относительном пути библиотеки тэгов. Изображение обязано иметь формат JPEG или GIF, а имя файла обязано заканчиваться суффиксом “.jpg” или “.gif”, соответственно.
-->
<!ELEMENT small-icon (#PCDATA)>

<!-- Элемент example предоставляет неформальное описание примера использования тэга.

-->
<!ELEMENT example (#PCDATA)>

<!-- Элемент variable предоставляет информацию о переменных скриптинга, определённых данным тэгом.

Ошибкой (времени трансляции) для данной акции будет считаться, если одна или более субэлементов переменной будут иметь класс TagExtraInfo, который возвращает не-null объект.

Субэлементы в variable имеют форму:
name-given - имя переменной - константа



name-from-attribute - имя атрибут. чьё значение (времени трансляции) даст имя переменной.

Необходимо наличие одного из элементов: name-given или name-from-attribute.

variable-class - имя класса переменной. java.lang.String - имя по умолчанию.

declare - объявляется переменная, или нет. "True" - значение по умолчанию.

scope - область видимости определённой переменной скриптинга. NESTED - по умолчанию.
-->

<!ELEMENT variable ( (name-given | name-from-attribute), variable-class?, de-clare?, scope?, description?)>

<!-- Элемент name-given

предоставляет имя переменной скриптинга. Необходимо наличие одного из элементов: name-given или name-from-attribute.
-->
<!ELEMENT name-given (#PCDATA)>

<!-- Значением элемента name-from-attribute является имя атрибута, чьё значение (времени трансляции) даст имя переменной. Необходимо наличие одного из элементов: name-given или name-from-attribute.
-->
<!ELEMENT name-from-attribute (#PCDATA)>

<!-- Элемент variable-class

это имя класса для переменной скриптинга. Это элемент по выбору/optional; по умолчанию - java.lang.String.

-->
<!ELEMENT variable-class (#PCDATA)>

<!-- Значение элемента

declare указывает, определяется переменная скриптинга, или нет.
См. детали в TagExtraInfo.

Это необязательный элемент/optional и по умолчанию - true.
-->
<!ELEMENT declare (#PCDATA)>

<!-- Значение элемента

scope описывает область видимости переменной скриптинга.
См. детали в TagExtraInfo.

Это необязательный элемент/optional и значение по умолчанию - строка “NESTED”. Другими допустимыми значениями являются “AT_BEGIN” и “AT_END”.
-->

<!ELEMENT scope (#PCDATA)>

<!-- Элемент attribute определяет атрибут для вкладывающего/содержащего тэга.

Элемент attributre может иметь несколько субэлементов:
name - имя атрибута

attribute - необходим/required атрибут, или необязателен/optional

rtexpravalue  - является ли этот атрибут атрибутом времени выполнения/runtime
type - тип атрибута



description - описание атрибута
-->
<!ELEMENT attribute (name, required? , rtexprvalue?, type?, description?)>

<!-- Элемент name

определяет каноническое имя определяемых тэга или атрибута

#PCDATA ::= NMTOKEN
-->
<!ELEMENT name(#PCDATA)>

<!-- Значение элемента

required указывает, обязателен или необязателен вкладывающий атрибут. Этот элемент необязателен, и значение по умолчанию - "false".

#PCDATA ::= true | false | yes | no
-->
<!ELEMENT required (#PCDATA)>

<!-- Значение элемента

rtexpvalue указывает, может ли значение атрибута динамически вычисляться на этапе запроса, что противоположно static-значению, определяемому на этапе трансляции. Этот элемент необязателен, и значение по умолчанию - "false".

#PCDATA ::= true | false | yes | no
-->
<!ELEMENT rtexprvalue (#PCDATA)>

<!-- Значение элемента type описывает Java-тип значения атрибута.

Для static-значений (которые определяются на этапе трансляции) тип всегда java.lang.String.
-->

<!ELEMENT type (#PCDATA)>
<!-- ID-атрибуты -->

<!ATTLIST tlib-version id ID #IMPLIED>
<!ATTLIST jsp-version id ID #IMPLIED>

<!ATTLIST short-name id ID #IMPLIED>
<!ATTLIST uri id ID #IMPLIED>

<!ATTLIST description id ID #IMPLIED>
<!ATTLIST example id ID #IMPLIED>

<!ATTLIST tag id ID #IMPLIED>
<!ATTLIST tag-class id ID #IMPLIED>

<!ATTLIST tei-class id ID #IMPLIED>
<!ATTLIST body-content id ID #IMPLIED>

<!ATTLIST attribute id ID #IMPLIED>
<!ATTLIST name id ID #IMPLIED>

<!ATTLIST required id ID #IMPLIED>
<!ATTLIST rtexprvalue id ID #IMPLIED>

<!ATTLIST param-name id ID #IMPLIED>
<!ATTLIST param-value id ID #IMPLIED>

<!ATTLIST listener id ID #IMPLIED>
<!ATTLIST listener-class id ID #IMPLIED>


D.1 ОТД для Файлов TagLibrary-Дескриптора


Следующее ОТД описывает файл Tag Library Descriptor в формате JSP 1.1.

<!--Это ОТД, определяющее файл (.tld) (XML) формата/синтаксиса JavaServer Pages 1.1 Tag Library descriptor'а.

Tag Library/Библиотека Тэгов это JAR-файл, содержащий файл верных экземпляров Tag Library Descriptor'а (taglib.tld) в субдиректории META-INF вместе с с соответствующими реализующими классами и другими ресурсами, необходимыми для реализации тэгов, определённых в ней.

Использование является субъектом лицензирования.
-->
<!-- Тэг taglib является корнем документа, он определяет:

tlibversion  - версия реализации библиотеки тэгов

jspversion - версия JSP, на которой основана библиотека тэгов

shortname - простое краткое имя по умолчанию, которое может использоваться утилитами авторизации JSP для создания имён с мнемоническим значением; например, it может использоваться как предпочтительное значение префикса в директивах taglib

uri - uri, уникально идентифицирующий эту taglib

info - простая строка, описывающая “использование” этой taglib, должна различаться пользователем
-->
<!ELEMENT taglib (tlibversion, jspversion?, shortname, uri?, info?, tag+)>

<!ATTLIST taglib id ID #IMPLIED
xmlns CDATA #FIXED

“http://java.sun.com/dtd/web-jsptaglibrary_1_1.dtd”
>

<!-- Описывает версию (номер) библиотеки тэгов (dewey decimal) #PCDATA ::= [0-9]*{ “.”[0-9] }0..3
-->

<!ELEMENT tlibversion (#PCDATA)>

<!--Описывает версию (номер), наличия которой требует эта библиотеки тэгов для правильного функционирования (dewey decimal)
По умолчанию 1.1

#PCDATA ::= [0-9]*{ “.”[0-9] }0..3
-->

<!ELEMENT jspversion (#PCDATA)>

<!-- Определяет краткое (по умолчанию) shortname, используемое для имён тэгов и переменных, используемых/созданных этой библиотекой тэгов. Не используйте пробелы и не начинайте с цифры или символа подчёркивания.

#PCDATA ::= NMTOKEN
-->
<!ELEMENT shortname (#PCDATA)>

<!-- Определяет публичный URI, который уникально идентифицирует эту версию библиотеки тэгов. оставьте его пустым, если он не применяется.
-->


<!ELEMENT uri (#PCDATA)>

<!-- Определяет произвольную текстовую строку - описание библиотеки.
-->

<!ELEMENT info(#PCDATA)>

<!-- Этот тэг определяет уникальный tag в данной библиотеке тэгов, определяя:

- уникальное имя тэга/элемента

- подкласс класса реализации javax.servlet.jsp.tagext.Tag

- необязательный/optional подкласс от javax.servlet.jsp.tagext.TagExtraInfo

- тип содержимого тела (hint/подсказка)

- необязательную специфическую информацию тэга

- любые атрибуты
-->

<!ELEMENT tag (name, tagclass, teiclass?, bodycontent?, info?, attribute*)>

<!-- Определяет подкласс от javax.serlvet.jsp.tagext.Tag, реализующий семантику времени запросадля данного тэга. (необходим)
#PCDATA ::= полное квалифицированное имя Java-класса
-->

<!ELEMENT tagclass (#PCDATA)>

<!-- Определяет подкласс от javax.servlet.jsp.tagext.TagExtraInfo для данного тэга (необязательный). Если не задан, к классу не обращаются на этапе трансляции.
#PCDATA ::= полное квалифицированное имя Java-класса

-->
<!ELEMENT teiclass (#PCDATA)>

<!-- Предоставляет подсказку о содержимом тела тэга. Предназначен прежде всего для использования утилитами компоновки страниц.

В настоящий момент специфицированы три значения:

tagdependent - Тело тэга интерпретируется реализацией самого тэга и вероятнее всего - на другом “language/языке”, например, встроенные операторы SQL.

JSP - Тело тэга содержит вложенный синтаксис JSP

empty - Тело тэга обязано быть пустым. По умолчанию (если не определено) - JSP.

#PCDATA ::= tagdependent | JSP | empty
-->
<!ELEMENT bodycontent (#PCDATA)>

<!-- Тэгattribute определяет атрибут вкладывающих/содержащих тэгов.

Определение атрибута состоит из:

- имени атрибута (необходимо)

- необходим атрибут, или по выбору (optional)

- может ли значение атрибута динамически вычисляться на этапе прогона выражением скриптлета (optional)

-->
<!ELEMENT attribute (name, required? , rtexprvalue?)>

<!-- Определяет каноническое имя определяемого тэга или атрибута.



#PCDATA ::= NMTOKEN
-->
<!ELEMENT name(#PCDATA)>

<!-- Определяет необходим/ required вкладывающий атрибут, или по выбору/optional.

#PCDATA ::= true | false | yes | no

Если отсутствует, тогда по умолчанию - “false”, то есть атрибут по выбору/optional.

-->
<!ELEMENT required (#PCDATA)>

<!-- Определяет, может ли вкладывающий атрибут иметь в качестве значения выражения скриптлета, т.е. может ли значение атрибута динамически рассчитываться во время запроса, что противоположно static/статическому значению, определяемому на  этапе трансляции.
#PCDATA ::= true | false | yes | no

Если отсутствует, тогда по умолчанию - “false”, то есть атрибут имеет статическое значение.

-->
<!ELEMENT rtexprvalue (#PCDATA)>

<!ATTLIST tlibversion id ID #IMPLIED>
<!ATTLIST jspversion id ID #IMPLIED>

<!ATTLIST shortname id ID #IMPLIED>
<!ATTLIST uri id ID #IMPLIED>

<!ATTLIST info id ID #IMPLIED>
<!ATTLIST tag id ID #IMPLIED>

<!ATTLIST tagclass id ID #IMPLIED>
<!ATTLIST teiclass id ID #IMPLIED>

<!ATTLIST bodycontent id ID #IMPLIED>
<!ATTLIST attribute id ID #IMPLIED>

<!ATTLIST name id ID #IMPLIED>
<!ATTLIST required id ID #IMPLIED>

<!ATTLIST rtexprvalue id ID #IMPLIED>


E.1.1 Добавлен Механизм jsp:id


Был добавлен новый механизм, позволяющий нуждающимся JSP-контейнерам предоставлять расширенную информацию об ошибках времени трансляции из классов TagLibraryValidator. Запись TagLibraryValidator.validate() была слегка модифицирована и был добавлен новый класс ValidationMessage. Эти объекты действуют через новый атрибут jsp:id, который по выбору поддерживается JSP-контейнером и представляется только через вид XML страницы JSP. Были затронуты: Глава JSP.5 (в основном ), Глава JSP.7 () и Глава JSP.10 ().



E.1.2 Другие Незначительные Изменения


height & width стали rtexprs. Был затронут .

Добавлена конверсия значения атрибута от String-литерала к short и Short и откорректирована конверсия для char и Character в Таблице JSP.2-2.

Откорректирован оператор допустимых возвращаемых значений doStartTag() для Tag, IterationTag и BodyTag. PFD2 некорректно указывал, что "emtpy/пустые" тэги могут возвращать только SKIP_BODY; корректное утверждение: тэги, чьё body-content - "empty", могут возвращать только SKIP_BODY.



E.1.3 Разъяснение Роли id


Мандатные интерпретации атрибута "id" в Разделе JSP 2.13.3 (что id представляет уникальные id в пределах страницы) и атрибута "scope" в Разделе JSP 2.13.4 (касающиеся области видимости вводимого значения) не форсировались большинством (возможно, всеми?) контейнерами и были несовместимы с распространённой практикой разработки библиотек специальных тэгов. Именно эти разделы интерпретировались как локализованные утверждения о стандартной акции jsp:useBean. Это было сделано недвусмысленным, и эти разделы были перемещены в Главу 4, что отразить данные изменения. Были изменены Разделы JSP.2.13.3 и JSP.2.13.4 и Глава 4.



E.1.4 Разъяснение Множественных Запросов/Multiple Requests и Потоков


Разъясняется, что экземпляры TLV должны надёжно распределяться по потокам. Это изменение сделано в .

Разъясняется, что экземпляр обработчика тэга активно обрабатывает только один запрос за раз; это происходит, если обработчик тэга инстанциируется afresh

через вызовы new(), но это требует произнесения/spelling, как только вводится пулинг/pooling обработчика тэга. Это разъяснение действует для Раздела .



E.1.5 Разъяснение JSP-Документов


Несколько разъяснений к Главе 5.

Подтверждено, что в JSP-странице в синтаксисе XML важен URI для основных акций jsp, а не префикс.

Разъяснено, что <?xml ... ?> не требуется (как указано в XML spec).

Дополнительно разъясняется интерпретация пробела в JSP-документах.



E.1.6 Разъяснение по Хорошо Известным Библиотекам Тэгов


Разъяснено, что автор библиотеки тэгов может указать в комментариях, что обработчик тэга может показывать на этапе прогона только некоторый поднабор информации, описанной через класс реализации обработчика тэга. Это применяется для специализированных реализаций известных библиотек тэгов, таких как стандартная библиотека тэгов JSP. Это разъяснение повлияло на описание элемента tag в Разделе JSP.7.4 и на описание Tag.setParent() и TagSupport.findAncestorWithClass(). Удалён последний параграф в Разделе JSP.7.3.9; у нас нет в планах удалять хорошо известный URI-механизм. В целом "прочищено" описание вычисления отображения taglib между URI и путём ресурса TLD; предыдущая версия была дебильной.



E.1.7 Разъяснено Влияние Блоков


Разъяснено правильное использование и роль блок-конструкций в скриптлетах и вложенных акциях. Это незначительно изменило Разделы JSP.2.3.3, JSP.6.4, JSP.6.4.4 и JSP.10.5.9.



E.1.8 Другие Небольшие Разъяснения


Более точно указано, что размещение иконок делается относительно TLD-файла. Был изменён Раздел JSP.7.4.

Удалён ненормативный комментарий о JSR-045 в Разделе JSP.2.1.6.

Удалён комментарий о том, что errorPages должны быть JSP-страницами, они могут также быть static-объектами. Изменена Таблица JSP.2-1.

Подтверждено, что прослушиватели событий/event listeners в библиотеке тэгов регистрируются до старта приложения. Изменён .

Разъяснено, когда нужно использовать соглашения по кавычкам для значений атрибутов. Разъяснено, что значения атрибутов времени запроса следуют тем же правилам. Изменены Разделы JSP.2.3.5, JSP.2.6 и JSP.2.13.1.

Разъяснена интерпретация соответствующих спецификаций для директив include и для акций jsp:include и jsp:forward. Изменены Разделы JSP.2.2.1, JSP.2.10.4, JSP.4.4 и JSP.4.5

Исправлено несоответствие протокола прекомпиляции в , касающееся того, направляются ли запросы странице или нет: не направляются.

Разъяснено, что субэлемент <type> в <attribute> в файле TLD должен соответствовать ему же в свойстве лежащего в его основе компонента JavaBean.

Разобрано использование ClassLoader.getResource() при получении данных от класса TagLi-braryValidator.



E.1 Изменения в PFD 2 и Финальном Проекте/Final Draft


Это окончательная версия, одобренная JCP Executive Comittee; документ был обновлён для того, чтобы отразить этот статус. Все полосы изменений/change bars были переустановлены.



E.2.1 Элементы, Добавленные к Дескриптору Библиотеки Тэгов


Дескриптор Библиотеки Тэгов/Tag Library Descriptor (TLD) был расширен описательной информацией для пользователей библиотеки тэгов. Конкретнее, TLD можно теперь непосредственно вставить (например, используя таблицу стилей XSLT) в документ конечного пользователя. Был добавлен новый элемент <example> в качестве необязательного субэлемента в <tag>.

Существующий элемент <description> был сделан верным необязательным субэлементом в <variable>, <attribute> и в <validator>.

Были изменены Раздел JSP.7.4 и Приложение JSP.C. ОТД TLD 1, и Схемы/Schemas также были изменены.



E.2.2 Изменён Способ Кодировки Информации о Версии в TLD


Этот механизм, используемый для предоставления в TLD информации о версии, был изменён.

В PFD версия кодировалась в пространстве имён. В PFD2 не предполагается изменять пространство имён, если только это не изменения несовместимости, и версия кодируется в элементе <jsp-version>, который теперь является мандатным.

Новый URI для пространства имён: "".

Были изменены Глава JSP.7 и Приложение JSP.C.



E.2.3 Назначение String-Литералов Атрибутам Object


Теперь можно назначать строковые литералы атрибуту, определённому как имеющий тип Object, а также свойству типа Object. Все верные конвертации типов описаны в и используются по ссылке в семантике <jsp:setProperty>.



E.2.4 Разъяснение по Верным Именам Префиксов, Акций и Атрибутов


Мы дали разъяснение по верным именам для префиксов, используемых в директивах taglib, именам элементов, используемых в акциях, и именам атрибутов.



E.2.5 Разъяснение по Деталям Пустых Акций


В спецификации JSP 1.1 различаются пустые/empty и непустые/non-empty акции, хотя лучше было бы дать описание. К сожалению, эскиз/проект JSP 1.2 PFD1 не улучшил это описание. Этот проект улучшил описание, указав точнее, какие методы при этом вызываются. Были изменены Главы 2, 7 и 10.



E.2.6 Коррекция Синтаксиса, Относящегося к XML


Мы разъяснили несколько вопросов, относящихся к синтаксису XML для JSP-страниц и к XML-просмотру/view JSP-страницы. Большинство изменений сделаны в Главе 5.

Удалён несуществующий атрибут flush в директиве include в .

Название jsp:cdata изменено на jsp:text, поскольку его семантика очень похожа на элемент text в XSLT.

Изменён способ кодировки информации о версии в синтаксисе XML; используемый URI теперь не зависит от версии, и вместо этого имеется обязательный атрибут версии в jsp:root.

Разъясняется, что JSP-комментарии в JSP-странице в синтаксисе JSP не сохраняются в XML-просмотре страницы.

Разъясняется, что JSP-страницы в синтаксисе XML не должны иметь DOCTYPE.

Разъясняется использование директив include в XML-просмотре страницы JSP.

Разъясняется формат URI, используемых в атрибутах xmlns для директив taglib, и исправлено Приложение JSP.B.



E.2.7 Другие Изменения


Мы разъяснили также несколько других несоответствий и ошибок.

Явно указано, какие атрибуты резервируются () и какие префиксы резервируются ().

Добавлен комментарий к ОТД для TLD, указывающий, что DOCTYPE необходим и каково его значение. Значение не изменилось.

Удалён параграф в конце Раздела JSP.7.3.9, в котором был ненормативный комментарий о будущем "хорошо известных URI".

Исправлено описание верных значений, которые могут передаваться атрибуту flush акции include, в .

Разъясняется, что <jsp:param> может появляться только внутри <jsp:forward>, <jsp:in-clude> и <jsp:params>.

Разъясняется, что <jsp:params> и <jsp:fallback> могут появляться только внутри <jsp:plugin>.

Разрешён конфликт в Разделе JSP.4.4 между Servlet и JSP-спецификацией, касающийся того, как модифицировать шапки/headers во включённых/included акциях.

в PFD1 некорректно описывал верные возвращаемые значения doStartTag() в обработчиках тэгов, которые (обраб.) реализуют интерфейс BodyTag. Корректными значениями являются SKIP_BODY, EVAL_BODY_INCLUDE и EVAL_BODY_BUFFER. В Разделе это теперь указывается.



в почти всех главах для


Change bars/полосы изменений используются в почти всех главах для обозначения изменений между PFD 1b и PFD 2. Исключение - главы 9 и 10, которые автоматически генерируются из Java-источников и не имеют полос изменений. Большинство изменений - семантические, но некоторые из них - редакторские поправки.


E.3 Различия между 1.2 PFD и 1.2 PFD 1b


PFD 1b является наброском, имеющим в основном изменения форматирования и минимум редакционных поправок. Этот проект показан только для того, чтобы легче было коррелировать изменения между последними и более ранними проектами.

Полосы изменений используются для обозначения изменений от PFD 1 к PFD 1b.



E.4.2 Дополнения


Добавлены конструкторы и методы к JspException для поддержки rootCause (параллельно с ServletException).

Добавлен метод PageContext.handleException(Throwable).

Добавлены ссылки к JSR-045 относительно поддержки отладки.

Добавлен новый интерфейс TryCatchFinally для лучшего контроля над исключениями в обработчиках тэгов.

Добавлен неявный URI к карте TLD для упакованных библиотек тэгов. Это также предоставляет поддержку нескольких TLD внутри одного JAR-файла.

Атрибут pageEncoding добавлен к директиве page.

Добавлен материал к Главе JSP.3.

Добавлен класс TagValidatorInfo.

Добавлен с советами по соглашению о расширениях для файлов top и included в JSP.



E.4.3 Разъяснения


Объект обработчика тэга может быть создан простым “new()”; это не должен быть полностью оформленный Bean, полностью поддерживающий поведение метода java.beans.Beans.instantiate().

Удалена “рекомендация”, что элемент <uri> в TLD это URL на что-либо.

Разъяснено, что должна приниматься во внимание информация о зависимости от расширений в упакованных библиотеках тэгов.

Разъяснены вызов и жизненный цикл TagLibraryValidator.

Разъяснено, где TLD могут появляться в упакованном JAR-файле.

Разъяснено, где находятся response.getWriter().



E.4.4 Изменения


Две главы поменялись местами.

Улучшена и и разъяснена Глава JSP.5.

Директива include перемещена обратно в Главу JSP.2.

javax.servlet.jsp.tagext.PageInfo переименован в javax.servlet.jsp.tagext.Page-Data

(для соответствия существующему TagData).

Добавлен параметр инициализации к проверке TagLibraryInformation в TLD путём добавления нового элемента <validator>, переименования <validatorclass> в <validator-class>, для соответствия, и добавления <init-param> как в дескрипторе Servlet web.xml.

Добавлен метод для передачи параметров инициализации классу проверщика/validator и убрано использование TagLibraryInfo. Добавлены String-аргументы prefix и uri в метод validate().

Изменены имена элементов в TLD для соответствия соглашению. Новые имена - <tag-class>, <tei-class>, <tlib-version, <jsp-version>, <short-name>

и <body-content>. <info> был переименован в <description>.



E.4 Различия между 1.2 PD1 и 1.2 PFD


Следующие изменения появились после версии Public Draft 1 в версии

Proposed Final Draft спецификации JSP 1.2.



E.5.1 Организационные Изменения


Главы 8 и 10 теперь автоматически генерируются из javadoc-источников.

Создан новый документ, позволяющий давать более пространные описания использования технологии.

Создана новая глава I18N, включающая Servlet 2.3 и др. (в основном пустые в PD1).

Удалены приложения Implementation Notes и Future, так как они ещё не обновлены.



E.5.2 Новый Документ


Мы создали новый ненормативный документ “Using JSP Technology/Использование Технологии JSP”. Этот документ ещё обновляется до JSP 1.2 и Servlet 2.3. Мы переместили в этот документ следующее:

Некоторый ненормативный материал Обзора.

Все приложения с примерами библиотек тэгов.

Некоторый материал из главы Расширения Тэгов/Tag Extensions.



E.5.3 Дополнения к API


jsp:include может теперь указывать “flush=’false’”.

Сделан XML-просмотр JSP-страницы, доступный для ввода и проверки.

PropertyEditor.setAsText() может теперь использоваться для конвертации из строкового литерального значения атрибута.

Новые классы ValidatorClass и JspPage - для проверки относительно библиотек тэгов.

Новый интерфейс IteratorTag - для поддержки итерации без BodyContent. Добавлены две новые константы (EVAL_BODY_BUFFERED и EVAL_BODY_AGAIN), чтобы легче документировать работу протокола тэга; они были разработаны так, чтобы старые обработчики тэгов продолжали работать без изменений, но использовать старое имя для константы - EVAL_BODY_TAG - теперь не рекомендуется.

Добавлены классы прослушивателей/listener к TLD.

Добавлены элементы к TLD для исключения необходимости писать классы TagExtraInfo в самых обычных ситуациях.

Метод resetCustomAttributes() добавлен к интерфейсу Tag.

Добавлены элементы к TLD для предоставления иконок и описаний для использования в утилитах авторизации.



E.5.5 Изменения


JSP 1.2 базируется на Servlet 2.3, точнее: JSP 1.2 базируется на платформе Java 2.



Следующие изменения появились между JSP


Следующие изменения появились между JSP 1.1 и JSP 1.2 Public Draft 1.


E.6.1 Дополнения


Добавлен механизм расширения переносимого тэга Дескриптором Библиотеки Тэгов/Tag Library Descriptor на базе XML и стэк обработчиков тэгов на этапе прогона. Обработчики тэгов базируются на компонентной модели JavaBeans. Уточнен семантика атрибута uri в директивах taglib.

flush является теперь мандатным атрибутом в jsp:include, и единственным верным значением является “true”.

Добавлены параметры к jsp:include и jsp:forward.

Появилась возможность компиляции JSP-страниц в Servlet-классы, которые могут транспортироваться из одного JSP-контейнера в другой. Добавлено приложение с примером этого.

Добавлен протокол прекомпиляции.

pushBody() и popBody() добавлены к PageContext.

Добавлены классы JspException и JspTagException.

Правильно используются термины JSP-страница, JSP-контейнер и подобные.

Справочник добавлен как .

Глава 1 расширена так, что покрывает из 0.92 "model 1" и "model 2".

Прояснены некоторые детали JSP 1.0.



E.6.2 Изменения


Используется Servlet 2.2 вместо Servlet 2.1 (как разъяснено в ), включая распределяемые/distributable JSP-страницы.

jsp:plugin больше не может быть реализован простой посылкой содержимого jsp:fallback клиенту.

Зарезервированы все параметры запроса, начинающиеся с "jsp".



создана на основе спецификации


Спецификация JSP 1. 1 создана на основе спецификации JSP 1.0. Следующие изменения были внесены между окончательным вариантом спецификации JSP 1.0 и окончательны вариантом спецификации JSP 1.1.


Изменения


В этом приложении перечислены изменения в Спецификации JavaServer Pages.

Это приложение является ненормативным.



JSP.1.1.1 Общие Понятия


Технология JavaServer Pages придаёт смысл текстуальной спецификации создания динамического

response\ответа на request\запрос. Эта технология основывается на следующих понятиях:

Template Data\Шаблонные Данные

Некоторая часть динамического содержимого является фиксированным, или

шаблонным, содержимым. Фрагменты текста или XML являются типичными шаблонными данными. JSP-технология поддерживает естественное манипулирование шаблонными данными.

Добавление Динамических Данных

JSP-технология предоставляет простой, но мощный способ добавлять динамические данные к шаблонным данным.

Инкапсуляция Функциональности

JSP-технология предоставляет два соотнесённых механизма для инкапсуляции функциональности: архитектура компонентов JavaBeans и библиотеки тэгов.

Поддержка Утилитами

Хорошая поддержка утилитами ведёт к значительному повышению производительности. Соответственно, JSP-технология имеет средства для создания качественных утилит авторизации. Тщательная проработка этих концепций привела к созданию гибкой и мощной серверной технологии.



JSP.1.1.2 Преимущества Технологии JavaServer Pages


Технология

JavaServer Pages даёт следующие преимущества:

Свойство Write Once, Run Anywhere™ (Написано Один Раз, Запускается Везде)

JSP-технология является платформонезависимой на динамических web-страницах, web-серверах и в лежащих в её основе серверных компонентах. JSP-страницы могут создаваться на любой платформе, работать на любом web-сервере или сервере приложений, работающим с web, и читаться в любом web-браузере. Серверные компоненты могут быть созданы на любой платформе и работать на любом сервере.

Поддержка качественными утилитами

Независимость от платформы позволяет пользователям JSP выбирать best-of-breed\самые-породистые утилиты. Кроме того, технология JavaServer Pages была разработана для создания условий для разработки высококачественных переносимых утилит.

Разделение Ролей

JSP поддерживает разделение ролей автора и разработчика:

Разработчики пишут компоненты, взаимодействующие с серверными/server-side объектами.

Авторы помещают статические данные и динамическое содержимое в одном месте с целью создания представления, подходящего для данной аудитории.

Каждая группа может делать свою работу, не вникая в работу других. Каждая роль имеет различные возможности, но, хотя эти возможности может реализовывать один человек, лучше этого не допускать. Разделение ролей даёт возможность естественного разделения труда.

Подразделение разработчиков может привлекаться для разработки многократно используемых компонентов, используемых авторами.

Многократно используемые компоненты и библиотеки тэгов

Технология JavaServer Pages включает использование компонентов, таких как JavaBeans™, Enterprise JavaBeans™ и библиотеки тэгов. Эти компоненты могут использоваться в интерактивных утилитах для разработки компонентов и создания страниц, давая в итоге ощутимую экономию времени. Кроме того, они несут в себе мощь межплатформенной гибкости и силы языка Java или других языков скриптинга.

Разделение динамического и статического содержимого

Технология JavaServer Pages даёт возможность разделить статическое содержимое шаблона и динамическое содержимое, вставляемое в этот статический шаблон. Это значительно упрощает создание содержимого. Это разделение поддерживается "бобами"/beans - компонентами, разработанными специально для взаимодействия с серверными объектами, и механизмом расширения тэгов.

Поддержка скриптинга и акций

Технология JavaServer Pages поддерживает элементы скриптинга, а также акции. Акции инкапсулируют функциональность в удобной форме, которая может управляться утилитами. Скрипты предоставляют механизм объединения их функциональности на уровне страницы.

Слой доступа к Web для архитектуры N-поточного коммерческого приложения(-й)

Технология JavaServer Pages является частью Java 2 Platform

Enterprise Edition (J2EE). Платформа J2EE привносит технологию Java в коммерческую среду. Вы можете теперь разрабатывать мощные серверные приложения среднего слоя/middle-tier, включающие web-сайт, использующий технологию JavaServer Pages в качестве базы для работы компонентовEnterprise JavaBeans в среде J2EE.



JSP.1.1 Технология JavaServer Pagesтм


JavaServer Pages™ это технология Java™ 2 Platform, Enterprise Edition (J2EE) для создания приложений, генерирующих динамическое web-содержимое - HTML,

DHTML, XHTML и XML. Технология JavaServer Pages даёт возможность легко создавать динамическое содержимое web-страниц, предельно мощное и гибкое.



JSP.1.2.1 Что такое страница JSP?


JSP-страница это текстовый документ, описывающий процесс обработки запроса для создания ответа. Шаблонные данные смешиваются с динамическими акциями и воздвигаются на платформу Java 2 Platform.

JSP-технология поддерживает различные парадигмы авторизации динамического содержимого.

Ключевыми особенностями JavaServer Pages являются:

Стандартные директивы

Стандартные акции

Элементы скриптинга

Механизм Развёртывания Тэгов/Tag Extension

Шаблонное содержимое



JSP.1.2.2 Web-Приложения


Концепция web-приложения унаследована от спецификации Servlet.

Web-приложение может состоять из следующих частей:

Java Runtime Environment(s)/Среда(-ы) Запуска Программ Java, запущенная на сервере (необходима);

JSP-страница(-ы), обрабатывающая запрос и генерирующая динамическое содержимое;

Сервлет(-ы), обрабатывающий запрос и генерирующий динамическое содержимое;

Серверные компоненты JavaBeans, инкапсулирующие поведение и статус;

Статические страницы HTML, DHTML, XHTML, XML и подобные;

Клиентские/сlient-side Аплеты Java, компоненты JavaBeans и файлы различных Java-классов;

Среда(-ы) Запуска Программ Java, запущенная на клиенте(-ах) (загружаемая через Plugin'ы и технологию Java Web Start).

Спецификация JavaServer Pages унаследовала от спецификации Servlet понятия web-приложений, ServletContexts/КонтекстаСервлета, сессии, запросов и ответов. См. детали в спецификации Java Servlet 2.3.



JSP.1.2.3 Компоненты и Контейнеры


JSP-страницы и классы сервлетов вместе называются web-компонентами. JSP-страницы направляются

Container\Контейнеру, который предоставляет сервис, указанный в JSP Component Contract\Контракте Компонента.

Это отделение компонента от контейнера даёт возможность многократного использования компонентов и возможностей, предоставляемых контейнером.



JSP.1.2.4 Этапы Трансляции и Выполнения


JSP-страницы являются текстуальными компонентами. Они проходят через две фазы: фазу трансляции и фазу запроса. Трансляция выполняется для страницы один раз. Фаза запроса выполняется один раз на один запрос.

JSP-страница транслируется для создания класса сервлета, класса реализации JSP-страницы,

который инстанциируется во время запроса. Инстанциированный объект JSP-страницы

обрабатывает запросы и создаёт ответы.

JSP-страницы могут транслироваться до их использования, предоставляя web-приложение с классом сервлета, которое может служить текстуальным представлением JSP-страницы.

Трансляция может также выполняться JSP-контейнером на этапе публикации или по запросу, когда запросы достигают неоттранслированной JSP-страницы.



JSP.1.2.5 Роль в Платформе Java 2, Enterprise Edition


За некоторыми исключениями, интеграция JSP-страниц на платформу J2EE 1.3 наследуется из спецификации Servlet 2.3, поскольку трансляция превращает JSP-страницы в сервлеты.



JSP.1.2 Базовые Понятия


В этом разделе рассмотрены базовые понятия, формально определённые далее в этой спецификации.



JSP.2.1.1 Web-Контейнеры и Web-Компоненты


JSP-контейнер это экземпляр системного уровня, предоставляющий обслуживание жизненного цикла и поддержку на этапе прогона для JSP-страниц Servlet-компонентов. Запросы, направляемые JSP-странице, направляются JSP-контейнером подходящему объекту реализации JSP-страницы. Термин web-контейнер является синонимом JSP-контейнера.

Web-компонент это сервлет или JSP-страница. Элемент servlet в дескрипторе публикации web.xml используется для описания обоих типов web-компонентов. Компоненты - JSP-страницы - определяются неявно в дескрипторе публикации через использование неявного отображения расширения .jsp