Dynamically include files in JSP

This is a good example to dynamically include a header file in JavaServer Pages (JSP):

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>JSP Page</title>
  </head>
  <body>        
  <c:set var="userAgent" scope="page" value="${header['User-Agent']}"/>
  <c:choose>
    <c:when test="${fn:contains(userAgent,'iPhone')}">
      <%@include file="header_iphone.jsp" %>
    </c:when>
    <c:when test="${fn:contains(userAgent,'iPad')}">
      <%@include file="header_ipad.jsp" %>
    </c:when>
    <c:when test="${fn:contains(userAgent,'Android')}">
      <%@include file="header_android.jsp" %>
    </c:when>
    <c:otherwise>
      <%@include file="header_other.jsp" %>
    </c:otherwise>
  </c:choose>
</body>
</html>

Cannot modify header information – headers already sent by

Mit der Funktion header kann man in PHP den HTTP-Header eines Dokuments ändern. Das ist besonders sinnvoll, wenn man dem Browser Bilder ausliefern möchte und daher vermeiden will, dass der Browser das Bild als HTML-Seite interpretiert.

Beim Umgang mit header muss man darauf achten, dass vor dem Einsatz dieser Funktion keine HTML-Tags oder andere formatierte Ausgaben stattfinden. Außerdem dürfen sich vor (und nach!) der PHP-Einbindung keine Leerzeichen befinden.

Ein einfaches header-Beispiel ist:

<?php header("Content-type: image/jpeg") ?>

Selbst bei diesem Einzeiler kann es aber vorkommen, dass eine Warnung mit dem Text „Cannot modify header information – headers already sent by“ ausgegeben wird. In diesem Fall ist die PHP-Datei in UTF-8-Codierung abgepeichert und enthält ein „Byte Order Mark“ (kurz: BOM). Das BOM-Steuerzeichen wird von PHP falsch erkannt, weshalb man für diese Datei „UTF-8 ohne BOM“ als Kodierung wählen muss.

Wie das geht, zeigt dieser Screenshot von Notepad++: