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...".
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.
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!
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...)
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"
<!-- Denna fil inkluderas i servlet IncServlet -->
<HTML>
<HEAD>
<TITLE>Exempel som visar inkludering från servlets</TITLE>
<STYLE>
<!--
H1 { font-family: Verdana; }
P { font: 10pt Verdana; }
-->
</STYLE>
</HEAD>
<HTML>
<HR>
<H1>Exempel som visar inkludering från servlets</H1>
<!-- Denna fil inkluderas i servlet IncServlet -->
<HR>
<P>Skapad av: Björn Persson, e-post: bjorn.persson@mdh.se.</P>
</BODY>
</HTML>
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
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.)
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
<%@ 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 |