13.1 Internationale programmer 254
13.1.1 Formatering af tidspunkter 254
13.1.2 Formatering af tal og beløb 255
13.1.3 Bruge Locale-objekter 255
13.1.4 De mulige lokalindstillinger 256
13.2 Eksempel: Webside med alle sprog 257
13.3 Tegnsæt og HTML-entiteter 259
13.4 Tekstindhold i resursefiler 259
13.4.1 Hvordan der søges efter resurser 260
13.4.2 Avanceret: Binære resursefiler 261
13.4.3 Avanceret tekstformatering 261
13.5 En international fælleskalender 263
13.5.1 Slutbrugerens oplevelse 263
13.5.2 Fuld separation mellem layout og sprog 264
13.6 Yderligere læsning 267
Dette kapitel forudsætter kapitel 9, Javabønner i JSP-sider.
Når et program skal anvendes af flere kulturer og sprog, opstår behov for, at programtekster, beløb og dato angives i de pågældende landes sprog og man må i gang med at internationalisere og lokalisere programmet.
Internationalisering (eng.: Internationalization, også kaldet I18N) består i, at gøre programmet sprogneutralt, ved at sørge for, at al formatering og fortolkning af tal-, beløbs-, dato- og tidsangivelser, sker afhængigt af sproget og at al sproglig tekst er flyttet til separate filer. Det er typisk programmørens, der står for denne opgave.
Lokalisering (eng.: Localization, også kaldet L10N) består i, at oversætte filerne fra hovedsproget til de andre sprog, applikationen skal fungere på. Denne opgave varetages typisk af en professionel oversætter.
DateFormat formaterer Date-objekter til strenge (og den anden vej).
import java.text.*; import java.util.*; public class BenytDateFormat { public static void main(String arg[]) { DateFormat klformat, datoformat, dkf; klformat = DateFormat.getTimeInstance(DateFormat.MEDIUM); datoformat = DateFormat.getDateInstance(DateFormat.FULL); dkf = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.SHORT); Date tid = new Date(); System.out.println( tid ); System.out.println( "Kl :"+ klformat.format(tid) ); System.out.println( "Dato :"+ datoformat.format(tid) ); System.out.println( "Tid :"+ dkf.format(tid) ); } }
Wed Feb 05 14:23:46 GMT+00:00 2003 Kl :14:23:46 Dato :5. februar 2003 Tid :05-02-2003 14:23
Læg for det første mærke til, at toString() på Date ikke er lokaliseret. Den bør kun bruges til test-udskrifter og logning og ikke i tekst, som brugeren skal læse.
Ovenstående program er kørt med danske sprogindstillinger. Med amerikanske sprogindstillinger bliver uddata i stedet:
Mon Dec 03 13:27:57 GMT+01:00 2001
Kl: 1:27:57 PM
Dato: Monday, December 3, 2001
Tid: Dec 3, 2001 1:27 PM
Det ses, at det afhænger en del af sproget, præcist hvordan tider bliver formateret (f.eks. er ugedag med i den amerikanske tekst, men ikke i den danske).
Ønsker man som programmør fuld kontrol over, hvordan teksten bliver formateret, må man selv specificere formatet med SimpleDateFormat:
import java.text.*; import java.util.*; public class BenytSimpleDateFormat { public static void main(String arg[]) { DateFormat df = new SimpleDateFormat("EEEE 'den' d. MMMM 'år' yyyy."); Date tid = new Date(); System.out.println( df.format(tid) ); } }
mandag den 3. december år 2001.
Dermed bliver selve formaterings-strengen sprogspecifik (og den bør lægges ud i en resursefil - se senere). Køres den med amerikanske sprogindstillinger, bliver uddata:
Monday den 3. December år 2001.
På samme måde som med tidsangivelser formateres/fortolkes tal ved at bede om et formateringsobjekt, der klarer netop denne form for tal:
import java.text.*; public class BenytNumberFormat { public static void main(String arg[]) { NumberFormat fmt1 = NumberFormat.getInstance(); NumberFormat fmt2 = NumberFormat.getCurrencyInstance(); NumberFormat fmt3 = NumberFormat.getPercentInstance(); double tal = 1234.5678; System.out.println( fmt1.format(tal) ); System.out.println( fmt2.format(tal) ); System.out.println( fmt3.format(tal) ); } }
1.234,568 kr 1.234,57 123.457%
Med amerikanske sprogindstillinger bliver uddata:
1,234.568 $1,234.57 123,457%
Land og sprog (lokalindstillingerne) repræsenteres ved et Locale-objekt. Dette objekt bruges til al formatering, til at finde resursebundter frem og lignende.
Ønsker man kontrol over hvilket sprog, der anvendes, kan man oprette et Locale-objekt, og dette objekt kan så bruges til at fremskaffe formateringsobjekter til det pågældende sprog:
import java.text.*; import java.util.*; public class BenytDateFormat2 { public static void main(String arg[]) { DateFormat klformat, datoformat; Locale fransk = new Locale("fr","FR"); klformat = DateFormat.getTimeInstance(DateFormat.SHORT,fransk); datoformat = DateFormat.getDateInstance(DateFormat.LONG, fransk); Date tid = new Date(); System.out.println( "Kl: "+ klformat.format(tid) ); System.out.println( "Dato: "+ datoformat.format(tid) ); } }
Kl: 14:23
Dato: 5 février 2003
Man kan undersøge hvilke Locale-objekter, der er tilgængelige, ved at kalde klassemetoden Locale.getAvailableLocales(). Her er et lille program, der skriver dem ud:
import java.util.*; public class MuligeSprog { public static void main(String arg[]) { Locale[] lokalindstillinger = Locale.getAvailableLocales(); for (int i=0; i<lokalindstillinger.length; i++) { Locale lokalindst = lokalindstillinger[i]; System.out.print(lokalindst+" "); // udkommentér hvis du vil se hvad sproget hedder på sproget selv //System.out.println(lokalindst.getDisplayName(lokalindst)); } System.out.println( ); } }
ar ar_AE ar_BH ar_DZ ar_EG ar_IQ ar_JO ar_KW ar_LB ar_LY ar_MA ar_OM ar_QA ar_SA ar_SD ar_SY ar_TN ar_YE hi_IN iw iw_IL ja ja_JP ko ko_KR th th_TH th_TH_TH zh zh_CN zh_HK zh_TW be be_BY bg bg_BG ca ca_ES cs cs_CZ da da_DK de de_AT de_CH de_DE de_LU el el_GR en_AU en_CA en_GB en_IE en_IN en_NZ en_ZA es es_AR es_BO es_CL es_CO es_CR es_DO es_EC es_ES es_GT es_HN es_MX es_NI es_PA es_PE es_PR es_PY es_SV es_UY es_VE et et_EE fi fi_FI fr fr_BE fr_CA fr_CH fr_FR fr_LU hr hr_HR hu hu_HU is is_IS it it_CH it_IT lt lt_LT lv lv_LV mk mk_MK nl nl_BE nl_NL no no_NO no_NO_NY pl pl_PL pt pt_BR pt_PT ro ro_RO ru ru_RU sh sh_YU sk sk_SK sl sl_SI sq sq_AL sr sr_YU sv sv_SE tr tr_TR uk uk_UA en en_US eo
Locale-objektet består af tre dele:
Første del er sprogkoden, f.eks. da, sv, no, en, fr.
En valgfri anden del er landekoden, f.eks. DK, NO, GB, DE, FR
En valgfri tredje del er varianten inden for sprogområdet (f.eks. om valutaen er i euro).
Eksempler:
fr: Fransk
fr_BE:
Fransk i Belgien
fr_CA: Fransk i Canada
no_NO: Norsk i Norge
(bokmål)
no_NO_NY: Nynorsk i Norge (variant NY er nynorsk)
Her er et eksempel, der sammenfatter det ovenstående og hvor man kan vælge mellem alle de mulige sprog og se hvordan forskellige ting skrives på dette sprog:
sprogtest.jsp
<%@ page import="java.util.*,java.text.*" contentType="text/html;charset=UTF-8" %> <html> <head><title>Sprogtest</title></head> <body> <p> Din netlæsers foretrukne sprog er <%=request.getLocale().getDisplayName()%> <br>Samtlige acceptable sprog er: <% Enumeration e = request.getLocales(); while (e.hasMoreElements()) { Locale l = (Locale) e.nextElement(); out.print(l + ":"+l.getDisplayName()+"\n" ); } %> </p> <p>Vælg sprog<br> <font size="-1">Disse er tilgængelige: <% Locale[] lokalindstillinger = Locale.getAvailableLocales(); for (int i=0; i<lokalindstillinger.length; i++) { Locale lokalindst = lokalindstillinger[i]; out.print(" <a href='sprogtest.jsp?sprog="+lokalindst+"'>" +lokalindst+"</a>:" // sprogkode, f.eks.: da_DK +lokalindst.getDisplayName(lokalindst));// fuldt navn på sproget selv } %> </font></p> <% Locale sprog = request.getLocale(); // netlæserens foretrukne sprog String vsprog = request.getParameter("sprog"); // har bruger valgt et andet? if (vsprog != null) { String[] s = vsprog.split("_"); // split f.eks. da_DK op if (s.length==1) sprog = new Locale(vsprog); // sprog (da) else if (s.length==2) sprog = new Locale(s[0],s[1]);// sprog, land (da_DK) else sprog = new Locale(s[0],s[1],s[2]); // sprog, land, variant } %> <h1>Ting på <%= sprog.getDisplayName(sprog) %></h1> <pre> <% NumberFormat fmt1 = NumberFormat.getInstance(sprog); NumberFormat fmt2 = NumberFormat.getCurrencyInstance(sprog); NumberFormat fmt3 = NumberFormat.getPercentInstance(sprog); double tal = 1234.5678; out.println( "Tal : " + fmt1.format(tal) ); out.println( "Valuta : " + fmt2.format(tal) ); out.println( "Procent : " + fmt3.format(tal) ); Date tid = new Date(); out.println( "tid.toString() : "+ tid ); SimpleDateFormat brugerdefineretFormat = new SimpleDateFormat("EEEE 'den' d. MMMM 'år' yyyy.", sprog); out.println( "SimpleDateFormat: " + brugerdefineretFormat.format(tid) ); DateFormat klformat, datoformat, dkf; klformat = DateFormat.getTimeInstance(DateFormat.MEDIUM, sprog); datoformat = DateFormat.getDateInstance(DateFormat.FULL, sprog); dkf = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, sprog); ResourceBundle res = ResourceBundle.getBundle("sprogtest.Tekster", sprog); out.println( res.getString("Kl_")+ klformat.format(tid) ); out.println( res.getString("Dato_")+ datoformat.format(tid) ); out.println( res.getString("Tid_")+ dkf.format(tid) ); %></pre> </body> </html>

Vælger man nu catalansk i Spanien (ca_ES) får man:

Vælger man engelsk i Canada (en_CA) får man:

Læg mærke til, at de nederste tre tekster (Kl, Dato og Tid) bliver vist på engelsk (Time of day, Date og Time). Det skyldes, at disse tekster er blevet lagt ud i en separat fil (en resursefil), der er blevet oversat til engelsk (se senere).
Læg mærke til linjen
<%@ page contentType="text/html;charset=UTF-8" %>
øverst i eksemplet.
Sidedirektivet her specificerer at HTML-siden kommer i indkodningen UTF-8, d.v.s. Unicode. Unicode er nødvendigt, for at kunne repræsentere tegn uden for intervallet 0-256, men er ikke kompatibelt ved vestlig indkodning (ISO-8859-1) uden for ASCII-området (de amerikanske tegn A-Z), så æ, ø og å og andre specielle tegn går tabt.
Når man skriver sine websider, må man derfor enten sørge for at siderne er er indkodet i Unicode-formatet eller benytte HTML-entiteter, såsom æ (for æ), ø (for ø) og å (for å) i HTML-koden i stedet.
Det har vi gjort i eksemplet, f.eks har vi skrevet:
Din netlæser
i stedet for:
Din netlæser
Programmet BenytDateFormat er halvt internationaliseret, da tidsformateringen korrekt skifter afhængigt af sproget. Der mangler kun strengene "Kl: ", "Dato: " og "Tid: ".
Lad os nu fuldføre internationaliseringen ved at lægge tekstindholdet (strengene) ud i et resursebundt (eng.: resource bundle) med navnet Tekster.
Disse kan tilgås fra programmet således:
package sprogtest; import java.text.*; import java.util.*; public class BenytDateFormatMedResurser { public static void main(String arg[]) { ResourceBundle res = ResourceBundle.getBundle("sprogtest.Tekster"); DateFormat klformat, datoformat, dkf; klformat = DateFormat.getTimeInstance(DateFormat.MEDIUM); datoformat = DateFormat.getDateInstance(DateFormat.FULL); dkf = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.SHORT); Date tid = new Date(); System.out.println( res.getString("Kl_")+ klformat.format(tid) ); System.out.println( res.getString("Dato_")+ datoformat.format(tid) ); System.out.println( res.getString("Tid_")+ dkf.format(tid) ); } }
Kl : 14:23:50 Dato: 5. februar 2003 Tid : 05-02-2003 14:23
Resursebundtet, der skal ligge i filen sprogtest.Tekster.properties, indeholder teksten i nøgle-værdi-par.
Disse vil blive brugt, hvis der ikke findes resursefiler for det pågældende sprog:
Tid_=Tid \: Kl_=Kl \: Dato_=Dato \:
Køres programmet (på et styresystem indstillet til dansk), fås samme udskrift som før.
Lad os nu lokalisere programmet til engelsk.
Det består i, at vi opretter sprogtest.Tekster_en.properties med de engelske tekster:
Tid_=Time \: Kl_=Time of day\: Dato_=Date \:
Starter vi derefter programmet med engelske sprogindstillinger, får vi uddata:
Time of day : 3:07:28 PM Date : Monday, December 3, 2001 Time : Dec 3, 2001 3:07 PM
Når programmet skal finde en programtekst ud fra sprogindstillingerne, sker det ved først at kigge i den mest specifikke resursefil. Hvis programteksten ikke findes der, kigges i en mere generel resursefil og til sidst i den mest generelle.
For eksempel vil resurser til sproget fr_CA (canadisk fransk) blive søgt
først i Tekster_fr_CA.properties
dernæst i Tekster_fr.properties
og sidst i Tekster.properties
Her ses kalenderen på dansk og tysk:

Her er vist redigering på sproget esperanto:

Eksemplet gør brug af resursebundter til samtlige programtekster og opnår derved, at JSP-siden kun beskæftiger sig med layout og visningslogik.
Oversættelseskoden (opslag i resursebundter) er lagt i en separat fil, nemlig i en Sprogdata-bønne, sådan at JSP-siden kan holdes overskuelig og sådan, at den er så lidt forstyrret af opslag i resursebundter som muligt (hver gang en tekstbid skal ind i JSP-siden kalder den metoden ovs() på bønnen med nøglen).
Her er kalendertekster.properties, med originalsproget (dansk):
# Filnavn: kalendertekster.properties Fælleskalender_for=Fælleskalender for kalenderen=kalenderen kalender=kalender måned=måned forrige=forrige næste=næste redigér=redigér vis=vis Tryk_input_type_submit_value_OK_når_du_vil_gemme_ændringer=Tryk <input type='submit' value='OK'> når du vil gemme ændringer _input_type_submit_value_OK_=<input type='submit' value='OK'>
Her er kalendertekster_de.properties (tysk):
# Filnavn: kalendertekster_de.properties Fælleskalender_for=Der Gruppenkalender für kalenderen=der Kalender kalender=Kalender måned=monat forrige=vorheriger næste=nächste redigér=redigieren vis=zeigen Tryk_input_type_submit_value_OK_når_du_vil_gemme_ændringer=Drücken <input type='submit' value='OK'> um die Änderungen zu speichern _input_type_submit_value_OK_=<input type='submit' value='OK'>
Her er kalendertekster_eo.properties (esperanto):
# Filnavn: kalendertekster_eo.properties Fælleskalender_for=Komuna kalendaro por kalenderen=la kalendaro kalender=kalendaro måned=monato forrige=antaua næste=posta redigér=redaktu vis=montru Tryk_input_type_submit_value_OK_når_du_vil_gemme_ændringer=Premu <input type='submit' value='Bone'> por konservi shanghojn _input_type_submit_value_OK_=<input type='submit' value='Bone'>
Her er javabønnen Sprogdata, der holder styr på sprog og resursebundter:
Sprogdata.java
package kalender; import java.util.*; import java.text.*; public class Sprogdata { private Locale sprog = Locale.getDefault(); private ResourceBundle tekster; private Bruger bruger; public void setLocale(Locale sproget) { sprog = sproget; tekster = ResourceBundle.getBundle("kalendertekster",sprog); bruger.setLocale(sprog); } public void setBruger(Bruger brugerobjekt) { bruger = brugerobjekt; bruger.setLocale(sprog); } public void setSprog(String sproget) { String[] s = sproget.split("_"); if (s.length==1) setLocale(new Locale(sproget)); else if (s.length==2) setLocale(new Locale(s[0],s[1])); else setLocale(new Locale(s[0],s[1],s[2])); } /** Oversæt en tekst (slå op i det relevante resursebundt) */ public String ovs(String nøgle) { try { return tekster.getString(nøgle); } catch (MissingResourceException e) { System.err.println("Advarsel: Manglende resurse i kalendertekster:\n" + nøgle.replaceAll("[\\p{Punct}\\s]+","_") // erstat andre tegn med _ + "=" + nøgle.replaceAll("[\r\n]","\\\n") ); return nøgle; } } }
Her er JSP-siden med kalenderen. Sammenlign med kalender.jsp i afsnit 9.4.3 (ændringer er markeret med fed):
kalender.jsp
<%-- Knyt bønnen Bruger til brugerens session under navnet b --%> <jsp:useBean id="b" class="kalender.Bruger" scope="session" /> <%-- <title>kalender</title> --%> <%-- Overfør parametre til b, der svarer til egenskaber --%> <jsp:setProperty name="b" property="*" /> <%-- Knyt bønnen Sprogdata til brugerens session under navnet s --%> <jsp:useBean id="s" class="kalender.Sprogdata" scope="session"> <% // Første gang: Knyt til Bruger-objekt og registrér sproget s.setBruger( b ); s.setLocale( request.getLocale() ); %> </jsp:useBean> <%-- Overfør evt. sprog-parameter til s --%> <jsp:setProperty name="s" property="sprog" /> <html> <%-- s.ovs() oversætter teksten til det pågældende sprog --%> <head><title><%= s.ovs("kalender") %></title></head> <body> [<a href='kalender.jsp?sprog=da'>dansk</a> - <a href='kalender.jsp?sprog=de'>Deutsch</a> - <a href='kalender.jsp?sprog=eo'>Esperanto</a>] <h1><%= s.ovs("Fælleskalender_for") %> <%= b.getDatostr() %></h1> <a href="kalender.jsp?maaned=<%= b.getMaaned()-1 %>"><%= s.ovs("forrige") %></a> <%= s.ovs("måned") %> - <a href="kalender.jsp?maaned=<%= b.getMaaned()+1 %>"><%= s.ovs("næste") %></a> <%= s.ovs("måned") %> - <% if (b.isRediger()) { // redigering - vis en input-formular %> <a href="kalender.jsp?rediger=false"><%= s.ovs("vis") %></a> <%= s.ovs("kalenderen") %>.<br> <br> <form action="kalender.jsp" method="post"> <%=s.ovs("Tryk_input_type_submit_value_OK_når_du_vil_gemme_ændringer") %>.<br> <% b.udskrivDagsprogram(out); %> <br><br> <%= s.ovs("_input_type_submit_value_OK_") %> </form> <% } else { // fremvisning %> <a href="kalender.jsp?rediger=true"><%= s.ovs("redigér") %></a> <%= s.ovs("kalenderen") %>.<br> <% b.udskrivDagsprogram(out); %> <% } %> </body> </html>
Om internationalisering af JSP-sider:
http://java.sun.com/webservices/docs/1.3/tutorial/doc/WebI18N.html
Generelt om Java og internationalisering:
http://java.sun.com/docs/books/tutorial/i18n/
Liste over alle sprog- og landekoder kan du se i afsnit 13.1.4 og afsnit 13.2.
<form> 48, 49, 51, 52
<h1> 18
<img> 18
<input> 48, 52, 56
<jsp:forward /> 73, 74, 75
<jsp:getProperty /> 162
<jsp:include /> 75
<jsp:param /> 74
<jsp:plugin /> 75
<jsp:setProperty /> 161, 164, 195
<jsp:useBean /> 158, 163, 164
<option> 52
<script> 74, 151, 152
<select> 52, 56
<textarea> 52, 56
A
absolut URL 50
action-attribut 49, 51
addCookie() 62, 77
adgangskontrol 144
afkode billede 44
afkode parameter 48
afkrydsningsfelt 52, 56
afslut behandling af side 195
antialias 41
Apache 26
Apache Axis 220, 222, 223
Apache Tomcat 23
application-objektet 79
applikationsstyret adgangskontrol 144
ASP 25, 201
attribut 49, 56
attributter 18
avatar 43
B
balancerede blokparenteser 83
batch 103
beløb 255
billede 43, 56
billedtekst 41
binding af servlet til URL 133
blande Java og HTML 33
blok 31
blokparenteser 34, 83
Borland JBuilder 22
browser 18, 34
BufferedImage 41
bønnestyret persistens (BMP) 242, 243
C
CachedRowSet 105
CallableStatement 103
catch without try 34, 83
certifikat 142
ClassCastException 164
config-objektet 80
Connection 94
containerstyret adgangskontrol 144
containerstyret persistens (CMP) 241, 243
content type 40
cookie 61, 66, 69, 76, 151, 152, 173
CORBA 219, 230
CREATE TABLE 89, 95, 98, 101
createStatement() 94, 96
cross-site scripting 152
CSS 26
D
databasedriver 93, 102
dato 29
DCOM 219
De Gule Sider 220
del og hersk 83
DELETE 89, 95
dokumenttypedefinition 207
DOM (Document Object Model) 205, 207
DOM-træ 205, 206
driftsbeskrivelse 136, 137
DriverManager 94
DROP TABLE 89, 95
DTD (Document Type Definition) 207
dynamiske hjemmesider 46
E
Eclipse 22
egenskaber 160, 161, 164, 170, 173, 190
EJB Query language 246
EJB-container 232
ejb-jar.xml 233, 244
EL 113, 114
else without if 34, 83
encodeURL() 69
entitetsbønner (EJB) 237, 241, 246
epost 176, 230
errorPage 75, 196
esperanto 15, 52, 263, 264, 266
exception-objektet 81, 196
executeQuery() 95, 96
executeUpdate() 95
Expression Language 113
F
fejlfinding 83
fejlhåndtering 196
fejlmeddelelse 84
fil 37
FilteredRowSet 106
filtrering af ulovlige tegn 153
findByPrimaryKey() (EJB) 243, 246
fjerninterface (EJB) 231
flette XML-dokument 206
forbindelsespulje 104
FORM-baseret login 148
formatering 254
formular 48
formularfelt 52
forretningslogik 184, 188, 230
Forte 21
forward() 74, 195
fremfindingsmetode (EJB) 242, 246
frontkontrol 197
G
Gecko 44
generere grafik 40
GET-metoden 60, 65
getAttribute() 41, 43, 68, 78, 79
getConnection() 94
getContextPath() 34, 76
getCookies() 62, 76
getGraphics() 41
getHeader() 34
getInitParameter() 79, 80
getLocale() 34, 76
getMethod() 34, 76
getParameter() 46, 54, 76
getParameterNames() 54, 76
getParameterValues() 54, 76
getProtocol() 34, 76
getRealPath() 37, 43, 44, 79
getRemoteAddr() 34, 76
getRequestDispatcher() 74, 195
getRequestURL() 34, 76
getServerName() 34, 76
getServerPort() 34
getServletPath() 34, 37, 76
getUserPrincipal() 150
GIF 40
Google 220, 222
grafik 40
Graphics2D 41
H
hjemmeinterface (EJB) 231, 242
home interface (EJB) 231
HTML 18, 204
HTML-entitet 114, 153
HTML-formular 48
HTML-injektion 151, 152
HTTP-anmodning 64
HTTP-anmodning 60
HTTP-header 44, 65
HTTP-protokollen 60, 64, 73, 76
HTTPS 142
I
I18N 254
IBM WebSphere Studio 22
IIS 26
IllegalStateException 40
image/jpeg 40, 42, 65, 77
implicitte objekter 76
import 32
indekserede egenskaber 171
indekseret egenskab 165
indholdssyndikering 210
indholdstypen 40, 77
indkode parameter 48, 58
Indsend-knap 49, 56
indtastningsfelt 48, 56
initialiseringsparametre 79, 154, 176
injektion 151
inkludering af kodefragment 72
inklusions-direktivet 73, 75
INSERT 95
INSERT INTO 89, 100
installere 136
int 30
interaktive hjemmesider 46
internationalisering 254
invalidate() 78
invoker servlet 133
IP-adresse 43, 44, 76
J
J2EE 230
J2SE 23
Jakarta Tomcat 23
JAR-fil 85
Java 28
Java 2 Enterprise Edition 230
Java Server Pages 19
JAVA_HOME 24
java.sql 93, 95
javabog.dk 15
Javabønner 158, 164, 168, 190
JavaMail 176, 230
JavaScript 26, 74, 151
JBuilder 22
JDBC 88, 93, 102, 249
JDBCRealm 146, 147, 148
JdbcRowSet 105
JDeveloper 20, 92, 133, 220, 221, 223, 239
JDK 23
JDK (Java Developers Kit) 25
JDO 88
JIT (Just In Time) 135
JNDI 233
JNDIRealm 146
JoinRowSet 106
JPEGImageDecoder 44
JPEGImageEncoder 40
JPG 40
JRE (Java Runtime Environment) 25
JSESSIONID 63
JSF (Java Server Faces) 201
JSP (Java Server Pages) 19
JSP Standard Tag Library 29
jspInit() 39
JSTL 29, 112
JTS (Java Transaction Service) 249
JAASRealm 146
K
kassere en session 69
keystore 142
klassebibliotek 85
klient-omdirigering 73
knap 49
kodefelt 52, 56
kommentarer 35
Konqueror 18, 44, 52
kontrollør (MVC) 185, 186, 188, 194
kryptering 142
kultur 254
køre eksemplerne 46
L
lagdelt applikation 184
Linux 15, 18, 44, 52, 83, 143
livscyklus for JSP-sider 135
Locale 255
logge en fejl 79, 83
logge ind 71, 144, 146, 148, 173, 177, 191
lokale interfaces (EJB) 236
lokalindstillinger 255
lokalisering 254
M
Mandrake Linux 15
mappe 37
MemoryRealm 146
metodekald over netværk 218
metoder 39
MIME-type 65, 77
MIME-typen 40, 65
model (MVC) 185, 186, 188
model 2-arkitektur 185
Model-View-Controller 184, 185
Mozilla 44
MSIE 44
MVC 185, 188, 230
MySQL 88, 90, 93, 248
N
nedskalere billede 43
NetBeans 21, 133
netlæser 18, 34, 43, 48, 65
Netscape 44, 211
netudgave 15
netudgaven af bogen 15
No suitable driver 85
NoClassDefFoundError 25, 85
nulstille formular 56
nyheder 210, 217
nøglefil 142
O
objekt 31
offentlig nøgle 142
omdirigere 73, 77, 151
Open Source 15, 23
OpenOffice.org 15
Opera 44
opload af filer 44
oprette tabel 89
optimering 97, 102
Oracle 20, 92, 94, 244
out-objektet 29, 77
P
page-objektet 81
pageContext-objektet 81
parameter 42, 46, 48, 49, 54, 58, 76, 114, 151, 161
persistens 106, 237, 241
PHP 25
platformsuafhængig 25
PNG 40
popup-vindue 151
POST-metoden 60, 66
postserver 176
prepareStatement() 96, 97
println() 28, 29, 77
privat nøgle 142
privilegier 144
producere grafik 40
programtekst 254
properties 160
præsentation (MVC) 185, 186
præsentationslogik 184
prøve eksempler 29
R
radioknapper 52, 56
RDF 211
realm 146
reference-implementering 23
regneudtryk 30
remote interface (EJB) 231
Remote Method Invocation 219
RenderingHints 41
request-objektet 34, 46, 76
Resin 25, 133
response-objektet 77
ResultSet 95
resursefil 259, 260
return 195
RMI (Remote Method Invocation) 219
roller 144, 146, 147, 150
RowSet 105, 109
RSS 211, 213, 216, 217
S
SAX 207
scope 114, 158, 163
SELECT 89, 95, 99, 101
semesterplan 14
sende epost 176
sendRedirect() 72, 73, 77
serialisere 218
serialisering 210
server-omdirigering 74, 197
serverobjekt 218
serverside-teknologi 19
servlet 130, 195
servlet-filter 152
ServletOutputStream 41
servletter 136
session-objektet 68, 78
sessionsbønner (EJB) 236
sessionscookie 62, 63
sessionskapring 152
setAttribute() 68, 78, 79
setContentType() 42, 77
side-direktivet 32, 75, 81, 196
sikkerhed 74, 96, 114, 145, 151, 176, 179
skalere billede 43
skjule parametre 60
skjult felt 56, 59
Slashdot 215
slut-kode 18
SOAP 219, 225
sprog 34, 65, 76, 254
sprogindstillinger 255
SQL 89, 91
SQL-injektion 96, 151, 176
SQLException 94
SSL 148
SSL (Secure Socket Layer) 142
stakspor 84
Statement 94
stored procedures 103
stub 218
Sun Java Studio Creator 21
Sun ONE Studio 21
synchronized 40
syndikering 210, 215
T
taglib 75, 112, 213
tags 18
tekstfelt 52
tekstområde 52, 56
text/html 40, 42, 65, 77
tidspunkt 29
tildeling 30
Tomcat 23
tomcat-users.xml 146
transaktion 249
transformere XML 206
transportgaranti 148
trappeudjævning 41
trelagsmodellen 184
try without catch 34, 83
trådsikkerhed 39
typografi 26
U
UDDI 219, 220
udtryk 31
udviklingsværktøj 20, 23
ulovlige tegn 151
undervisningspakke 14
UPDATE 89, 95
upload af filer 44
URL 19, 46
URL Rewriting 69
URLEncoder 42, 58
user-agent 34, 44, 64, 65
V
valgliste 52, 56
variabler 30, 38
View Source 28
virkefelt 114, 158, 163
vis kilde 28, 60
W
WAR-fil 136, 137
web browser 18
WEB-INF 131, 132, 136, 198
web.xml 79, 132, 136, 137, 176, 198
webapplikation 15, 24, 85, 136, 137
webhotel 19, 26
WebRowSet 107
webservere 23, 230
webtjenester 219, 226
Windows 44, 93
WSDL 219, 220, 222, 223
X
XML 107, 172, 204, 208, 210, 211, 219
XML Schema 207
XML-format 204
XMLEncoder 172, 210
XPath 206, 208, 211, 214
XPathAPI 209
XSL (XML Style Sheet Language) 206
XSL-transformation 206
XSS (cross-site scripting) 152