JK was develop to overcome many limitations of its ancestor, mod_jserv.

mod_jserv was too complex and because it was ported from Apache/JServ,
it brought with it lots of JServ specific bits that aren't needed by Apache.

Where mod_jserv supported only Apache webservers on Unix OS,
JK supports much more web servers and operating systems through
via a compatibility layer named the JK library.
The layered approach provided by the JK library makes it easier to
support many different webservers and OS.

JK offer better support for SSL, that's was a problem with mod_jserv which couldn't
reliably identify whether a request was made via HTTP or HTTPS.

JK can, using the newer Ajpv13 protocol which relay many SSL informations required by servlet 2.2 and 2.3 specs.

JK offers a lot of different and flexible communications between a Web Server
and the Tomcat Servlet Engine and could be used today with all of the ASF Tomcat Engines,
3.2.x, 3.3.x, 4.0.x, 4.1.x and 5.x

What's the difference between JK and JK2?

JK2 is a refactoring of JK and is much more powerfull.

Even if it works with Apache 1.3, JK2 has been developed with Apache 2.0 in mind,
and is better suited for multi-threaded servers like IIS, NES/iPlanet. It can also
be embeded in other applications and used from java.

JK2 improves the modularity and has a better separation between protocol and physical layer.
As such JK2 support fast unix-socket, and could be extended to support others communications
channels. It is better suited for JNI and may use (in a future version) JDK 1.4 NIO.

There is additional support for monitoring, similar with JMX in java. A module similar
with mod_status is provided, and additional adapters can be used to interface and
provide status and runtime configuration. .

The configuration has been changed to follow the component models. Multiple configuration
sources can be supported ( in additon to file ) providing better integration with
the embeding application. The config layer uses the management layer APIs and it can
support persistence for changes done via runtime configuration.

Another feature is the JNI mode. Jk2 can be used as a JNI library and provide access to
native features to java. For example it provides access to shared memory ( used for
config and monitoring in a multiprocess environment ), unix domain sockets. It can
also provide access to signals, chuid, win registry. All using the same communication
mechansim, and supporting both in-process and out-of process modes.

Are there alternative ways to connect Apache and Tomcat?

Tomcat's AJP stack and httpd-2.1 AJP proxy that is an addition to the mod_proxy of http. It is developped in httpd-2.1 and integrated in it.
(See AJP proxy).

Tomcat's internal HTTP stack and mod_proxy which is not that bad, but slow,
well, of course Tomcat didn't have 10/11 years of C routine optimization like
the Apache Web Server, but it's quite good. The only disadvantage is that it
looks pretty ridiculous to parse an HTTP request to generate it again
(exactly the same), and to parse again the response to send it back unchanged...

mod_webapp which is very easy to configure, has a well defined protocol named
WARP but it is no longer developped.
BTW: It would be possible to implement the WARP protocol in
JK2 ;-))

Additional References

Please note that we maintain a list of references to external documentation
on connector usage and configuration in various environments as part of
the Tomcat wiki Useful Links page.