Monat: Dezember 2012
Thema der Woche: Servlet-Filter
Was Nordkorea kann, können wir auch. Lies zur Einleitung http://www.spiegel.de/netzwelt/web/html-trick-nordkorea-macht-seinen-fuehrer-groesser-a-872291.html, um eine Idee zu bekommen, was wir vorhaben.
Lege in der IDE ein Web-Projekt an. Setze eine index.jsp in das Wurzelverzeichnis mit Text, der den Namen “Kim Jong Un” enthält (alternativ “Angela Merkel”; je nachdem, wer einem sympathischer ist). Teste die Seite.
Lies http://www.oracle.com/technetwork/java/filters-137243.html und verstehe das Konzept der Filter. Der Code ist mit den Eintragungen in die web.xml nicht mehr ganz aktuell, den letzten Teil kann man daher überspringen.
Kopiere http://www.roseindia.net/java/javaee6/webFilterExample.shtml und probiere es aus. Das Beispiel nutzt die Annotationen aus der aktuellen Servlet-Spezifikation.
Ändere den Filter, so dass er den Namen unseres gewählten Staatsoberhaupts größer setzt. Wie das realisiert ist, ist im Prinzip egal, die einfachster Lösung ist Ok (etwa mit <font size=+1>name</font>).
Java-Versionen gehen mit Unicode-Standard Hand in Hand
In den letzten Jahren hat sich der Unicode-Standard erweitert, und Java ist den Erweiterungen gefolgt.
|
Java-Version |
Unicode-Version |
|
1.0 |
1.1.5 |
|
1.1 |
2.0 |
|
1.1.7 |
2.1 |
|
1.2, 1.3 |
2.1 |
|
1.4 |
3.0 |
|
5 |
4.0 |
|
6 |
4.0 |
|
7 |
6.0 |
|
8 |
6.2 |
Java-Versionen und ihr unterstützter Unicode-Standard
Die Java-Versionen von 1.0 bis 1.4 nutzen einen Unicode-Standard, der für jedes Zeichen 16 Bit reserviert. So legt Java jedes Zeichen in 2 Byte ab und ermöglicht die Kodierung von mehr als 65.000 Zeichen aus dem Bereich U+0000 bis U+FFFF. Der Bereich heißt auch BMP (Basic Multilingual Plane). Java 5 unterstützt erstmalig den Unicode 4.0-Standard, der 32 Bit (also 4 Byte) für die Abbildung eines Zeichens nötig macht. Doch mit dem Wechsel auf Unicode 4 wurde nicht die interne Länge für ein Java-Zeichen angehoben, sondern es bleibt dabei, dass ein char 2 Byte groß ist. Das heißt aber auch, dass Zeichen, die größer als 65.536 sind, irgendwie anders kodiert werden müssen. Der Trick ist, ein ein »großes« Unicode-Zeichen aus zwei chars zusammenzusetzen. Dieses Pärchen aus zwei 16-Bit-Zeichen heißt Surrogate-Paar. Sie bilden in der UTF-16-Kodierung ein Unicode 4.0-Zeichen. Diese Surrogate vergrößern den Bereich der Basic Multilingual Plane.
Mit der Einführung von Unicode 4 unter Java 5 gab es an den Klassen für Zeichen- und Zeichenkettenverarbeitung einige Änderungen, sodass etwa eine Methode, die nach einem Zeichen sucht, nun nicht nur mit einem char parametrisiert ist, sondern auch mit int, und der Methode damit auch ein Surrogate-Paar übergeben werden kann. In diesem Buch spielt das aber keine Rolle, da Unicode-Zeichen aus dem höheren Bereichen, etwa für die phönizische Schrift, die im Unicode-Block U+10900 bis U+1091F liegt – also kurz hinter 65536, was durch 2 Byte abbildbar ist –, nur für eine ganz kleine Gruppe von Interessenten wichtig sind.
Die Größe eines primitiven Typs in der Wrapper-Konstanten BYTES
Alle Wrapper-Klassen besitzen ab Java 8 eine int-Konstante BYTES, die mit der Größe des zugehörigen primitiven Datentyps belegt ist.
|
Wrapper-Klasse |
Belegung der Konstanten BYTES |
|
Byte |
1 |
|
Short |
2 |
|
Integer |
4 |
|
Long |
8 |
|
Float |
4 |
|
Double |
8 |
|
Character |
2 |
BYTES-Konstanten in den Wrapper-Klassen
Statische sum(…)/max(…)/min(…) Methoden in numerischen Wrapper-Klassen
In den numerischen Wrapper-Klassen, also Byte, Short, Integer, Long, Float, Double und auch Character – obwohl Character nicht die Basisklasse Number erweitert – gibt es seit Java 8 je drei neue Methoden: sum(…)/max(…)/min(…), die genau das machen, was der Methodenname verspricht.
final class java.lang.Byte|Short|Integer|Long|Float|Double
extends Number
implements Comparable<Integer>
§ static Typ sum(Typ a, Typ b)
Bildet die Summe zweier Werte und liefert diese zurück. Es entspricht einem einfachen a + b. Die Angabe Typ steht dabei für den entsprechenden primitiven Typ byte short, int, long, float oder double, etwa in int sum(int a, int b).
§ static Typ min(Typ a, Typ b)
Liefert das Minimum der zwei Zahlen.
§ static Typ max(Typ a, Typ b)
Liefert das Maximum der zwei Zahlen.
final class java.lang.Character
implements Comparable<Character>, Serializable
§ static Typ sum(Typ a, Typ b)
Liefert (char)(a + b) zurück.
§ static Typ min(Typ a, Typ b)
Liefert das kleinere der beiden Zeichen bezüglich der Unicode-Position.
§ static Typ max(Typ a, Typ b)
Liefert das größere der beiden Zeichen.
Die Methoden sich für sich genommen nicht spannend. Für die Summe (Addition) tut es genauso gut der +-Operator – er steckt sowieso hinter den sum(…)-Methoden – und so wird keiner auf die Idee kommen i = Integer.sum(i, 1) statt i++ zu schreiben. Für das Maximum/Minimum bietet die Math-Klasse auch schon entsprechende Methoden min(a,b)/max(a,b). Der Grund für diese drei Methoden ist vielmehr, dass sie im Zusammenhang mit Lambda-Ausdrücken interessant sind – dazu später mehr.