2010-05-24 24 views
6

¿Qué pasa cuando se repiten los encabezados en un .jsp se incluye en otro .jsp?Java (JSP): repetir el encabezado ContentType en un "sub-jsp"

Por ejemplo, si example.jsp se inicia con este:

<?xml version="1.0" encoding="UTF-8"?> 
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page"> 
<jsp:directive.page contentType="text/html; charset=UTF-8" /> 

<div class="content"> 

<jsp:include page="support.jsp"/> 
... 

(Incluye support.jsp)

Y luego support.jsp como titular también con esto:

<?xml version="1.0" encoding="UTF-8"?> 
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page"> 
<jsp:directive.page contentType="text/html; charset=UTF-8" /> 
... 

¿Eso es un problema? ¿Es mala práctica?

¿Qué ocurre en concreto cuando se repite varias veces un encabezado que solo corresponde a un encabezado en la página .html resultante?

Respuesta

5

De JSP Specification:

JSP.5.4 < jsp: include >

...

Un incluyó página no puede cambiar el código de estado respuesta o cabeceras establecidos. Esto excluye la invocación de métodos como setCookie. Se ignorarán los intentos de invocar estos métodos . La restricción es equivalente a la impuesta en el método de incluir de la clase RequestDispatcher.

Es decir, el intento de establecer el tipo de contenido se ignorará.

0

Es una práctica absolutamente normal.

Lo que llamas '' cabeceras son sólo directrices a jsp-compilador.

+0

+1 pero lo que yo llamo "encabezado" también se denomina "encabezado" en la especificación JSP oficial citado por axtavt;) – SyntaxT3rr0r

2

La directiva se traduce directamente a ServletResponse.setContentType llamada

Las documentaciones para este método dice:

Establece el tipo de contenido de la respuesta que se envía al cliente, si la respuesta no ha sido comprometido todavía El tipo de contenido dado puede incluir una especificación de codificación carácter, para ejemplo, el texto/html; charset = UTF-8. codificación de caracteres de la respuesta sólo conjunto del tipo de contenido determinado si se llama a este método antes de getWriter se llama.

Este método se puede llamar repetidamente para cambiar el tipo de contenido y la codificación del carácter . Este método no tiene efecto si se llama al después de que se haya confirmado la respuesta .No establece la codificación de caracteres de la respuesta si se llama a después de llamar a getWriter o después de que se haya confirmado la respuesta .

Los contenedores deben comunicar el tipo contenido y la codificación de caracteres utilizado para el escritor de la respuesta servlet al cliente si el protocolo proporciona una forma para hacerlo. En el caso de HTTP, se usa el encabezado Content-Type .

Me parece que es mejor utilizar esta directiva solo una vez en la página JSP de nivel superior, quizás incluso en el servlet del controlador, pero definitivamente no en las páginas incluidas.

Para páginas no escritas en JSPX, una directiva que ES útil y debe establecerse en todas las páginas JSP que tienen caracteres no ASCII es <%@ page pageEncoding="XXXX" %>. Lo recomiendo encarecidamente si no desea imprimir códigos \ uXXXX en todas sus páginas.

+0

Sin embargo, el OP utiliza JSPX (JSP XML, JSP en sintaxis XML, "documento JSP") La declaración XML ya incluye la codificación de página. – BalusC

+0

@BalusC: Gracias por señalar esto. Idioma actualizado del último párrafo. Creo que la confusión y proliferación originales de la directiva 'contentType' se deriva de no entender cómo funcionan estas dos directivas totalmente separadas. Básicamente, si su página JSP no tiene ASCII, se requiere establecer 'pageEncoding', pero debe dejar' contentType' a alguien que esté más arriba en la cadena. Al menos esa era mi propia confusión. –

+0

Te di +1 pero ... Realmente no resolviste la pregunta: el JLS que axtavt citó especifica que * "Una página incluida no puede cambiar el código de estado de la respuesta o establecer encabezados. Los intentos de invocar estos métodos serán ignorado "*. Así que AFAICT estoy haciendo un include y por lo tanto las llamadas posteriores van a ser ignoradas. Esto no es lo mismo que lo que citó, que se refiere específicamente al método * setContentType * (aparentemente cuando * no * se llama desde dentro de un ".jsp" incluido). – SyntaxT3rr0r

Cuestiones relacionadas