JDK 14 Tutorial G Travis Download
JDK 14 Tutorial G Travis Download
https://ebookbell.com/product/jdk-14-tutorial-g-travis-4114252
https://ebookbell.com/product/jdk-14-tutorial-1-no-book-cover-gregory-
travis-5470696
Logging In Java With The Jdk 14 Logging Api And Apache Log4j Samudra
Gupta Auth
https://ebookbell.com/product/logging-in-java-with-the-jdk-14-logging-
api-and-apache-log4j-samudra-gupta-auth-11854038
Logging In Java With The Jdk 14 Logging Api And Apache Log4j 1st
Edition Samudra Gupta
https://ebookbell.com/product/logging-in-java-with-the-jdk-14-logging-
api-and-apache-log4j-1st-edition-samudra-gupta-922752
https://ebookbell.com/product/professional-java-jdk-6-edition-w-clay-
richardson-donald-avondolio-5473692
Professional Java Jdk 6 Edition 6th Ed W Clay Richardson Donald
Avondolio
https://ebookbell.com/product/professional-java-jdk-6-edition-6th-ed-
w-clay-richardson-donald-avondolio-4106356
https://ebookbell.com/product/professional-java-programming-jdk-5-5th-
edition-w-clay-richardson-981632
Ivor Hortons Beginning Java 2 Jdk 5 Edition 1st Edition Ivor Horton
https://ebookbell.com/product/ivor-hortons-beginning-
java-2-jdk-5-edition-1st-edition-ivor-horton-2391088
https://ebookbell.com/product/mastering-java-11-develop-modular-and-
secure-java-applications-using-concurrency-and-advanced-jdk-
libraries-2nd-edition-lavieri-55588330
jdk.book Page i Monday, March 11, 2002 3:38 PM
MANNING
Greenwich
(74° w. long.)
jdk.book Page iv Monday, March 11, 2002 3:38 PM
For electronic information and ordering of this and other Manning books,
go to www.manning.com. The publisher offers discounts on this book
when ordered in quantity. For more information, please contact:
Special Sales Department
Manning Publications Co.
209 Bruce Park Avenue Fax: (203) 661-9018
Greenwich, CT 06830 email: orders@manning.com
©2002 by Manning Publications Co. All rights reserved.
Many of the designations used by manufacturers and sellers to distinguish their products
are claimed as trademarks. Where those designations appear in the book, and Manning
Publications was aware of a trademark claim, the designations have been printed in initial
caps or all caps.
Recognizing the importance of preserving what has been written, it is Manning’s policy to have
the books they publish printed on acid-free paper, and we exert our best efforts to that end.
ISBN 1-930110-66-9
To Susan
jdk.book Page vi Monday, March 11, 2002 3:38 PM
jdk.book Page vii Monday, March 11, 2002 3:38 PM
contents
preface xv
acknowledgments xvii
about this book xix
author online xxvii
about the cover illustration xxix
1.4 Summary 36
vii
jdk.book Page viii Monday, March 11, 2002 3:38 PM
viii CONTENTS
Example: checksumming 41
2.2 Nonblocking I/O 42
The multithreaded approach 43 The really bad single-
■
particular address 67
2.5 Summary 73
3 Java2D
3.1
75
The Print Service API 76
Print Service packages 76 Document flavors 77 Printer
■ ■
3.2 Reading and writing images with the Image I/O API 88
The plug-in model 89 Simple reading 89 Simple
■ ■
CONTENTS ix
TransferableImage.java 135
4.6 Summary 136
5 Logging
5.1
137
Logging overview 138
Log message format 139 Logging levels 139 Logger
■ ■
x CONTENTS
6 Assertion facility
6.1
171
Assertion basics 172
Why use assertions? 172 Assertions vs. other error code 173
■
7 Exceptions
7.1
205
Chained exceptions 206
7.2 StackTraceElements 208
What is a stack trace? 208 Using StackTraceElements 210
■
CONTENTS xi
8 Collections 229
8.1 Utilities 230
Rotating list elements 230 Replacing list elements 232
■
9 Regular Expressions
9.1
257
Overview of regular expressions 258
Literals 259 The . wildcard 259 Quantifiers: * and + 259
■ ■
xii CONTENTS
CONTENTS xiii
index 371
jdk.book Page xiv Monday, March 11, 2002 3:38 PM
jdk.book Page xv Monday, March 11, 2002 3:38 PM
preface
In the summer of 1995, I moved to New York City to work at a web start-up.
On my first day of work, I saw Netscape for the first time; by the end of the day,
I had written my first applet, a trivial graphics program I called Thingy.
Thingy just drew a bunch of lines from
the cursor to the edge of the screen. You
moved the cursor, and the vortex moved
along with it. Interactive! I announced the
creation of Thingy at the company meeting,
and, to my surprise, everyone cheered. I had
no idea what the big deal was. I had never
used the web before that day, and I didn’t
know why it was exciting, or why it was bor-
ing enough that a program like this could
enliven it. Apparently, being able to run a
program inside a browser was a big deal. A
very big deal.
For a while, that was what Java was all about—putting moving images inside
pages in a fairly static medium. Java competed against other enlivening technolo-
gies, trading moderate complexity for generality, and becoming a very hot
resume item in the process.
However, our start-up had realized at an early point that Java wasn’t just for
the client side. Java was also an excellent server-side language—an application
xv
jdk.book Page xvi Monday, March 11, 2002 3:38 PM
xvi PREFACE
language. For all its flaws, Java seemed to be exceedingly well designed. It felt a
lot like C++, but less. I had come close to being a C++ evangelist at my previous
job, but even I had to admit that I got a headache every time I tried to write C++
code. Java, on the other hand, almost never gave me a headache. On the con-
trary—it was eerily fun.
We heard that the designers (James Gosling and his team) had used a simple
design rule: if you don’t know how to do something really nicely, leave it out. What
an excellent rule! Play to your strengths. Why do lots of things badly when you
can do a few things nicely? Quality isn’t just including good stuff; it’s also know-
ing when to cut the bad stuff.
Java benefited from the fact that it ran in a place where no programs had run
before—inside the browser window. The novelty of this made up for the fact that
it was slow and used a lot of memory. It didn’t allow for the time and space opti-
mizations that C and C++ allowed. But that was okay—it was a different class of
language. It occupied a special niche, one that had been sought by other truly
high-level languages with commercial pretensions, such as SmallTalk and Eiffel.
And so Java thrived. Easy to use, portable (except maybe the GUI stuff), good
for beginners and experts alike. It became a very famous language. Relatives of
mine who had never touched a computer asked me if I knew Java and were
pleased when I said that I did. Eat your heart out, SmallTalk! Take that, Eiffel!
Once Java was firmly ensconced in the canon of programming languages, its
designers increasingly turned their attention to speed. It had gained popularity
because of its simplicity, and that simplicity had brought a certain amount of
sluggishness; now it was time to make up for that.
The last few versions of the JDK have focused on making Java more complete,
faster, and—let’s not be shy—less simple. The simple stuff is still there, but more
sophisticated elements are falling into place. They might be harder to use, but it’s
worth it if they improve performance. Java always had a nice learning curve, and
the curve has retained its gentle slope. You can start with the basics and move on
to the more complex stuff when your projects demand it.
JDK 1.4 is another step on this path. It includes a variety of new features,
some of which have been available in prototype form, but all of which are now
firmly part of the Java platform. These features are not yet available in most
browsers, but if you use Java for true application development, you’ll want to
learn how to use them right away.
jdk.book Page xvii Monday, March 11, 2002 3:38 PM
acknowledgments
This is my first book. Not surprisingly, it was a lot harder than I thought it would
be, even though I had thought I was prepared for it to be harder than I thought
it would be. However, I was fortunate to be surrounded by the extreme compe-
tence of the folks at Manning Publications. Many thanks to Marjan Bace, the
publisher, for approving the book and helping to define its goals; similarly, hearty
thanks to my first contact at Manning, Dan Barthel, for his help both during and
after his formal association with Manning.
Particular thanks to Alex Garrett, who with endless patience shepherded the
book, and its accompanying code, through a brutally accelerated development
and revision process. Thanks also to Lianna Wlasiuk, who served excellently as
interim editor early in the project.
Thanks, in fact, to everyone at Manning who answered my questions, pointed
out my typos, corrected my spelling, marshaled my reviewers, refined my think-
ing, or, in fact, actually edited, re-edited, copyedited, revised, read, reread,
proofread, typeset, designed, marketed, produced, or otherwise created my
book: Syd Brown, Susan Capparelle, Andy Carroll, Lee Fitzpatrick, Leslie
Haimes, Chris Hillman, Ted Kennedy, Elizabeth Martin, Mary Piergies, Sherry
Roberts, Tony Roberts, and Helen Trimes. Double thanks for doing everything
on a very tight schedule. If I’ve left out anyone, either through accident or omis-
sion, please accept my apologies.
Heartfelt thanks to those who read and reviewed the book independently,
serving both as expert witnesses and test subjects: Brian Doyle, Al Giacomucci,
xvii
jdk.book Page xviii Monday, March 11, 2002 3:38 PM
xviii ACKNOWLEDGMENTS
Ian Griffiths, Jasen Halmes, David M. Karr, Stephen Kelvin, Carl Muckenhoupt,
Andrew Silis, Jon Skeet, and Itai Zukerman. I would particularly like to thank
Ian Griffiths, who went over the book with a fine-toothed comb, lending an
expert’s brain and a proofreader’s eye.
Outside the world of book publishing, I would like to thank Kieron Murphy
for commissioning many technical articles from me, effectively jump-starting my
writing career. Thanks to Jim Blandy, Bob Geitz, Chris Gernon, Steve Hawley,
Chris Koch, Tom McHugh, and Rich Salter for teaching me computer science.
Thanks to Mark Cline, wherever you are, for teaching me to program in the first
place.
Thanks and apologies to friends and family who found me scarce during this
project.
Finally, endless thanks to Susan E. Beal, Esq., for her love and patience (and
even a bit of proofreading) throughout the writing of this book, and more
thanks to Hume Beal for his purring and enthusiasm.
jdk.book Page xix Monday, March 11, 2002 3:38 PM
xix
jdk.book Page xx Monday, March 11, 2002 3:38 PM
At the time this book was being prepared, it did not seem possible to acquire
a driver that supported enough JDBC 3.0 features to make testing possible.
Rather than write from a position of ignorance, and include possibly spurious
code listings, I decided not to include a chapter on this important topic.
Sadly, the Generics (parameterized types) feature was, in the end, not
included with JDK 1.4 as originally promised. This controversial addition to the
language looks like it will be included in JDK 1.5 for sure, and you can download
an early-access version of it from Sun. However, since it requires a change to the
compiler, it can’t really be said to be a part of JDK 1.4 and so is not discussed in
this book.
order, and dependencies between the chapters have been minimized. Cross-
references have been provided where necessary.
Particular emphasis has been placed on the creation of quality code examples.
The sample programs in this book are intended to be useful, self-contained, and
reusable; they are designed to fully exercise and illustrate a new feature, set of
features, or API. Some of them might seem a bit overlong, but I felt that it
would be better for the programs to be complete and useful than to be concise.
You don’t have to read every line of every program—only the parts that strike
your fancy. Use the annotations to find your way around the code, and remem-
ber, you won’t have to type the programs in—you can download them. (More
about that shortly.)
A chapter-by-chapter outline of the contents of the book follows.
Chapter 3—Java2D
Two new Java2D-related features are described in this book: the Print Service
API and a new Image I /O Framework.
The Print Service API gives your application full access to the set of printers
available on a computer, as well as the full range of printing options available on
each printer. It is intended to supersede the java.awt.print package. Docu-
ment classes allow you to create printable objects in a variety of formats and
submit those documents to printers that support these formats. Listeners allow
your application to track the progress of the print job so you can report back to
the user.
The Image I /O Framework takes Java another step away from the Web-
centeredness it started with. It used to be difficult to load and save images; with
the new API, this is easy. Images can be saved and loaded in a variety of formats,
and there’s no need to mess with annoying MediaTracker objects.
This chapter includes an example implementation of a print dialog box, and
a program for generating professional-looking graphs for displaying web server
statistics.
This chapter comes complete with a simple drawing program that makes
comprehensive use of the JAWS system, including accessing the local disk, print-
ing, controlling the browser, and accessing the system clipboard. The Java Net-
work Launching Protocol & API (JNLP), which is the technology underlying
JAWS, is also discussed.
Chapter 5—Logging
The Logging API provides a mechanism for programs to report about their
behavior. More importantly, it provides a way to turn logging messages on and
off after an application has been deployed in the field, greatly aiding in applica-
tion maintenance.
Logging is hardly a new feature—in fact, many logging systems have been
created for Java. However, the JDK 1.4 release standardizes this API in order to
provide a consistent and reliable mechanism. Widespread use of the Logging API
will mean that it will become much easier for applications to be maintained and
debugged after they have been deployed.
The example programs in this chapter demonstrate the ability to customize the
logging system. A custom handler redirects logging messages to a logging win-
dow (complete with a central control window), and a custom formatter provides
an alternative logging format that takes up less space than the default format.
Chapter 7—Exceptions
While we’re on the subject of errors, there are a couple of nice surprises in JDK
1.4 in the area of Exceptions.
jdk.book Page xxiv Monday, March 11, 2002 3:38 PM
Chapter 8—Collections
The Collections Framework has a number of useful new features. Besides some
list-manipulation utilities in the Collections class, we find implementations of
Map and Set that remember the order of their elements, unlike regular Maps and
Sets. Additionally, the new IdentityHashMap class presents a way to circum-
vent an object’s idea of equality, which can be very useful when, for example, tra-
versing a graph of objects.
The ordered Map and Set classes are demonstrated by a program that
searches for files in a file path, and IdentityHashMap is illustrated in a program
that traverses an object graph.
Typographic conventions
Code is displayed in courier font. Annotations are placed off to the side and
are sometimes continued below the code.
b Here’s some more information about the printing of “Hello.” Printing “Hello.”
might seem trivial, but it’s very important to do this.
By code we mean any textual material that is (or could be) the actual input to, or
output from, a computer program. This also includes names of classes and inter-
faces such as FilterOutputStream and Preferences , methods such as Sys-
tem.out.println() and hello() , variables such as i and nextValue, and, in
general, any short piece of text that is created by machine production or meant
for machine consumption.
Italics are used to emphasize a new term the first time it is used, and also for
emphasis. Callouts are used for particular emphasis:
author online
When you purchase JDK 1.4 Tutorial, you also get free access to a private web
forum run by Manning Publications where you can make comments about the
book, ask technical questions, and receive help from the author and from other
readers.
To access the forum and subscribe to it, point your web browser to http://
www.manning.com/travis/. This page provides information on how to get on the
forum once you are registered, what kind of help is available, and the rules of
conduct on the forum.
Manning’s commitment to readers is to provide a venue where a meaningful
dialog between individual readers and between readers and the author can take
place. It is not a commitment to any specific amount of participation on the part
of the author, whose contribution to the Author Online forum remains volun-
tary (and unpaid). We suggest you try asking the author some challenging ques-
tions, lest his interest stray!
The Author Online forum and the archives of previous discussions will be
accessible from the publisher’s web site as long as the book is in print.
xxvii
jdk.book Page xxviii Monday, March 11, 2002 3:38 PM
jdk.book Page xxix Monday, March 11, 2002 3:38 PM
xxix
jdk.book Page xxx Monday, March 11, 2002 3:38 PM
■
The New I/O system
Doing I/O with channels and buffers
1
Basic NIO
(New Input/Output)
■ File locking
1
jdk.book Page 2 Monday, March 11, 2002 3:38 PM
2 CHAPTER 1
Basic NIO
The New I/O (NIO) API introduced in JDK 1.4 provides a completely new model of
low-level I/O. Unlike the original I/O libraries in the java.io package, which were
strongly stream-oriented, the New I/O API in the java.nio package is block-
oriented. This means that I/O operations, wherever possible, are performed on large
blocks of data in a single step, rather than on one byte or character at a time.
The New I/O API libraries are elegant and well designed, but their very nature
represents a trade-off: some simplicity has been sacrificed for potentially enormous
gains in speed. One of the major sources of speed improvement is the introduction
of direct buffers. Where possible, data in these buffers is not copied to and from
intermediate Java buffers; instead, system-level operations are performed on them
directly. Although the implementation necessarily differs from platform to platform,
these direct buffers can potentially permit Java programs to have I/O performance
at or near that of programs written in C or C++.
The New I/O API also offers a platform-independent form of nonblocking I/O.
This simplifies multithreaded I/O programming and can enable programs to effi-
ciently handle a large number of connections to data sources and sinks.
The New I/O API model coexists peacefully with the original I/O libraries from
the java.io package. In fact, to a substantial degree, the original I/O libraries have
been rewritten to take advantage of the New I/O API.
Application programmers will not be forced to rewrite any of their code—exist-
ing applications written against the original APIs will continue to work as before.
However, you might consider using some of the new features of the New I/O API to
speed up any performance bottlenecks you find in your programs. Mixing old- and
new-style I/O code is not trivial, but it is possible to do cleanly and effectively.
This book divides its NIO coverage into two chapters—chapter 1, “Basic NIO,”
and chapter 2, “Advanced NIO.” Chapter 1 covers channels and buffers, as well as
file locking. These should give you a good understanding of the basic classes used
throughout the NIO system. Chapter 2 introduces you to the more advanced fea-
tures, such as multiplexed I/O; these make use of the ideas presented in this chapter.
The chunks of data that are written to and read from channels are contained in
objects called buffers. A buffer is an array of data enclosed in an abstraction that
makes reading from, and writing to, channels easy and convenient. Buffers are often
large, reflecting the fact that the I/O paradigm used in the New I/O API is oriented
toward transferring large amounts of data quickly.
Most of the input and output streams in the original I/O libraries have been re-
implemented to use channels as their underlying mechanism. This means that when
you do old-style I/O programming using these stream classes, you’re using channels
without realizing it. Since programming with streams is conceptually simpler than
programming with channels, you can continue to use streams if you find that your
program is fast enough. However, channels provide the opportunity for great speed
improvements, and some applications are actually easier to write using channels.
In this section, we’ll learn how channels and buffers work, and how they differ
from streams.
If you examine the documentation for the original java.io.* classes, you’ll see that
a number of the classes have been augmented with a getChannel() method:
■ java.io.FileInputStream
■ java.io.FileOutputStream
■ java.io.RandomAccessFile
■ java.net.Socket
■ java.net.ServerSocket
■ java.net.DatagramSocket
■ java.net.MulticastSocket
■ java.net.SocketInputStream (private)
■ java.net.SocketOutputStream (private)
You’ll notice that InputStream and OutputStream do not have getChannel() meth-
ods. This is because streams in general do not have to be implemented in terms of
an underlying channel object. Streams that are directly associated with operating
jdk.book Page 4 Monday, March 11, 2002 3:38 PM
4 CHAPTER 1
Basic NIO
system features like files and sockets generally are implemented as channels, while
pure-Java streams such as ByteArrayOutputStream and FilterInputStream are not.
This method takes a single argument—the size of the underlying array. This value is
called the buffer’s capacity. Once a buffer is created, the capacity never changes.
The best size for a buffer depends on the application. A larger buffer can allow for
faster throughput, but takes up more memory, while a smaller one may degrade
performance slightly, but uses less memory.
You’ll notice that we didn’t use a traditional constructor here. This is true in gen-
eral: buffers are either allocated using the static allocate() method, or created from
an existing byte array using wrap(). They are never constructed directly by the user.
You’ll also notice that we’ve created a ByteBuffer. The java.nio package also
contains IntBuffer, ShortBuffer, FloatBuffer, and so on. There are, in fact, buffer
types for each of Java’s primitive types. There is a class called Buffer, but it is
abstract—you can’t create one. (Buffer is the abstract superclass of all the buffer
classes.) A buffer is always a buffer of something. In the following sections, we’ll use
this ByteBuffer to illustrate how to do basic channel I/O. In section 1.2.6 we’ll
learn how to use the other types of buffers.
NOTE Since the ByteBuffer is by far the most common, and most important, of the
buffer classes, we will assume that any buffer we are talking about is a Byte-
Buffer unless otherwise specified.
You’ll note that there’s only a single argument to this method. This is because the
three arguments from the old-style read() call, as well as a number of other things,
are all wrapped up inside the ByteBuffer object.
You’ll also note that this new read() method returns an integer, just like the old
one. The meaning of this value hasn’t changed: it’s the number of bytes that were
successfully read. In both cases, this value is limited, because the read() method
will only read as many bytes as can fit in the available space. In the old method, the
available space was len-off; in the new method, the available space is equal to
buffer.remaining(). (More about this in section 1.2.3.)
Note that if you read from a channel that is only open for writing, a NonRead-
ableChannelException will be thrown.
Again, the three arguments to the old-style write are replaced by a single argument,
which is a buffer, in the new write() method:
public int write( ByteBuffer src );
In this new method, you’ll see an important difference that you don’t see with the
read() methods: the new write() method returns an int. The old write() call was
guaranteed to write all the data or throw an exception. There were no valid condi-
tions under which it would write only part of the data and return. This is not the
case with the new write() method. It returns the number of bytes that were written.
And as with reading, if you write to a channel that is only open for reading, a
NonWritableChannelException will be thrown.
jdk.book Page 6 Monday, March 11, 2002 3:38 PM
6 CHAPTER 1
Basic NIO
while (true) {
int ret = inc.read( buffer );
if (ret==-1) // nothing left to read
break;
buffer.flip();
outc.write( buffer );
buffer.clear(); // Make room for the next read
}
}
}
jdk.book Page 7 Monday, March 11, 2002 3:38 PM
Understanding buffers 7
8 CHAPTER 1
Basic NIO
It can be confusing to consider the buffer get() and put() methods along with
the channel read() and write() methods, because they are backwards: when data is
read from a channel, it is written to a buffer. Likewise, when data is written to a
channel, it is read from a buffer. You read from a buffer using the buffer’s get()
methods, and you write to a buffer using the buffer’s put() methods.
There are two kinds of get() and put() methods: relative and absolute. Absolute
methods take an index parameter, which lets you choose the position in the under-
lying array at which you want to read or write. In contrast, relative methods do not
need an index parameter—they use the next value or values in the array after the
last one that was used. Relative methods are more commonly used, since they can
be used to fill or drain a buffer sequentially.
There are five basic put() methods. The methods listed here are for ByteBuffer,
but each of the Buffer classes has these methods. Of course, the arguments to the
corresponding methods of DoubleBuffer are double-based, rather than byte-based,
but otherwise they are the same.
■ put( byte b )—Put a byte into this buffer
■ put( byte src[] )—Put the bytes from an array into this buffer
■ put( byte src[], int offset, int length )—Put a portion of the bytes from
an array into this buffer
■ put( ByteBuffer src )—Copy the contents of another buffer into this buffer
■ put( int index, byte b )—Put a byte at array offset index (starting from zero)
Of these five methods, the first four are relative, and the last one is absolute.
There are four get() methods:
■ get()—Get a single byte from this buffer
■ get( byte array[] )—Fill an array of bytes with bytes from this buffer
■ get( byte array[], int offset, int length )—Fill a portion of an array of
bytes with bytes from this buffer
■ get( int index )—Get the byte at array offset index (starting from zero)
Of these four methods, the first three are relative, and the last one is absolute. Note
that there is no get( ByteBuffer ) method. You can accomplish the same thing
with put( ByteBuffer ).
In addition to these methods, ByteBuffer also contains a set of methods for
reading and writing other primitive Java types. In each case, a call to one of these
methods can be considered equivalent to calling the single-byte get() and put()
jdk.book Page 9 Monday, March 11, 2002 3:38 PM
Understanding buffers 9
methods one or more times, with the bytes involved making up the value of the
primitive type. More on this in section 1.2.7.
What’s noteworthy about this is that our code doesn’t seem to have to keep track of
how many bytes were read and written each time. This is something the buffer does
for us automatically.
Buffers take care of such things using a number of buffer state values. These are
values that reflect the current state of the buffer as it is used for various reading and
writing tasks. They keep track of how many bytes have been read or written, how
many more can be read, how much room there is to read more, and so on. These are
summarized in table 1.1 and are explained in further detail in the following sections.
Table 1.1 The state of each buffer is represented by three values. These values change as the buffer is
read from, or written to, indicating progress through the buffer. In this way, a buffer keeps
track of the reading or writing process.
position The index into the underlying array of the next read (or write)
limit The index into the underlying array of the first element that should not be read
(or written)
Buffer position
The buffer position specifies the next entry in the array that will be used for reading
or writing:
■ If the buffer is being written to (which means that it is being used for a chan-
nel read), the buffer position points to the location where the next byte will
be stored.
jdk.book Page 10 Monday, March 11, 2002 3:38 PM
10 CHAPTER 1
Basic NIO
■ If the buffer is being read from (which means that it is being used for a chan-
nel write), the buffer position points to the next byte to be read.
In both cases, each time a byte is read or written, the value of the buffer position
increases by the length of the item written. The position cannot become greater
than the value of the buffer limit. If the code tries to execute a read or write that
would make the position greater than the limit, a java.nio.BufferUnderflowEx-
ception or java.nio.BufferOverflowException, respectively, is thrown.
Buffer limit
The buffer limit is the amount of data in the array. It defines the first array slot that
should not be used for reading and writing. It is different from the capacity: the
capacity of an array specifies how much data could be put in it—that is, how much
could potentially fit. The limit specifies how much has actually been put in the array.
If the buffer is being written to, the limit specifies the array element after the last
array element that can accept a value. In this case, the limit is generally set to be
equal to the capacity of the buffer, so that the entirety of the underlying array will
be used.
If the buffer is being read from, the limit specifies the array element after the last
array element that can be read. The buffer limit might be equal to the buffer capac-
ity, which means that the buffer was filled with data before reading started. The
buffer limit might also be less than the capacity, which means the buffer was only
partially filled when reading started.
Buffer capacity
The buffer capacity is equal to the size of the underlying array. Even if the array is
only partially filled with data, the capacity refers to the entire array, including both
the used and unused portions. The capacity of a buffer never changes.
NOTE Each buffer has a method called remaining(), which returns the num-
ber of slots left that can be read or written. This value is equal to limit()
- position().
Understanding buffers 11
source channel is then called, and it Figure 1.2 After writing some data, the position
places some data in the buffer. This has advanced, while the limit and capacity are
data may or may not fill the buffer. unchanged.
The limit is still set to the capacity,
while the position has advanced (see
figure 1.2).
Some more data is read from the
channel and placed into the buffer. Position Limit
The buffer position advances fur-
ther (see figure 1.3). Capacity
The writing phase is now over. Figure 1.3 After writing more data, the position
buffer.flip() is called to prepare has advanced further.
the buffer to have its data read (see
figure 1.4). (You can think of the flip() method as flipping a switch between read-
ing and writing modes. Buffers don’t actually have reading and writing modes—
you can mix read() and write() calls freely. However, it is very common to use a
buffer in the way we are using it here—you do some reading, flip the buffer, and do
some writing.)
In order to prepare for reading, the value of limit must be changed. Before the
call to flip(), the buffer was being used as an empty area into which data could be
put; the limit value specified the end of this empty area. Now that flip() has been
called, the buffer is being used as a source of data, and the limit value now specifies
jdk.book Page 12 Monday, March 11, 2002 3:38 PM
12 CHAPTER 1
Basic NIO
data from the buf fer (see Figure 1.4 After calling flip(), the limit is set
figure 1.5). to the old value of position, and the position is set
to 0.
The reading process continues
until the position reaches the limit,
at which point there is no more
data in the buffer (see figure 1.6).
The reading phase is now over.
At this point, the clear() method
Position Limit
is called (see figure 1.7).
The position is set to 0, while
Capacity
the limit is set to the capacity, leav-
ing as large a space as possible for Figure 1.5 The reading process begins—as bytes
use in the next writing phase. are read, the position advances.
the limit of the original buffer, and Figure 1.7 After clear() is called, position is set
the first element of the subbuffer to 0 and limit is set to capacity.
jdk.book Page 13 Monday, March 11, 2002 3:38 PM
Understanding buffers 13
corresponds to the element at value position within the original buffer (see
figure 1.8).
In figure 1.8, the subbuffer corresponds to the second through fifth elements of
the original buffer, inclusive. This corresponds to the following code:
ByteBuffer original = ByteBuffer.allocate( 8 );
original.position( 2 );
original.limit( 6 );
ByteBuffer slice = original.slice();
The individual data elements pointed to by the two buffers are in fact the same
data. Thus, any change to the shared data in one buffer will be immediately
reflected in the other.
Original
buffer
Slice
buffer
Position Limit
Capacity
Figure 1.8 A slice buffer shares a subsequence of the original buffer. It has its own position, limit,
and capacity values and does not have to start at the same position as the original buffer.
jdk.book Page 14 Monday, March 11, 2002 3:38 PM
14 CHAPTER 1
Basic NIO
Since you have access to both buffer and floatBuffer, you can access this data
as bytes or as floats. Note that you have two buffers here, each with its own posi-
tion, limit, and capacity values.
Suppose, for example, you wanted to read a series of floating-point values from a
channel: you could read from the channel into the ByteBuffer, and then read the
floats from the FloatBuffer. Since these two buffers point to the same data, the float-
ing-point values in the FloatBuffer are made up of the bytes in the ByteBuffer.
float floatArray[] = new float[floatArraySize];
fch.read( buffer );
It’s important to remember that the position and limit values of the two buffers are
independent of each other. This means, for example, that although the FloatBuffer
might be exhausted by the reading process, the ByteBuffer is still ready to read
from the beginning—its position value is still 0.
Understanding buffers 15
The choice of whether to use typed buffers, such as FloatBuffer, or the typed
accessor methods, such as ByteBuffer.getFloat() and ByteBuffer.putFloat(),
depends on the homogeneity of the data involved. A FloatBuffer consists entirely
of floats, and so is good for reading banks of uninterrupted floating-point data. A
ByteBuffer, on the other hand, might be ideal for reading file headers that contain
data of different types.
WARNING The default byte order of a ByteBuffer is big-endian*, but this can be
changed using the ByteBuffer’s order( ByteOrder ) method. The or-
der() method can be used to find out the ByteBuffer’s current byte order.
You can find out the platform’s native byte order with the Byte-
Order.nativeOrder() static method.
*The terms big-endian and little-endian, borrowed from Jonathan Swift, refer to two different
methods for ordering bytes within a multi-byte value. The big-endian methods puts the most
significant byte first and the least significant byte last; thus, the 32-bit hexadecimal value AAB-
BCCDD is stored with the AA byte first and the DD byte last. In contrast, the little-endian
method would store the DD byte first and the AA byte last.
jdk.book Page 16 Monday, March 11, 2002 3:38 PM
16 CHAPTER 1
Basic NIO
NOTE Direct buffers do not contain faster memory. They simply contain memory
that can be accessed directly by the runtime system and/or the underlying
operating system, so that data that is passed in and out of the JVM will not
have to be copied, thus saving time.
jdk.book Page 17 Monday, March 11, 2002 3:38 PM
Understanding buffers 17
you call
ByteBuffer buffer = ByteBuffer.allocateDirect( 1024 );
This is the only way you can create a direct buffer. Note that you clearly can’t use
the wrap() methods, because they explicitly construct a buffer using an array that is
within the JVM —a Java array. Similarly, the array() method, which returns the
underlying Java array of a Buffer, if any, will not work for a direct buffer, since there
is no underlying Java array.
To demonstrate the speed advantage of direct buffers, let’s try modifying the
CopyFile program from section 1.1.5 (listing 1.1) to use a direct buffer instead of a
regular buffer. The modification is shown in listing 1.2.
while (true) {
int ret = inc.read( buffer );
if (ret==-1)
break;
buffer.flip();
outc.write( buffer );
buffer.clear();
}
On the system used to test the code, copying a 16-MB file with CopyFile took nine
seconds, while copying it with FastCopyFile took about 4.5 seconds—a 50% savings!
18 CHAPTER 1
Basic NIO
TCP/IP forwarding
Forwarder is a simple TCP/IP for- Source Forwarding Destination
warding program. It for wards machine machine machine
TCP/IP connections coming into
Figure 1.13 Packages from the source machine are
the forwarding machine to any of a forwarded to the destination machine by the forwarding
number of destination machines. machine. Response data from the destination machine
Data that is sent from the source is likewise forwarded, sent back to the source
machine.
machine to the for warding
machine is forwarded to the desti-
nation machine. Response data from the destination machine is sent back to the
corresponding source machine (see figure 1.13).
The idea here is to simulate a connection that does direction from the source
machine to the destination machine. The forwarding machine acts as an intermedi-
ary. It forwards the data between
the machines and tries not to inter- Source Forwarding Destination
fere otherwise, much as an Inter- machine machine machine
net router does (see figure 1.14).
Figure 1.14 The forwarding machine seeks to
It’s important to understand simulate a direct connection between the source and
that this is a TCP/IP forwarder, not destination machines. It forwards the data but does
an IP forwarder. That is, the for- not modify it in any way.
warding is happening at the level
of TCP virtual circuits, rather than at the IP packet level. This means that the for-
warder cannot act as transparently as an Internet router. For example, data arriving
at the destination machine is marked as having come from the forwarding machine,
not from the source machine. Some connections will have a problem with being
forwarded in this way, but many will work fine.
One use for a program like this is as a simple firewall. The forwarding machine is
set up as the only machine that is accessible from the Internet. A set of other
machines are connected to the firewall; these are said to be “behind” the firewall
because external machines can only reach them by crossing through the forwarder
firewall (see figure 1.15). The forwarder can completely control which connections
will be accepted and which destination machines they will be forwarded to.
Understanding buffers 19
100 panix.com 80
110 panix.com 23
5555 www.w3c.org 80
The configuration file is defined more completely in the notes following listing 1.3.
To use this program, you must specify the name of the configuration file on the
command line, as follows:
java Forwarder forwarder.cfg
Forwarding Destination
machine machine
Destination
machine
Internet
Destination
machine
Destination
machine
Figure 1.15 The forwarder can be used as a firewall, protecting machines hidden behind the forwarding
machine from direct Internet access. Connections to the destination machines must be explicitly allowed
by the forwarder.
Source code
Let’s take a look at the source in listing 1.3.
20 CHAPTER 1
Basic NIO
public Forwarder() {
}
Onder de vele andere kerken door Justinianus in Constantinopel opgericht was een
nieuw gebouw in Byzantijnschen stijl op de plaats van de oude Constantijnsche Kerk
van de Heilige Apostelen. Het is verdwenen, doch naar dit voorbeeld is de St. Marcus’
kathedraal met de vijf koepels te Venetië gebouwd, en dus is de herinnering daaraan
blijven bestaan. Aan Justinianus moet ook worden toegeschreven de Byzantijnsche kerk
van St. Sergius en St. Bacchus, die zooals de S. Vitale te Ravenna, in het midden
achthoekig is, met acht bogen, waarop een groote koepel rust. Deze S. Vitale is ook een
beroemde, nog bestaande kerk, die in nauwe betrekking staat met den naam van
Justinianus. Zij is ouder dan de St. Sophia (waaraan men in 532 begon); het is een
Byzantijnsche kerk, en gelijkt zoozeer op de kerk van St. Sergius en St. Bacchus, dat
zeer waarschijnlijk het ontwerp voor Theoderik’s kerk te Ravenna en misschien zelfs de
werklieden afkomstig waren van Anthemius en een ander oosterschen architect; en
toevallig was de man, die de leiding had van den bouw van de S. Vitale4), Aartsbisschop
Ecclesius, juist een jaar, voordat men aan de kerk begon, te Constantinopel; want Koning
Theoderik zond in 525 gezanten naar het oostersche hof, en onder dezen was, behalve
Paus Johannes, ook Ecclesius. Zijn houding te Constantinopel beviel den Ariaanschen
monarch blijkbaar beter dan die van den ongelukkigen Paus, want kort na zijn terugkeer
en waarschijnlijk vóor Theoderik’s dood begon hij deze prachtige Byzantijnsche kerk,
die, trots vele herstellingen toch nog iets van haar oorspronkelijken luister behouden
heeft. Van bijzondere schoonheid zijn de marmeren zuilen, met de fijnbewerkte
kapiteelen en onbeschrijfelijk rijk zijn de mozaïeken.
Sommige van deze mozaïeken zijn geplaatst tijdens het leven van Ecclesius († 534),
want hij wordt er op voorgesteld zonder nimbus. Dit apsis-mozaïek, zooals de groep
engelen in de S. Apollinare Nuovo, onderscheidt zich sterk van de andere door zijn
eenvoudige en indrukwekkende grootheid, die wij ook in de oudere mozaïeken te
Ravenna en te Rome vinden. De andere kenmerken zich door den pronkerigen opschik
en onartistieke uitvoering, die men gewoonlijk bij Byzantijnsche mozaïeken aantreft.
Deze behooren tot de periode, die volgt op de inneming van Ravenna (540) door
Belisarius, en waren zonder twijfel bekostigd door Justinianus en Theodora, die ruim
hadden ingeschreven voor de versiering van de S. Vitale. Het is dus zeer belangrijk, dat
onder deze latere mozaïeken de portretten van den Keizer en de Keizerin voorkomen en
uit den nimbus, waarmede beiden zijn versierd mogen wij misschien afleiden, dat de
mozaïeken voltooid zijn na 548, toen Theodora stierf, of zelfs na Justinianus’ dood in
565. Justinianus wordt afgebeeld met een gouden bakje vol juweelen of geld, dat hij de
kerk aanbiedt; hij is vergezeld van den Aartsbisschop Maximianus, die het gebouw in
547 heeft gewijd. Theodora5, omgeven door haar hofdames, brengt als haar offer een
grooten beker en is op het punt de kerkdeur binnen te gaan, waarbij de doopvont staat.
Nog éen kerk, S. Apollinare in Classe moet hier in verband met Justinianus vermeld
worden, want het is zeer waarschijnlijk dat hij persoonlijk belang had bij de voltooiing
van die kerk, daar zij tusschen 535 en 538 gebouwd is door den opvolger van Ecclesius
en, evenals de S. Vitale, door Maximianus gewijd is. De stad en de haven van Classe
zijn, zooals wij reeds verteld hebben, geheel verdwenen en deze groote basiliek van S.
Apollinare staat nu, evenals de oude Grieksche tempels te Paestum, bijna geheel
verlaten; misschien is er geen indrukwekkender gebouw in de wereld. Uitwendig bezit
het geen schoonheid die met een Griekschen tempel of noordelijke kathedraal kan
vergeleken worden, ofschoon men den ouden klokketoren, die in zwijgende waardigheid
tusschen de met waterlelies bedekte poelen en de drassige velden van het eenzame
moerasland zich verheft, niet licht zal vergeten; maar inwendig is deze basiliek een van
de heerlijkste en prachtigste, die bestaan.
Het Rijk van de Longobarden
c. 568–c.700
1 In de Middeleeuwen nam men algemeen aan, dat het Romeinsche Keizerrijk nog steeds bestond.
2 Men leze het levendig verslag van de 4 partijen of race-clubs van den Romeinschen Circus (wit, rood,
groen, blauw) en de onlusten ontstaan door de moorddadige veeten tusschen die partijen, bij Gibbon XL,
2, en de commentatoren op Juvenal. Sat. XI. 193 sq., verzen die, mutatis mutandis, nog heden van
toepassing zijn. De uitroep “Nika” beteekent “Overwin!”
3 Het Parthenon te Athene was reeds als kerk aan de Hagia Sophia gewijd.
4 Op een van de groote mozaïeken wordt hij voorgesteld met een model van de kerk in zijn hand.
5 Haar diadeem is rijk bezet met groote parels en edelgesteenten, zooals de latere Keizerskroon (zie fig.
19). Het haar met de lange oorhangers en den breeden kraag, maniakon, alles rijk voorzien van juweelen,
vervangen volgens de nieuwe mode den breeden en zwaren gouden halsketting.
Derde Deel.
Historisch Overzicht.
568–800.
O
ns verhaal is afgebroken bij den dood van Narses, die waarschijnlijk in 567
plaats vond, een paar maanden voor den inval van de Longobarden; nu volgt,
gedurende twee eeuwen ongeveer, de heerschappij van de Longobarden, een
tamelijk donkere en droevige periode, waarin vele zaden, die later bloemen en vruchten
voortbrachten, zich in den grond ontwikkelden, maar die voor ons niet veel
aantrekkelijks heeft, behalve eenige belangrijke persoonlijkheden, voorboden van de
komende lente van de Italiaansche kunst.
De bronnen van onze kennis zijn verscheidene; van groot belang zijn de geschriften van
Paus Gregorius den Groote, het Edict van Koning Rotharis (Roterik) met een voorrede,
waarin vele feiten vermeld worden, die een duisteren tijd eenigermate belichten (tot 640
ongeveer); tegelijk met de handschriften van die voorrede is een belangwekkenden
Origo Langobardorum van omstreeks 607 gevonden, die de eenigszins legendarische
oudste geschiedenis van de Longobarden geeft; ten slotte hebben de Historia
Langobardorum van Paul Warnefrid, algemeen bekend als Paulus Diaconus, een
Longobard, die een tijdlang leefde aan het hof van Karel den Groote en zich ten slotte
terugtrok in het Benedictijner klooster van Monte Cassino, waar hij waarschijnlijk
omstreeks 800 stierf. Zijn Historia geeft een zeer duidelijke beschrijving van den
ellentoestand van Italië tijdens den Longobarden-inval en een reeks van levendige
portretten van de Longobardische koningen tot de regeering van Liutprand, met vele
invoegsels, in den trant van Herodotus. Het werk is onvoltooid, misschien, omdat hijzelf
een Longobard was en toch veel aan den Frankischen koning te danken had, zoodat hij
het lastig vond de verovering van Italië door de Franken te beschrijven.
24. Mozaïek in S. Pudenziana en S. Prassede, Rome.
Tegenover de Longobarden in het land der Rugiërs (de streek langs den noordelijken
oever van den Donau, tusschen Regensburg en Weenen) woonden de Gepiden, die uit het
Westen, uit Dacië schijnen, gekomen te zijn en het land, dat Theoderik en zijn Oost-
Goten hadden verlaten, Pannonië enz. hadden bezet. Deze Gepiden waren in 554 zoo
lastig voor het Romeinsche Rijk, dat door Justinianus, volgens de gewone politiek van
het Byzantijnsche hof, de Longobarden werden omgekocht om hen aan te vallen. Op den
eersten veldtocht doodde de jonge Alboin den zoon van den koning der Gepiden,
Torismund, maar de oorlog werd voortgezet en eerst toen de Longobarden voor een deel
van hun vee en veel land en buit een verbond met de Avaren, dien woesten stam van
Turksche afkomst, waardoor Justinianus zoo verschrikt was, hadden gekocht,
verpletterden zij hun vijand in een grooten slag. De Gepiden schijnen ongeveer
uitgeroeid te zijn, want men hoort niet meer van hen en hun koning Cunimund onderging
hetzelfde lot als zijn broeder Torismund door de hand van Alboin, die nu koning van de
Longobarden was. Zijn hoofd werd afgeslagen en Alboin liet van den schedel een
drinkbeker maken. Zijn dochter Rosamund werd gevangen genomen en gedwongen
Alboin te trouwen, die vroeger naar haar hand had gedongen, maar met minachting door
haar vader was afgewezen.
De inval van de Longobarden in Italië had verschillende oorzaken. Een van deze was
zonder twijfel de druk op hen uitgeoefend door de woeste Avaren, die zelf waarschijnlijk
westwaarts werden gedrongen door andere stammen uit het oosten; een andere oorzaak
was misschien de uitnoodiging van Narses; nog een andere, dat Italië door zijn bekenden
rijkdom en vruchtbaarheid de indringers tot zich trok, vooral daar het in dezen tijd bijna
weerloos was. De Byzantijnen hadden hun macht niet voldoende bevestigd. Het was
hun, evenmin als de Oost-Goten, gelukt de gunst of berusting van het Italiaansche volk
te winnen. Narses had de geestelijkheid en den adel zoo verbitterd door zijn militair
despotisme, en het volk door zijn uitpersingen dat, zooals de Romeinsche gezanten aan
Justinus hadden verklaard, Italië verwoest door de lange oorlogen, ontvolkt door
hongersnood en pest, volkomen onmachtig zich te verdedigen, bereid was zich onder
Gotische of elke andere heerschappij te stellen, daar die waarschijnlijk dragelijker zou
zijn dan die van Narses en het Oostelijke Keizerrijk. Narses had toen zijn ontslag
gekregen, maar ofschoon zijn opvolger Longinus getracht had eenige verbetering te
brengen, was hem dat mislukt. Hij maakte geen plan voor een systematische
verdediging, maar sloot zich op in Ravenna. De verstrooide overblijfselen van het
Gotische leger sloten zich zonder twijfel bij den nieuwen barbaarschen indringer aan en
in ongeveer achttien maanden werden vele van de voornaamste steden van Noord-Italië
overgegeven aan of veroverd door de horden1 van Longobarden, Gepiden, Sueven,
Saksen, Bulgaren en Beieren, die met hun vrouwen, kinderen, vee en al hun roerende
bezittingen Alboin waren gevolgd over den welbekenden pas van de Julische Alpen, die
zoo dikwijls door binnendringende benden was gebruikt.
Pavia bood hardnekkigen weerstand en werd drie jaren lang belegerd. Het was in dien
tijd sterker en belangrijker dan Milaan, dat nog niet hersteld was na den inval van de
Franken, en het werd nu hoofdstad van het Longobardische Koninkrijk. Dit rijk omvatte
in Noord-Italië de twee provincies Neustria en Austria, hetgeen ongeveer hetzelfde was
als het tegenwoordige Lombardije, Piemont, Emilia en Noord-Venetia, met de volgende
steden: Verona, Vicenza, Mantua, Trento, Bergamo, Brescia, Milaan, Pavia, Turijn,
Parma, Modena, Aquileia, Treviso. In het noorden, westen en oosten werd dit gebied
begrensd door de Alpen, maar naar het zuiden breidde Alboin zijn veroveringen uit over
de Apennijnen en tot de streek van Urbino en den Furlo-pas (de bekende Petra
intercisa), welk strategisch punt hij bezette. En zoo weinig weerstand werd er in
Midden-Italië geboden, dat benden van barbaren verder zuidwaarts marcheerden, het
geheele binnenland en een belangrijk deel van de kust veroverden, behalve de versterkte
havens, die toegankelijk waren voor de Byzantijnsche vloot. Twee van hun aanvoerders
wierpen zich als hertogen (duces) van dit veroverde gebied op; de een koos Spoleto en
de ander Benevento tot residentie. Deze twee Longobardische hertogdommen, die later
veel moeilijkheden veroorzaakten, schijnen eerst in naam aan Alboin onderworpen
geweest te zijn, maar weldra werden zij feitelijk onafhankelijk.
De verovering door de Longobarden was dus allerminst volledig. Gedurende een eeuw
was de heerschappij over Italië verdeeld tusschen twee volkeren van geheel verschillend
karakter, een feit dat op zich zelf reeds een scheuring veróorzaakte; en deze scheuring in
de nationaliteit werd verergerd, totdat zij onherstelbaar werd door de inwendige
oneenigheden en de zwakheid van hen, die aanspraak maakten op de heerschappij; want,
aangezien oproer en anarchie voortdurend het Longobarden-rijk teisterden, en de
Byzantijnen steeds wanhopig worstelden om hun gezag te handhaven tegen de snel
toenemende macht van de Pausen en de begeerte naar vrijheid, die in Italië wakker werd,
maakten in alle deelen van het land de steden zich langzamerhand min of meer
onafhankelijk of begonnen zich tot kleine staten te vereenigen, waardoor ontelbare
staatkundige verwikkelingen ontstonden.
Kort na de inneming van Pavia (572) werd Alboin vermoord. De geschiedenis van zijn
dood lijkt op het Gyges-verhaal van Herodotus en schijnt een echo gevonden te hebben
in de legende van de “Schoone Rosamonde.” Men zegt, dat hij zijn vrouw bij een
feestmaal uitgenoodigd of gedwongen heeft te drinken uit den beker, die gemaakt was
van den schedel van haar vader Cunimund. Rosamund wreekte zich door haar minnaar,
een edelman, Helmechis geheeten, den wapendrager van den koning, over te halen hem
te vermoorden, of volgens anderen, een moordenaar voor die daad te huren. Alboin, in
zijn slaap overvallen, trachtte tevergeefs zijn zwaard te trekken, dat door zijn vrouw aan
de scheede was vastgebonden, en nadat hij zich eenigen tijd met een stoel had verdedigd
werd hij overweldigd en gedood.3 Helmechis en Rosamund trachtten met den steun van
het Gepidische leger de koninklijke heerschappij te bemachtigen, maar moesten wijken
voor de verontwaardigde Longobarden en de hulp inroepen van den Byzantijnschen
stadhouder van Ravenna, Longinus. Deze stuurde schepen de Po en de Adige op en aldus
ontvluchtten zij te zamen met Alboin’s dochter Albsuinda. Te Ravenna werden zij eervol
ontvangen. Toen besloot Rosamund, bemerkend dat Longinus verrukt was van haar
schoonheid, zich vrij te maken van Helmechis; maar nadat hij iets van den wijn
gedronken had, dien zij hem in zijn badkamer had gebracht, ontdekte hij, dat er vergift in
was en dwong haar het overige van den doodelijken drank zelf te drinken. Misschien zijn
de bijzonderheden van dit dramatisch verhaal verzinsels, ontstaan door een poging van
de Koningin om Byzantijnschen invloed te laten gelden of zelfs door een samenzwering
om de Byzantijnsche suprematie te herstellen. Maar de waarheid is soms even vreemd
als de verdichting en de toestanden bij de Longobarden waren in dien tijd, ondanks hun
Christelijken godsdienst (of beter Arianisme) zoodanig, dat men het verhaal wel kan
gelooven.
Hoe het ook zij, twisten en samenzweringen kwamen blijkbaar herhaaldelijk voor, want
de volgende koning, Clefi of Kleph, werd na een regeering van achttien maanden
vermoord en daar de hertogen het niet eens konden worden, werd er niemand in zijn
plaats gekozen, maar de volgende tien jaren bestuurden de hertogen, die waarschijnlijk
zes en dertig in aantal4 waren, ieder hun eigen hertogdom zonder een leenheer te
erkennen; als wij Paulus Diaconus mogen gelooven, regeerden de meesten zeer wreed,
daar zij de rijke grondbezitters verdreven en soms zelfs doodden, een derde van de
inkomsten eischten, de Katholieke kerken plunderden en de geestelijkheid vervolgden.
Maar het verbond met de Franken had de hoop en den moed van de Byzantijnen in Italië
hernieuwd en het dringend verzoek om hulp, dat Paus Pelagius weder deed door middel
van zijn gezant of Nuntius (apocrisarius) Gregorius (den Groote), bewerkte de
verkiezing van een nieuwen en ondernemenden Exarch, Smaragdus (Smaraldo), die
weldra kwam met een aanzienlijke strijdmacht. De Longobarden daarentegen, die geen
Koning hadden, waren tot flinke samenwerking niet in staat, totdat ten slotte de
hertogen, die de oorzaak van hun eigen zwakte inzagen, een vergadering te Pavia (585)
hielden en Autharis (Autherik), den zoon van Clefi, als hun souverein aannamen, terwijl
zij gedeelten van hun inkomsten afstonden om de monarchie te begiftigen. De worsteling
tusschen de Longobarden en Byzantijnen werd nu heviger, vooral in het noorden en
oosten, waar twee belangrijke gebeurtenissen plaats grepen: de Isola Comacina, een
klein rotsachtig eiland in het meer van Como, dat zeer interessant is met het oog op den
oorsprong van de Longobardische architectuur en dat toen een sterke voorpost van de
Byzantijnen was, werd door de Longobarden genomen; Smaragdus daarentegen
heroverde in 588 de stad en de haven van Classe, waarover wij ons nauwelijks behoeven
te verbazen, daar de Byzantijnen meesters van de zee waren. Inderdaad moet men er zich
veeleer over verwonderen, dat de Longobarden die plaats negen jaren lang behouden
hebben, terwijl zij toch ingesloten waren tusschen de zee en de bolwerken van Ravenna.
Deze oorlog werd een tijdlang onderbroken door een groote overwinning van Autharis
op de Franken, die, weder door de Byzantijnen omgekocht, door den Splügen-pas de
landstreek rondom het Como-meer binnendrongen; volgens Paulus Diaconus had er
nooit zulk een slachting onder de Franken plaats gehad. In de tamelijk rustige pauze, die
op dezen slag (589) volgde, dong de Longobardische koning naar de hand van een
Beiersche prinses, Theudelinde, daar hij zich gaarne een bondgenoot wilde verwerven.
De geschiedenis van dit aanzoek en nog veel meer over Koningin Theudelinde of
Theodelinda, zooals de Romeinen zeiden, zal later verhaald worden.6 Dat huwelijk
verbitterde den Frankischen koning, Childebert zoozeer, dat hij wederom Italië
binnenrukte. Doch opnieuw werden de Franken gedwongen terug te trekken wegens
burgertwisten in hun land en de terugtocht werd verhaast door een geweldige
overstrooming van de Italiaansche laaglanden en vooral ook door de pest, die met groote
kwaadaardigheid uitbrak.
Paus Pelagius was een van de duizenden slachtoffers van die pest in 590. Hij werd
opgevolgd door Gregorius. Wij hebben reeds van hem gehoord als gezant van den Paus
te Constantinopel. In dit jaar 590 stierf ook Koning Autharis. Hij was waarschijnlijk een
van de beste Longobardische vorsten, ofschoon sommige onduidelijke uitdrukkingen
van Paulus Diaconus er op schijnen te wijzen, dat onder zijn regeering de Italianen nog
meer werden verdrukt dan onder de hertogen, zelfs tot slaaf werden gemaakt en onder de
Longobarden werden verdeeld. Maar dit is in strijd met andere plaatsen, waar hij spreekt
over den toestand van het land in dien tijd. “Men hoorde van geen gewelddaden,” zegt
hij “noch van eenige revolutionaire samenzwering; niemand onderdrukte een ander op
onrechtvaardige wijze, niemand plunderde; er waren geen dieven, geen roovers; ieder
ging zijn weg, waarheen hij wilde, zonder vrees of angst.”
Dat de Longobarden barbaren waren, die niet zoo artistiek waren aangelegd als de
Goten, is duidelijk; zij schijnen niet dat gevoel voor de zuidelijke kunst en litteratuur
gehad te hebben, dat zoo merkwaardig is bij Theoderik, Amalasuntha. en ook bij
Theodahad; maar zij waren blijkbaar niet zoo wreed. Geen der Longobardische vorsten,
zelfs Alboin niet, kan beschuldigd worden van de woeste wreedheid, die Theoderik en
Theodahad aan den dag hebben gelegd. Het wilde uiterlijk van de oorspronkelijke
Longobarden, hun linnen kleederen met bonte strepen, hun aan de achterzijde geschoren
hoofden, de ruige haren, die over hun gezicht hingen en hun lange baarden werden met
nieuwsgierigheid en schrik door hun naaste afstammelingen aanschouwd. In het
zomerpaleis van Theoderik, te Monza, dat Koningin Theodelinda liet herstellen en met
fresco’s versieren, waren deze barbaarsche stamvaders van het ras afgebeeld; zonder
twijfel wekten zij groote verwondering en afschuw, reeds lang voor de dagen van Paulus
Diaconus, die met eenige ontsteltenis de portretten van zijn voorvaderen zag en
beschreef. Maar ondanks dit ruwe uiterlijk en hun woestheid in den oorlog, waardoor
zelfs Narses gedwongen werd zich van hen, als bondgenooten, te ontdoen, was er in hen
een zachtheid, edelmoedigheid en ridderlijkheid verborgen, die dikwijls hun gevangenen
en onderdanen verraste. Deze eigenschappen komen duidelijk uit in de Longobardische
wetten van Rotharis en worden juist aangegeven in het grafschrift van een
Longobardischen krijger, dat Faulus Diaconus aanhaalt:
Men zal zich herinneren, dat Alarik’s opvolger, Athaulf, zijn plan om een Gotisch Rijk te
stichten opgaf, omdat hij overtuigd was geworden, dat de Goten niet in staat waren
zichzelf te besturen en dat de eenige mogelijkheid om de orde te verzekeren lag in hun
eerbied voor de oude Romeinsche staatsinstellingen. Ook Theoderik en zijn dochter
Amalasuntha, moesten, niettegenstaande hun hevig verlangen om een Vereenigd Italië te
stichten, toegeven, dat Gotische invloeden hun te sterk waren. De Longobarden brachten
het evenmin tot stand, doch tengevolge van andere oorzaken. Zij waren Italië niet
binnengedrongen op verzoek van den Oost-Romeinschen Keizer, zooals Theoderik, en
evenmin koesterden zij zulk een eerbied voor het Keizerrijk. In hoeverre zij Romeinsche
wetten en Romeinsche ambtenaren afgeschaft hebben, kan men niet gemakkelijk
aantoonen; maar het is zeker dat zij in vele opzichten hun eigen regeeringsstelsel hebben
ingevoerd. Nu berustte dit stelsel alleen op mondeling overgeleverde wetten en paste
beter bij hun vroeger nomaden-leven dan bij de omstandigheden, waarin zij nu
verkeerden als heerschers in een land, dat gedurende vele eeuwen het centrum van
Europeesche beschaving was geweest, terwijl zij vergelijkenderwijze de minderen in
aantal waren. Bovendien was de contrôle, die de Longobardische koning over zijn
krijgslieden uitoefende zeer verslapt, daar zijn onderdanen over bijna geheel Italië
verspreid waren en er een groot aantal hertogdommen waren ontstaan, van welke
sommige weldra onafhankelijk werden onder het bestuur van vorsten, die erfelijke
dynastiën stichtten. Ook had de koning, ofschoon hij in geval van oorlog de hoogste
macht bezat, toch geen erfelijke rechten—een feit dat veel bloedvergieten en verwarring
veroorzaakte—en ofschoon zijn gezag aan de hertogelijke hoven vertegenwoordigd werd
door ambtenaren (gastaldi) die de financiën moesten controleeren, oorlogsbelasting
innen en toezicht houden op militaire zaken, werden deze meer en meer tegengewerkt
door de particuliere raadslieden en gouverneurs van hertogen (gasiadi en sculdasci).
Deze decentralisatie was de oorzaak, dat het Longobardische koninkrijk geen stevig
aaneengesloten staat werd. Maar juist deze onmacht om te heerschen leidde tot de fusie
met de verschillende Italiaansche volkeren en ofschoon het de vorming van een
Italiaansche natie uitstelde, is het toch zonder twijfel een zegen geweest.
Na den dood van Autharis in 590 verzochten de hertogen Theodelinda, wier karakter en
intellect indruk hadden gemaakt, een echtgenoot uit hun midden te kiezen. Nadat zij
consilium cum prudentibus had gehouden, zooals Paulus Diaconus zegt, koos zij Agilulf,
hertog van Turijn, die in de kerk van S. Ambrogio te Milaan gekroond werd. Zij
regeerden vijf en twintig jaar. Deze regeering is om verschillende redenen
belangwekkend. Agilulf wordt door sommige schrijvers beschouwd als de eerste
Longobardische koning, die, zeer zeker onder invloed van zijn verstandige koningin,
getracht heeft een stevigen en gecentraliseerden regeeringsvorm in te voeren. Bovendien
is deze periode voor dengene, die de Italiaansche kunst bestudeert, van bijzonder belang;
Gregorius de Groote is een indrukwekkende persoonlijkheid en zijn verhouding tot den
Longobardischen koning en koningin maakt het onderwerp nog belangrijker. Wij zullen
deze periode dus later uitvoeriger behandelen.
Maar, voordat dit alles gebeurde, had Agilulf eenige jaren van zwaren strijd. Eerst moest
hij de ongehoorzame hertogen van Orta, Treviso en Bergamo tuchtigen. De laatste van
dezen, Gaidulf, had zich versterkt op de Isola Comacina, een vesting in het meer van
Como, die een paar jaren te voren door Autharis op de Byzantijnen was veroverd.
Agilulf bemachtigde het eiland, waar hij aanzienlijke schatten vond, joeg Gaidulf naar
Bergamo en nam hem gevangen, maar spaarde zijn leven en won aldus zijn vriendschap.
Daarna maakte hij zich gereed den al te onafhankelijken hertog van Benevento te
onderwerpen. De Longobardische hertogen van Benevento en Spoleto waren niet alleen
tegen hun Koning opgestaan, maar traden zoo dreigend tegen Rome op, dat Gregorius,
die, zooals hijzelf zegt, niet meer wist of hij een geestelijke herder was of een
wereldlijke vorst, na een vruchteloos beroep op Ravenna, een verdrag teekende met de
gens nefandissima Longobardorum, zooals hij hen gewoonlijk noemde.
Hierop besloot Agilulf Rome aan te vallen en marcheerde in het voorjaar naar het
zuiden. Te Rome ontstond zulk een ontsteltenis, dat Gregorius zijn preeken over
Ezechiel afbrak en het zwaard aangordde. Maar, hetzij de Romeinen, aangevuurd door
hun krijgshaftigen Paus te hevigen tegenstand boden, hetzij de malaria van de Campagna
te veel offers vroeg, Agilulf trok terug naar het noorden, na het land verwoest te hebben;
een paar jaren lang werd Italië noch door de Longobarden, noch door de Byzantijnen
meer geteisterd, want in het oosten ontstonden ernstige onlusten, door de dreigende
Avaren en door den dood van den Keizer Mauricius die door den usurpator Phocas was
vermoord.
In de latere jaren van Paus Gregorius’ leven werd de verhouding tusschen hem en den
Longobardischen koning zeer hartelijk, vooral door toedoen van Theodelinda, die als
Beiersche prinses in de Katholieke leer was opgevoed en een sterken invloed had op
haar gemaal. Of Agilulf werkelijk het Arianisme heeft afgezworen, is onzeker, maar hij
stond toe, dat zijn zoon Adelwald gedoopt werd (603) als Katholiek, zooals wij
vernemen uit Gregorius’ briefwisseling met de Koningin over zijn klein petekind. Dit
begunstigde de uitbreiding van het Katholicisme onder de Longobarden ten zeerste.
Doch het duurde nog eenigen tijd, voordat zij geheel en al afstand deden van hun
ketterschen vorm van Christelijken godsdienst.
Sinds 600 werd Gregorius hevig door jicht geplaagd en in 604 is hij daaraan gestorven.
Het schijnt dat de populariteit, die Agilulf en Theodelinda door hun krachtige en
verstandige regeering en het aanmoedigen van kunst en ontwikkeling gewonnen hadden,
hun het voorrecht van erfelijke souvereiniteit verschaft heeft, want in datzelfde jaar 604
werd hun zoon, die nauwelijks twee jaar oud was, tot troonopvolger uitgeroepen. Dit
gebeurde te Milaan, in de tegenwoordigheid van den gezant van Theudebert II, den
Koning der Franken, wiens minderjarige dochter tevens plechtig met den kleinen
Adelwald verloofd werd. Na deze gebeurtenis hooren wij weinig van Agilulf’s regeering
en behalve, dat het noord-westelijk Longobardisch gebied een tijdlang geteisterd werd
door groote horden van Avaren, een Tartaarschen stam8, schijnen de laatste tien jaren
van zijn leven rustig voorbij te zijn gegaan, daar er officieel vrede bestond tusschen de
Longobarden en het Exarchaat; en gedurende deze periode en nog meer in de volgende
tien jaren was Theodelinda bezig eenige van hare vele kerken te bouwen, haar paleis te
versieren, en kunstenaars, Katholieke prelaten en andere beroemde mannen aan haar hof
te verbinden.
Na Agilulf’s dood volgde Adelwald, nu twaalf jaar oud, een vurig Katholiek, hem op
onder het regentschap van zijn moeder. Van de gebeurtenissen tijdens zijn regeering
(615–25) weten wij zeer weinig. Door toedoen van Ariaansche edelen brak een oproer
uit, dat hem dwong te vluchten naar Ravenna, en Ariwald, een Ariaan, werd op den troon
geplaatst. Theodelinda bleef misschien een tijdlang bij haar zoon, maar het schijnt dat zij
teruggekeerd is en als gast aan het Longobardische hof heeft geleefd; want de nieuwe
koning trad in het huwelijk met haar dochter Gundeberga. Zij stierf in 628, Ariwald in
636, en Gundeberga moest, evenals haar moeder, een anderen gemaal kiezen. Zij koos
Rotharis (Rotherik of Roderik), den hertog van Brescia—een keuze, die voor het
algemeen welzijn gunstiger bleek dan voor haar persoonlijk geluk, want haar gemaal
was, evenals haar eerste echtgenoot, Ariaan en zoo weinig verdraagzaam jegens haar
Katholieke neigingen, dat hij haar gedurende vijf jaren streng gevangen hield in zijn
paleis te Pavia, waaruit zij werd bevrijd door tusschenkomst van Clovis (Chlodwig II),
den Frankischen koning. Zij wijdde het overige van haar leven aan goede werken en
volgde Theodelinda’s voorbeeld door de basiliek van S. Giovanni9 te Pavia te
herbouwen, waar zij haar beide echtgenooten liet begraven.
Rotharis regeerde zestien jaren (636–52). Hij is voornamelijk beroemd als de groote
Longobardische wetgever, maar in de eerste zes jaren van zijn regeering onderscheidde
hij zich door het Longobardische gebied uit te breiden over Ligurië tot de Frankische
grens bij Marseille, terwijl hij Genua en kleinere steden, Levanto en Sestri, op de
Byzantijnen veroverde. In 642 bracht hij, volgens Paulus Diaconus, den Romeinen en
Ravennaten een zware nederlaag toe bij de rivier Panaro met een verlies van 8000 man.
Zonder twijfel moet men zijn stoutmoedigheid en geluk toeschrijven aan de volgende
gebeurtenissen, waardoor de Keizer van het Oosten, Heraclius, verhinderd werd zich
veel met Italië te bemoeien.
In de eerste jaren van zijn regeering was Heraclius opgeschrikt door het optreden van de
Perzen, die in 615 Jeruzalem hadden genomen, vanwaar zij het Kruis (of wat er van over
was) meenamen, en die zelfs een verbond met de Avaren van Hongarije hadden gesloten
en Constantinopel bedreigden, zoodat hij er over dacht de regeering van het Keizerrijk
naar Carthago te verplaatsen. Maar hij schijnt plotseling een merkwaardige kracht en
moed te hebben ontwikkeld en het gelukte hem eindelijk de Avaren en ook de Perzen te
verslaan en hij ontnam hun niet alleen alle gevangenen, maar ook het buitgemaakte
Kruis, dat hij in triomf naar Constantinopel bracht en daarna weder naar Jeruzalem.
Dit gebeurde in 628–629, juist toen een nieuwe geduchte macht in het oosten begon op
te komen; want in 629, zeven jaren na de Hegira (vlucht) werd Mekka genomen en de
Heilige Oorlog door den grooten Arabischen profeet afgekondigd. Mohammed zelf stond
slechts vier jaar aan het hoofd van zijn legers. Hij stierf in 632; maar zijn Kaliefen
breidden hun veroveringen zoo snel uit, dat tusschen 634 en 640 Damascus, Antiochië,
Jeruzalem, Mesopotamië en Egypte gevallen waren en de Saracenen, zooals de
muzelmannen door de Grieken en Romeinen genoemd werden, weldra Europa
bedreigden.
Het nieuwe gevaar, dat zoo plotseling niet alleen in het oosten maar ook in het zuiden
was opgekomen, dwong Heraclius aan middelen ter verdediging te denken, want het was
niet meer mogelijk den zetel van de regeering naar Afrika over te brengen. Een nauwere
staatkundige band tusschen alle deelen van het Rijk was zijn eenige hoop en hij begreep,
zooals ook andere Keizers reeds begrepen hadden, dat de eenige kans om staatkundige
eenheid te bereiken berustte op godsdienstige overeenstemming; en misschien heeft de
gelukkige hierarchie van de kaliefen zijn vertrouwen in den βασιλεὺς καὶ ἱερεὺς (koning
en priester), de leer van de oostelijke Keizers, versterkt.10 Hij trachtte derhalve de
katholieke en kettersche sekten in het oosten te verzoenen (de laatste waren meer
geneigd gemeene zaak te maken met den Islam, dan de Drieëenheid en de “dubbele
natuur” van Christus aan te nemen), maar zijn Ecthesis of Verklaring van het Geloof
werd in Italië met verontwaardiging verworpen en, zooals Zeno en Justinianus en vele
anderen, ondervond hij, dat elke poging om sekten met elkaar te verzoenen en
godsdienstige overeenstemming te brengen den toestand eer slechter dan beter maakte.
Daarop schijnt hij door een nerveuze moedeloosheid te zijn aangetast en stierf in 641.
Ondertusschen had de Longobardische koning zijn macht in Italië uitgebreid en zijn
beroemden Code opgesteld.
Rotharis’ Code of Edict werd bekrachtigd in een groote vergadering gehouden te Pavia
in 643. Autharis had geregeerd door mondeling overgeleverde wetten, maar dit is de
eerste barbaarsche code, die in Italië is geschreven. Het is een soort barbaarsch Latijn en
bestaat uit 388 paragrafen.11 In den Proloog, die historisch de meeste waarde heeft, daar
hij de namen en betrekkingen van de Longobardische koningen tot 640 ongeveer geeft,
vertelt Rotharis ons, dat het zijn plan was al de oude wetten van zijn volk te verzamelen
en te verbeteren, en het overtollige er van te schrappen (d’entro delle leggi trasse il
troppo e vano, zooals Dante’s Justinianus van zichzelf zegt). Ofschoon men hier en daar
den invloed van het Romeinsche recht kan herkennen, is het over het algemeen
Longobardisch van inhoud en vorm; maar het geeft een paar doorslaande bewijzen van
verlichting. Zoo zijn de oude faida of vendetta en het duel afgeschaft en ook het
verbranden van heksen. Doodstraf wordt zelden opgelegd en geldboeten komen in plaats
van persoonlijke wraak—een bepaling, die zelfs in de Romeinsche wet onbekend is. De
algemeene strekking van de wetten is gericht tegen de grootgrondbezitters evenals onder
de Gotische heerschappij en ten gunste van de arme en arbeidende klasse. In dit opzicht
steekt Rotharis’ wetgeving zeer gunstig af bij den gelijktijdigen Byzantijnschen Code,
die de latifundia en ambtelijke afpersingen toeliet.
Na den dood van Rotharis in 652 volgde een donkere en onbelangrijke periode van
zestig jaren. Zijn zoon en opvolger Rodwald wordt na een korte regeering gedood.
Daarna is Aribert, een neef van Theodelinda, gedurende acht jaar koning, en verdeelt het
koninkrijk onder zijn beide zonen, Bertharis en Godebert, die Milaan en Pavia tot hun
residenties kiezen. De broeders krijgen twist en de jongste roept de hulp in van den
machtigen hertog van Benevento, Grimwald, die te Pavia komt, doch Godebert doodt, in
plaats van hem te helpen. Bertharis vlucht naar de Avaren en Grimwald wordt te Pavia
gekroond (662), terwijl hij aldus voor den eersten en laatsten keer het noordelijk gebied
met het tot dusverre onafhankelijke hertogdom in het verre zuiden vereenigt onder een
Longobardischen koning12.
Maar dit hertogdom van Benevento, dat hij aan de zorg van zijn zoon Romwald had
overgelaten, werd juist op dat oogenblik gevaarlijk bedreigd door de Byzantijnen; en om
de oorzaak hiervan te begrijpen moeten wij weder naar Rome terug. Hier hadden de
voortdurende twisten over leerstellige spitsvondigheden zulk een hoogte bereikt, dat de
Keizer, Constans II (642–68), ten slotte den Exarch beval Paus Martinus naar
Constantinopel te sturen, daar hij weigerde te berusten in een keizerlijk edict, dat alle
verdere discussie over de “dubbele natuur” van Christus verbood, en zelfs een Concilie
had bijeengeroepen, dat het edict als sceleratissimum veroordeelde. Paus Martinus werd
door Constans smadelijk behandeld en eindelijk gedeporteerd naar de Krim, waar hij,
naar men zegt, van honger is gestorven. Zijn opvolgers evenwel kwamen tot een
schikking met den Keizer, die zeer verontrust werd door de veroveringen der Saracenen.
Deze ongeloovigen hadden zijn vloot bij de kust van Klein-Azië verslagen en
verwoestten nu Sicilië. Er werd dus een leger verzameld om dat eiland te verdedigen en
in 662 vertrok Constans aan het hoofd van zijn strijdkrachten van Constantinopel en
landde bij Otranto, in de meening dat het een gunstige gelegenheid was om de
Longobarden van Zuid-Italië te overvallen; daarop belegerde hij Grimwald’s zoon in
Benevento. Maar Grimwald kwam hem snel ontzetten en versloeg de 20.000
Byzantijnen en Romeinen. Aldus redde hij zijn zuidelijke bezittingen13.
Grimwald sterft kort daarna en Bertharis komt terug en wordt tot koning uitgeroepen.
Van zijn regeering (671–88) weten wij zeer weinig. Zijn zoon Cunibert wordt door een
usurpator van den troon gestooten, maar later verslaat hij dien in een grooten slag bij de
Adda en regeert twaalf jaar (688–700). Wanneer Cunibert sterft, volgt zijn zoon hem op,
want het erfrecht schijnt nu erkend te zijn, maar hij wordt, omdat hij minderjarig is,
onder het regentschap van een edelman, Ansprand, gesteld. Weldra daagt er een andere
pretendent op, Ragimbert, die zijn eigen zoon, Aribert II op den troon plaatst. Nu moet
Ansprand vluchten naar Beieren, het vaderland van Theodelinda. Toen de usurpator
Aribert hoorde, dat hij plannen maakte om terug te keeren, nam hij zijn vrouw en
kinderen (behalve Liutprand, die ontsnapte en bij zijn vader kwam) gevangen, en
verminkte hen op afschuwelijke manier, door hun de oogen en de tong te laten uitrukken.
Maar de dag der wrake brak aan. Ansprand daalde van de Alpen af met een Beiersch
leger en velen, die den bloeddorstigen en vromen14 tyran haatten, voegden zich bij hem.
Aribert trachtte te vluchten, maar verdronk, toen hij met een zware tasch met geld de
Ticino wilde overzwemmen.
26. S. Maria Maggiore, Toscanella.
Daarop wordt Ansprand tot koning geproclameerd, maar hij sterft in hetzelfde jaar (712)
en laat zijn zoon Liutprand als opvolger achter. De lange regeering van Liutprand (712–
744) is misschien merkwaardiger dan die van eenig ander Longobardisch koning,
gedeeltelijk wegens gebeurtenissen, die niet rechtstreeks in verband stonden met het
Longobardische hof, maar van gewicht waren voor Italië.
Deze gebeurtenissen, die van grooten invloed waren op de verhouding van het oostelijk
keizerrijk tot het Byzantijnsche Italië (als men dat zoo noemen mag), hingen ten nauwste
samen met godsdienstige, of liever kerkelijke vraagstukken. Wij moeten daar een
oogenblik aandacht voor vragen.
Reeds hebben wij gezien, dat de eene Keizer na den andere zich opwierp als een soort
van tegen-paus, die Concilies bijeenriep, die niet alleen verzoenende Henotica en
Ectheses afkondigde, maar ook uitdagende definities van de Drieëenheid en de Natuur
van Christus; wij hebben gezien, hoe zij de hoogepriesters van Rome afzetten, gevangen
namen, smadelijk en wreed behandelden. Doch nu werd de vijandigheid zoo hevig, dat
zij moest eindigen in een volslagen breuk tusschen het Oosten en het Westen. De pausen,
met geestdrift ondersteund door de Italianen, begonnen zich steeds minder te
bekommeren om de eischen van de Keizers en dit verergerde de verhouding tusschen het
Byzantijnsche hof en zijn Italiaansche provincies. In 691 deed Keizer Justinianus II een
Concilie in zijn paleis bijeenkomen. Paus Sergius weigerde de besluiten van dit Concilie
te onderteekenen. De Keizer zond toen Zacharias, zijn Protospatharius (hoofdman van
zijn lijfwacht) naar Rome om den Paus gevangen te nemen; maar de troepen te Ravenna
sloegen aan het muiten en marcheerden naar Rome; de Romeinen stonden op om hun
Paus te verdedigen en de Protospatharius moest zijn leven redden door zich in de
slaapkamer van den Paus, onder diens bed, te verbergen, totdat de woede van het volk in
zoo verre was bedaard, dat hij de stad kon verlaten. Justinianus wreekte zich later over
deze beleediging door een woesten aanval op Ravenna. De stad werd geplunderd, de
aartsbisschop blind gemaakt15 en naar de Krim verbannen.
Maar de opstand breidde zich uit en niettegenstaande een tijdelijke verzoening tusschen
den Keizer en den Paus (Constantinus I) en een feestelijke ontmoeting van deze twee in
Klein-Azië, hadden er toch ernstige onlusten te Rome plaats, waar de Exarch zelf
gedood werd; en de meeste steden van het Exarchaat maakten gemeene zaak met
Ravenna in een opstand tegen het oostenlijke Keizerrijk; dit was de eerste confederatie
van steden in de geschiedenis van middeleeuwsch Italië. Justinianus was reeds voor
eenige jaren (695–705) van zijn troon verjaagd en zijn wreedheden verwekten nu een
tweeden opstand. Hij werd vermoord door den usurpator Bardanes, of Philippicus, die
Ravenna en de Romeinen voor zich trachtte te winnen door den blinden aartsbisschop
terug te sturen en het hoofd van Justinianus over te zenden, waar allen zooals men vertelt
“met gretige verbazing naar keken.” Doch de gunst, die hij hiermede verwierf, was van
korten duur. Zijn kettersche neigingen en het zich aanmatigen van priesterlijke functies
veroorzaakten wederom de heftigste vijandelijkheden in Rome. De beeltenis van
Philippicus werd uit de St. Pieter en uit andere kerken verbannen; zijn naam werd niet
meer bij de mis gehoord; munten met zijn beeldenaar en onderschrift werden geweigerd.
Tot zulk een hevige uitbarsting kwam het, dat Philippicus werd onttroond en blind
gemaakt, en ook zijn twee opvolgers werden afgezet en gedwongen de tonsuur aan te
nemen. Daarna, in 717, beklom Leo III den troon, een dapper soldaat van oostersche
afkomst, daardoor bekend als Leo de Isauriër en nog beter bekend als Leo de Iconoclast.
Het volgende bedrijf van ons drama wordt voornamelijk gespeeld door Liutprand,
Keizer Leo en (tot 731) Paus Gregorius den Tweede, den krachtigen tegenstander van
den iconoclastischen keizer. De belangrijkste gebeurtenissen zijn de staatkundige en
Welcome to our website – the perfect destination for book lovers and
knowledge seekers. We believe that every book holds a new world,
offering opportunities for learning, discovery, and personal growth.
That’s why we are dedicated to bringing you a diverse collection of
books, ranging from classic literature and specialized publications to
self-development guides and children's books.
ebookbell.com