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

13 Internationale sider


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.

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[]) {
    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%

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

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 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&aring; <%= 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 '&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.

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.

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.

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

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">

<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

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

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