javabog.dk  |  << forrige  |  indhold  |  næste >>  |  programeksempler  |  om bogen

13 Internationale sider


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.

13.1 Internationale programmer

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.

13.1.1 Formatering af tidspunkter

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.

13.1.2 Formatering af tal og beløb

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%

13.1.3 Bruge Locale-objekter

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

13.1.4 De mulige lokalindstillinger

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:

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)

13.2 Eksempel: Webside med alle sprog

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&aelig;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&aelig;lg sprog<br>
<font size="-1">Disse er tilg&aelig;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&aring; <%= 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 '&aring;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).

13.3 Tegnsæt og HTML-entiteter

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 &aelig; (for æ), &oslash; (for ø) og &aring; (for å) i HTML-koden i stedet.

Det har vi gjort i eksemplet, f.eks har vi skrevet:

Din netl&aelig;ser

i stedet for:

Din netlæser

13.4 Tekstindhold i resursefiler

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

13.4.1 Hvordan der søges efter resurser

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

  1. først i Tekster_fr_CA.properties

  2. dernæst i Tekster_fr.properties

  3. og sidst i Tekster.properties

13.4.2 Avanceret: Binære resursefiler

Dette afsnit er ikke omfattet af Åben Dokumentslicens.
Du skal købe bogen for at måtte læse dette afsnit.
Jeg erklærer, at jeg allerede har købt bogen
Jeg lover at anskaffe den i nær fremtid.

13.4.3 Avanceret tekstformatering

Dette afsnit er ikke omfattet af Åben Dokumentslicens.
Du skal købe bogen for at måtte læse dette afsnit.
Jeg erklærer, at jeg allerede har købt bogen
Jeg lover at anskaffe den i nær fremtid.

13.5 En international fælleskalender

Dette afsnit er ikke omfattet af Åben Dokumentslicens.
Du skal købe bogen for at måtte læse dette afsnit.
Jeg erklærer, at jeg allerede har købt bogen
Jeg lover at anskaffe den i nær fremtid.

13.5.1 Slutbrugerens oplevelse

Her ses kalenderen på dansk og tysk:

Her er vist redigering på sproget esperanto:

13.5.2 Fuld separation mellem layout og sprog

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).

13.6 Yderligere læsning

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.

Stikordsregister

STYLE="background: transparent">

<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

javabog.dk  |  << forrige  |  indhold  |  næste >>  |  programeksempler  |  om bogen
http://javabog.dk/ - Webprogrammering med Java Server Pages af Jacob Nordfalk.
Licens og kopiering under Åben Dokumentlicens (ÅDL) hvor intet andet er nævnt (72% af værket).

Ønsker du at se de sidste 28% af dette værk (275315 tegn) skal du købe bogen. Så får du pæne figurer og layout, stikordsregister og en trykt bog med i købet.