JSP 1.2 Errata - March 21st, 2002 (rev a)


Please send feedback to mark.roth@sun.com .

The following is a list of clarifications and corrections to the JSP 1.2 final specification (dated August 27th, 2001).

This errata has been created according to the Maintenance step of the JCP process . Issues were prompted by questions from vendors, implementors and end-users; the resolutions have been discussed in a mailing list which includes all the experts in the JSP 1.3 expert group. The discussion was done under the facilitation of Mark Roth, co-lead of the JSP 1.3 specification, acting as "Maintenance Lead" for the JSP 1.2 specification. This errata includes all issues discussed up until March 21, 2002.

This errata will be posted for a 30 day public review before being declared final.

All issues will be incorporated into the JSP 1.3 specification, which, at the time of this writing, is currently being developed under JSR-152 of the JCP. It is still undecided, if there will be additional erratas or if later clarifications will be just appear in the JSP 1.3 specification.

The errata starts with a brief list of all issues. Each issue is then described in more detail and a resolution is given. All references are to the JSP 1.2 final specification.

All Issues

1. i18n: Dynamic Page Character Encoding Clarification

Detailed Issues

Issue 1

i18n: Dynamic Page Character Encoding Clarification

Given the current JSP 1.2 specification, it is not possible to define an i18n action that sets the response's charset (corresponding to one of the client's preferred locales) in a predictable manner using Response.setLocale(). For example, the JSP Standard Tag Library (JSTL) requires this capability for its i18n tags.

According to the Servlet 2.3 specification, the charset attribute for the response's Content-Type header may be set using either setLocale() or setContentType(), both of which must be called before getWriter() for the charset to affect the construction of the writer.

Unfortunately, the JSP 1.2 specification does not define what happens if the JSP contains a page directive with a contentType attribute (causing setContentType() to be called), and one or more calls to setLocale(). In this case, there is no guarantee that the charset is set the same way in two containers. Two possible interpretations are:

Resolution

JSP.2.10.1. Page Character Encoding

[This section replaces the contentType row of Table JSP.2-1 on page 52 of the JSP 1.2 specification (items changed/added in bold)].

contentType Defines the character encoding for the JSP page and for the response of the JSP page and the MIME type for the response of the JSP page.
Values are either of the form "TYPE" or "TYPE;charset=CHARSET" with an optional white space after the ";". CHARSET, if present, must be the IANA value for a character encoding. TYPE is a MIME type, see the IANA registry for useful values.
The default value for TYPE is "text/html" for JSP Pages in standard syntax, or "text/xml" for JSP Documents in XML syntax. If CHARSET is not specified, but the page encoding for the JSP page is specified, CHARSET defaults to the specified page encoding. Otherwise, if neither CHARSET nor the page encoding for the JSP page is specified, the default value for CHARSET is ISO-8859-1 for JSP Pages in standard syntax, or UTF-8 for JSP Pages in XML syntax.
See Chapter 3 for complete details on character encodings.

JSP.3.1. Page Character Encoding

[This section supplements section JSP.3.1 in the JSP 1.2 specification]

The following table (JSP.3-1) clarifies the relationship between the declared page encoding and content type and the input JSP page character encoding.

Table JSP.3-1 Effects of declared page encoding and content type on JSP source encoding and output content type.
pageEncoding Page Directive Attribute
(<encoding>)
contentType Page Directive Attribute
(<contentType>)
Input JSP Source Encoding Output Content Type
specified specified <encoding> <contentType>
specified not specified <encoding> "<defaultType>;charset=<encoding>"
not specified specified <contentType charset> <contentType>
not specified not specified <defaultInputEncoding> "<defaultType>;charset=<defaultEncoding>"
Where:

JSP.3.2. Static Content Type

[The following text replaces the third paragraph of section JSP.3.2 in the JSP 1.2 specification (additions/changes in bold)]

For JSP Pages in standard syntax, the default value for TYPE is "text/html" and the default value for the character encoding is ISO-8859-1. For JSP Documents in XML syntax, the default value for TYPE is "text/xml" and the default value for the character encoding is UTF-8. Table JSP.3-1 clarifies the relationship between the declared page encoding and content type and the output content type used.

JSP.3.3. Dynamic Content Type

[This section replaces section JSP.3.3 in the JSP 1.2 specification]

Some JSP pages are designed so they can deliver content using different content types (and character sets) depending on request time input. These pages may be organized as custom actions or scriptlets that determine the response content type and provide glue into other code actually generating the content of the response.

The initial content type for the response (including the character set) is determined as shown in the "Output Content Type" column in Table JSP.3-1. In all cases, the container must call response.setContentType() with the initial content type before processing the page.

The content type (and character set) can then be changed dynamically by calling setContentType() or setLocale() on the response object. The most recent call takes precedence. Changing the content type can be done up until the point where the response is committed. Data is sent to the response stream on buffer flushes for buffered pages, or on encountering the first content (beware of whitespace) on unbuffered pages. Whitespace is notoriously tricky for JSP Pages in JSP syntax, but much more manageable for JSP Documents in XML syntax.

JSP.B.1 DTD for JSP Documents

[This section replaces the ATTLIST declaration for the jsp:directive.page element found in section JSP.B.1 in the JSP 1.2 specification (additions/changes in bold)]

    <!-- 
      The contentType default is not relevant for XML views of
      JSP pages since it differs depending on the originating
      syntax (text/html;ISO-8859-1 for JSP Pages in standard syntax, or
      text/xml;UTF-8 for JSP Documents in XML syntax.
    -->
    <!ATTLIST jsp:directive.page
      language		CDATA		"java"
      extends		%ClassName;	#IMPLIED
      contentType 	%Content;  	text/xml; UTF-8
      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.B.2 XSchema Description of JSP Documents

[This section replaces the directive.page element declaration in section JSP.B.2 in the JSP 1.2 specification (additions/changes in bold)]

    <xsd:element name = "directive.page">
      <xsd:annotation> 
	<xsd:documentation> 
	  directive.page is the "page directive". 
	  The contentType default is not relevant for XML views of
	  JSP pages since it differs depending on the originating
	  syntax (text/html;ISO-8859-1 for JSP Pages in standard syntax, or
	  text/xml;UTF-8 for JSP Documents in XML syntax.
	</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/xml; UTF-8" 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>