13.1 Internationale programmer 263
13.1.1 Formatering af tidspunkter 263
13.1.2 Formatering af tal og beløb 264
13.1.3 Bruge Locale-objekter 264
13.1.4 De mulige lokalindstillinger 265
13.2 Eksempel: Webside med alle sprog 266
13.3 Tegnsæt og HTML-entiteter 268
13.4 Tekstindhold i resursefiler 268
13.4.1 Hvordan der søges efter resurser 269
13.4.2 Avanceret: Binære resursefiler 270
13.4.3 Avanceret tekstformatering 270
13.5 En international fælleskalender 272
13.5.1 Slutbrugerens oplevelse 272
13.5.2 Fuld separation mellem layout og sprog 273
13.6 Yderligere læsning 276
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[]) { double tal = 1234.5678; NumberFormat fmt1 = NumberFormat.getInstance(); NumberFormat fmt2 = NumberFormat.getCurrencyInstance(); NumberFormat fmt3 = NumberFormat.getPercentInstance(); 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 selv oprette et Locale-objekt, og det 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 paa sproget selv } %> </font></p> <% Locale sprog = request.getLocale(); // netlaeserens 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> <% double tal = 1234.5678; NumberFormat fmt1 = NumberFormat.getInstance(sprog); NumberFormat fmt2 = NumberFormat.getCurrencyInstance(sprog); NumberFormat fmt3 = NumberFormat.getPercentInstance(sprog); 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:
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>
Sammenlign med kalender.jsp i afsnit 9.4.3 (ændringer er markeret med fed).
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.
<h1> 18
<img> 18
A
anmode om en side 19
antialias 41
Apache 26
ASP 25
attributter 18
B
billede 40
billedtekst 41
blande Java og HTML 33
blivende variabler 38
blok 31
blokparenteser 34
Borland JBuilder 21
browser 18, 34
BufferedImage 41
C
catch without try 34
content type 40
CSS 26
D
data om klienten 34
dato 29
E
Eclipse 22
else without if 34
esperanto 15
F
fil 37
Forte 21
funktioner 39
G
generere grafik 40
getAttribute() 41
getContextPath() 34
getGraphics() 41
getHeader() 34
getLocale() 34
getMethod() 34
getProtocol() 34
getRealPath() 37
getRemoteAddr() 34
getRequestURL() 34
getServerName() 34
getServerPort() 34
getServletPath() 34, 37
GIF 40
grafik 40
Graphics2D 41
H
hardisk 37
HTML 18
I
IBM WebSphere Studio 22
IIS 26
IllegalStateException 40
image/jpeg 40
import 32
indholdstypen 40
int 30
J
J2SE 23, 25
Jakarta Tomcat 23
Java 28
Java Server Pages 19
JAVA_HOME 24
javabog.dk 15
JavaScript 26
JBuilder 21
JDeveloper 20
JDK (Java Developers Kit) 23, 25
JPEGImageEncoder 40
JPG 40
JRE (Java Runtime Environment) 25
JSP (Java Server Pages) 19
jspInit() 39
JSTL (JSP Standard Tag Library) 29
K
kommentarer 35
Konqueror 18
L
Linux 15, 18
M
Mandrake Linux 15
mappe 37
metoder 39
MIME-type 40
N
NetBeans 21
netlæser 18, 34
netudgave 15
netudgaven af bogen 15
NoClassDefFoundError 24
O
objekt 31
Open Source 15, 21, 23
OpenOffice.org 15
Oracle 20
out-objektet 29
P
parameter 42
PHP 25
platformsuafhængig 26
PNG 40
println() 28, 29
procedurer 39
producere grafik 40
prøve eksempler 29
R
reference-implementering 23
regneudtryk 30
RenderingHints 41
request 19
request-objektet 34
Resin 25
S
se filer på serveren 37
serverens hardisk 37
serverside-teknologi 19
ServletOutputStream 41
setContentType() 42
side-direktivet 32
slut-kode 18
sprog 34
subrutiner 39
Sun Java Studio Creator 21
synchronized 40
T
tags 18
text/html 40
tidspunkt 29
tildeling 30
Tomcat 23
trappeudjævning 41
try without catch 34
trådsikkerhed 39
typografi 26
U
udtryk 31
udviklingsværktøj 20, 23
undervisningspakke 14
URL 19
user-agent 34
V
variabler 30, 38
<form> 49, 50, 52, 53
<input> 49, 53, 57
<jsp:forward /> 77, 78, 79
<jsp:getProperty /> 168
<jsp:include /> 79
<jsp:param /> 78
<jsp:plugin /> 79
<jsp:setProperty /> 167, 170, 204
<jsp:useBean /> 164, 169, 170
<option> 53
<script> 78, 157, 158
<select> 53, 57
<textarea> 53, 57
A
absolut URL 51
action-attribut 50, 52
addCookie() 62, 81
adgangskontrol 73, 149, 179
afkode billede 44
afkode parameter 49
afkrydsningsfelt 53, 57
afslut behandling af side 203
anmode 65
Apache Axis 229, 230, 232
application-objektet 83
applikationsstyret adgangskontrol 150
ASP 209
associative afbildninger 300
attribut 50, 57
avatar 43
B
balancerede blokparenteser 87
bankkonti 196
batch 107
beløb 264
beskyttede sider 75
beskyttet side 145, 151, 155, 156, 179, 188
biblioteker 89
billede 43, 57
binding af servlet til URL 139
blokparenteser 87
brugeroprettelse 186
bønnestyret persistens (BMP) 250, 252
C
CachedRowSet 92, 110
CallableStatement 107
catch without try 87
certifikat 148
ClassCastException 170
CLASSPATH 89
config-objektet 84
Connection 98
connection pool 108
containerstyret adgangskontrol 150
containerstyret persistens (CMP) 250, 252
content syndication 219
controller (MVC) 194
cookie 62, 67, 72, 80, 157, 158, 179
CORBA 228, 239
CREATE TABLE 93, 99, 102, 105
createStatement() 98, 100
cross-site scripting 157
D
databasedriver 88, 97, 106
DCOM 228
De Gule Sider 229
del og hersk 87
DELETE 93, 99
deploy 241
deployment descriptor 252
dispatcher 205
dokumenttypedefinition 215
DOM (Document Object Model) 213, 215
DOM-træ 213, 214
driftsbeskrivelse 142, 143
DriverManager 98
DROP TABLE 93, 99
DTD (Document Type Definition) 215
dynamiske hjemmesider 47
E
egenskaber 166, 167, 171, 176, 179, 197
EJB Query language 255
EJB-container 241
ejb-jar.xml 242, 252
ekspeditør 205
EL (Expression Language) 118, 119, 300
else without if 87
encodeURL() 72
Enterprise JavaBean (EJB) 239
entitetsbønner (EJB) 246, 250, 254
enumeration 80
epost 184, 186, 239
errorPage 79, 204
escapeXml 120
esperanto 53, 272, 273, 275
esperanto-dansk-ordbog 302
events 209
exception-objektet 85, 204
executeQuery() 99, 100
executeUpdate() 99
Expression Language 118, 300
F
fejlfinding 87
fejlhåndtering 204
fejlmeddelelse 87
FilteredRowSet 111
filtrering af ulovlige tegn 159
findByPrimaryKey() (EJB) 251, 255
fjerninterface (EJB) 240
flette XML-dokument 214
forbindelsespulje 108
FORM-baseret login 154
formatering 263
formular 49
formularfelt 53
forretningslogik 192, 196, 239
forward() 78, 203
framework 209
fremfindingsmetode (EJB) 251, 255
frontkontrol 205
G
Gecko 44
genereret servlet 139
GET-metoden 61, 66
getAttribute() 43, 71, 82, 83
getConnection() 98
getContextPath() 80
getCookies() 63, 80
getInitParameter() 83, 84
getLocale() 80
getMethod() 80
getParameter() 47, 55, 80
getParameterNames() 55, 80
getParameterValues() 55, 80
getProtocol() 80
getRealPath() 43, 44, 83
getRemoteAddr() 80
getRequestDispatcher() 78, 203
getRequestURL() 80
getServerName() 80
getServletPath() 80
getUserPrincipal() 156
Google 229, 231
gæstebog 102, 103, 160
H
HashMap 300
hexadecimal repræsentation 59
hijacking 158
hjemmeinterface (EJB) 240, 251
host name 80
HTML 212
HTML-entitet 119, 159
HTML-formular 49
HTML-injektion 157, 158
HTTP-anmodning 61, 65
HTTP-header 44, 66
HTTP-protokollen 61, 65, 77, 80
HTTPS 148
hændelser 209
I
I18N 263
image/jpeg 42, 66, 81
implicitte objekter 80
indekserede egenskaber 171, 177
indholdssyndikering 219
indholdstypen 66, 81
indkode data i en URL 59
indkode parameter 49, 59
Indsend-knap 50, 57
indsende formular 50
indtastningsfelt 49, 57
initialiseringsparametre 83, 161, 184
injektion 157
inkludering af kodefragment 75
inklusions-direktivet 77, 79
INSERT 99
INSERT INTO 93, 104
installere 142
interaktive hjemmesider 47
internationalisering 263
invalidate() 82
invoker servlet 139
IP-adresse 43, 44, 80
J
J2EE 239
JAASRealm 152
Jakarta Struts 209
JAR-filer 89, 130, 142, 146, 188
Java 2 Enterprise Edition 239
java.sql 97, 99
Javabønner 164, 170, 174, 197
JavaMail 184, 239
JavaScript 78, 157
JDBC 92, 97, 106, 258
JDBCRealm 152, 153, 154
JdbcRowSet 110
JDeveloper 95, 139, 229, 230, 231, 248
JIT (Just In Time) 141
JNDI 242
JNDIRealm 152
JoinRowSet 111
JPEGImageDecoder 44
JSESSIONID 64
JSF (Java Server Faces) 209
JSTL (JSP Standard Tag Library) 117
JTS (Java Transaction Service) 258
K
kalender 175, 275
kassere en session 72
keystore 148
klassebibliotek 89
klient-omdirigering 77
knap 50
kodefelt 53, 57
Konqueror 44, 53
kontrollør (MVC) 193, 194, 196, 202
kryptering 148
kultur 263
køre eksemplerne 47
L
lagdelt applikation 192
libraries 89
Linux 44, 53, 87, 149
livscyklus for JSP-sider 141
Locale 264
logfiler 87
logge en fejl 83, 87
logge ind 74, 150, 152, 154, 179, 185, 199
lokale interfaces (EJB) 245
lokalindstillinger 264
lokalisering 263
M
meddelelses-drevne bønner (EJB) 247
MemoryRealm 152
metodekald over netværk 227
MIME-type 66, 81
model (MVC) 193, 194, 196
model 2-arkitektur 193
Model-View-Controller 192, 193
Mozilla 44
MSIE 44
MVC 193, 196, 239
MySQL 92, 93, 97, 256
N
nedskalere billede 43
NetBeans 139
netlæser 43, 49, 66
Netscape 44, 220
No suitable driver 88
NoClassDefFoundError 88
nulstille formular 57
nyheder 219, 226
nøgle 301
nøglefil 148
O
offentlig nøgle 148
omdirigere 77, 81, 157
Open Source 92
Opera 44
opload af filer 44
opremsning 80
oprette brugere 186
oprette tabel 93
optimering 101, 106
Oracle 95, 98, 253
out-objektet 81
oversæt 274
P
page-objektet 85
pageContext-objektet 85
parameter 47, 49, 50, 55, 59, 80, 119, 157, 167
persistens 111, 246, 250
popup-vindue 157
POST-metoden 61, 66
postserver 184
prepareStatement() 100, 101
println() 81
privat nøgle 148
privilegier 150
programtekst 263
properties 166
præsentation (MVC) 193, 194
præsentationslogik 192
R
radioknapper 53, 57
RDF 220
realm 152
remote interface (EJB) 240
Remote Method Invocation 228
request 65
request-objektet 47, 80
Resin 139
response 65
response-objektet 81
ResultSet 99
resursefil 268, 269
return 203
RMI (Remote Method Invocation) 228
roller 150, 152, 153, 156
RowSet 92, 110, 114
RSS 220, 222, 225, 226
S
SAX 215
scope 119, 164, 169
SELECT 93, 99, 103, 105
semesterplan 14
sende epost 184
sendRedirect() 75, 77, 81
serialisering 219, 227
server-omdirigering 78, 205
serverobjekt 227
servlet 135, 142, 204
servlet-filter 158
session-objektet 71, 82
sessionsbønner (EJB) 245
sessionscookie 63, 64
sessionskapring 157
setAttribute() 71, 82, 83
setContentType() 81
side-direktivet 79, 85, 204
sikkerhed 78, 100, 119, 151, 157, 184, 186
skalere billede 43
skjule parametre 61
skjult felt 57, 60, 283
Slashdot 224
SOAP 228, 234
sprog 66, 80, 263
sprogindstillinger 264
SQL 92, 95
SQL-injektion 100, 157, 184
SQLException 98
SSL (Secure Socket Layer) 148, 154
stakspor 87
statefull session bean (EJB) 246
Statement 98
stored procedures 107
Struts 209
stub 227
submit 50
Sun Microsystems 228
syndikering 219, 224
T
taglib 79, 117, 222, 289
tekstfelt 53
tekstområde 53, 57
text/html 42, 66, 81
tilføje parametre 78
tilstandsfuld sessionsbønne 246
tilstandsløs protokol 61
Tomcat 131, 139, 142
tomcat-users.xml 151
transaktion 258
transformere XML 127, 214
transportgaranti 154
trelagsmodellen 192
try without catch 87
U
UDDI 228, 229
ulovlige tegn 157
UPDATE 93, 99
upload af filer 44
URL 47
URL Rewriting 72
URLEncoder 42, 59
user-agent 44, 65, 66
V
valgliste 53, 57
veksler 244
view (MVC) 194
View Source 28
virkefelt 119, 164, 169
vis kilde 28, 61
W
WAR-fil 142
web browser 18, 19
WEB-INF 137, 138, 142, 206
web.xml 83, 138, 142, 143, 184, 206
webapplikation 15, 24, 89, 142, 143
webarkitektur 209
webhotel 19, 26
WebRowSet 112
webservere 23, 239
webtjenester 228, 235
Windows 44, 97
WSDL 228, 229, 231, 232
X
XML 112, 127, 178, 212, 216, 219, 220, 228
XML Schema 215
XML-format 212
XML-transformering 127, 214
XMLEncoder 178, 219
XPath 214, 216, 220, 223
XPathAPI 218
XSL (XML Style Sheet Language) 214
XSS (cross-site scripting) 157
ønskeseddel 71, 165