Till startsida för Björns studiewebb

Java Servlets - diverse

Inledning

Denna sida innehåller exempel som svar på en del frågor jag fått från studenter som läser kurser jag undervisar på, d.v.s. en del "smått och gott". Innehållet på denna sida kommer antagligen struktureras upp vid ett senare tillfälle.

Mitt "problem" är att jag tycker problemlösning är roligt. Och om jag får en fråga jag inte kan svara på så brukar jag (ibland) vilja hitta en lösning själv. Dessa lösningar redovisar jag på denna sida, delvis för att dokumentera för mig själv (till ett senare tillfälle när jag kan få nytta av det).

Observera att jag har placerat servlet-exempel på denna sida i ett paket (eng. package) med namnet "bpn.diverse" då jag börjar få lite många servlets. Om ni ändrar namnet på paket så kom ihåg att även ändra i rader som börjar på "package...".

Innehåll

Inkludera HTML-filer i servlets

En intressant sak är att kunna inkludera HTML-filer (samt resultatet från andra servlets och JSP-sidor) i en servlet. På så sätt kan man slippa så en massa Java-kod som skriver ut HTML-kod i sina servlets. Beskrivningen nedan visar hur man kan inkludera HTML-filerna SIDHUVUD.HTML och SIDFOT.HTML.

Klassen RequestDispatcher

För att kunna inkludera filer måste vi hämta en instans av klassen RequestDispatcher. Detta gör vi genom att anropa metoden getRequestDispatcher() i request-objektet och skicka sökvägen till filen vi vill inkludera. Observera att filen måste (?) ligga inom webbapplikationens mappstruktur, men sökvägen behöver inte vara absolut (utgå från roten på webbapplikationen, d.v.s. börja med "/", som i exempel på denna sida).

String url = "/diverse/include/sidhuvud.html";
RequestDispatcher dispatcher = request.getRequestDispatcher(url);

Det gamla sättet att hämta en instans av RequestDispatcher var att först hämta en referens till en instans av klassen ServletContext och anropa metoden getRequestDispatcher() i det objektet. Detta är inte nödvändigt numera utan vi använder metoden getRequestDispatcher() i vårt request-objekt, precis som i exemplet ovan.

Nästa steg är att att skicka en begäran om den inkluderade filen. Detta gör vi genom att anropa metoden include() i vårt dispatcher-objekt samt skicka objekten request och response som parametrar till metoden.

dispatcher.include(request, response);

Har vi fler HTML-filer som vi vill inkludera så måste vi hämta nya instanser av RequestDispatcher - ett för varje fil som ska inkluderas. Vi kan dock återanvända variabeln om vi vill (som exempel nedan kommer visa).

En instans av klass RequestDispatcher kan även användas för att t.ex. låta andra servlets hantera begäran beroende på om användaren är inloggad eller inte. Istället för att anropa metoden include() kan vi anropa metoden forward() (med samma parametrar). Observera dock att inget får ha skrivits till den resulterande webbsidan innan man skickar vidare exekveringen till en annan servlet!

Vad som kan inkluderas

Inte bara rena HTML-filer kan inkluderas, utan även resultatet från andra servlets och JSP-sidor (se Java Server Pages). (Jag idag, 2001-10-27, inte hittat en lösning för att inkludera ASP-sidor...)

Fullständig kod för HTML-filer

Båda HTML-filer har placerats i en mapp med namnet INCLUDE under mappen DIVERSE i roten på webbapplikationen (d.v.s. <rotmapp>\DIVERSE\INCLUDE\). Därmed refereras de till, i servlet, med sökvägen "/diverse/include/fil.html" 

Filen SIDHUVUD.HTML

<!-- Denna fil inkluderas i servlet IncServlet -->
<HTML>
<HEAD>
  <TITLE>Exempel som visar inkludering fr&aring;n servlets</TITLE>
  <STYLE>
  <!--
    H1 { font-family: Verdana; }
    P   { font: 10pt Verdana; }
  -->
  </STYLE>
</HEAD>
<HTML>
<HR>
<H1>Exempel som visar inkludering fr&aring;n servlets</H1>

Filen SIDFOT.HTML

<!-- Denna fil inkluderas i servlet IncServlet -->
<HR>
<P>Skapad av: Björn Persson, e-post: bjorn.persson@mdh.se.</P>
</BODY>
</HTML>

Fullständig kod för servlet IncServlet

package bpn.diverse;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class IncServlet extends HttpServlet 
{
  public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException
  {
     
//Deklarera URL:er som strängar
    String urlHuvud = "/diverse/include/sidhuvud.html";
    String urlFot = "/diverse/include/sidfot.html";

     
//Meddela webbserver vad som kommer skickas
    response.setContentType("text/html");

      //Skapa en instans av RequestDispatcher för "sidhuvud"
    RequestDispatcher dispatcher = 
      request.getRequestDispatcher(urlHuvud);

     
//Inkl. filen som skickades som parameter till konstruktor ovan
    dispatcher.include(request, response);

     
//Hämta objekt för utskrift och skriv ut ett HTML-stycke
    PrintWriter out = response.getWriter();
    out.println("<P>Hello world from servlet!</P>");

     
//Skapa en ny instans av RequestDispatcher för "sidfot"
    dispatcher = request.getRequestDispatcher(urlFot);
    dispatcher.include(request, response);

  } //doGet()

} //class IncServlet

Skillnad mellan kod i exempel och servlet som körs ovan

I den servlet som kan köras ovan så har jag även inkluderat resultatet av en servlet med namnet bpn.diverse.IncludedServlet och en JSP-sida i filen HELLOWORLD.JSP (som finns i ovannämnda mapp INCLUDED). Koden som inte visas i exemplet ovan, men som finns i servlet som körs, är följande (och har markerats med fet stil):

//... som exempel ovan
out.println("<P>Hello world from servlet!</P>");

String urlServlet = "/servlet/bpn.diverse.IncludedServlet";
String urlJSP = "/diverse/include/HelloWorld.jsp";


  //Skapa en ny instans av RequestDispatcher för inkluderad servlet
dispatcher = request.getRequestDispatcher(urlServlet);
dispatcher.include(request, response);

  //Skapa en ny instans av RequestDispatcher för inkluderad JSP-sida
dispatcher = request.getRequestDispatcher(urlJSP);
dispatcher.include(request, response);


  //Skapa en ny instans av RequestDispatcher för "sidfot"
//... som exempel ovan

Nedan visas koden för servlet bpn.diverse.IncludedServlet och JSP-sidan HELLOWORLD.JSP. (Se sidan Java Server Pages för JSP:s funktion.)

Koden för bpn.diverse.IncludedServlet

package bpn.diverse;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class IncludedServlet extends HttpServlet 
{
  public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException
  {
     
//Vi ska _inte_ meddela webbserver vad som kommer skickas - det
      // görs i servlet som inkluderar denna!!
    //response.setContentType("text/html");

      //Hämta objekt för utskrift och skriv ut HTML-stycken
    PrintWriter out = response.getWriter();
    out.println();
    out.println("<!-- START: Servlet som inkl. i IncServlet -->");
    out.println("<P>Hello world from included servlet!</P>");
    out.println("<!-- SLUT: Servlet som inkl. i IncServlet -->");
  }

}
//class IncServlet

Koden i filen HELLOWORLD.JSP

<%@ page language="Java" %>
<!-- START: JSP-sida som inkluderas i servlet IncServlet -->
<%
  java.util.Calendar idag = new java.util.GregorianCalendar(); 
  int ar = idag.get(idag.YEAR);
  int timme = idag.get(idag.HOUR);
  int minut = idag.get(idag.MINUTE);
  String tid = timme + ":" + minut;
%>
<H1>Hello world</H1>
<P><%="Hello from JSP"%></P>
<P>I år är det <%=ar%></P>
<P>Tiden är <%=tid%></P>

<!-- SLUT: JSP-sida som inkluderas i servlet IncServlet -->


| Till början på sida | Tillbaka till Java |