private support for your internal/customer projects ... custom extensions and distributions ... versioned snapshots for indefinite support ... scalability guidance for your apps and Ajax/Comet projects ... development services for sponsored feature development
General items related to the architecture of jetty and how it deals with certain design decisions.
The Jetty Server is the plumbing between a collection of Connectors that accept HTTP connections and a collection of Handlers that service requests from the connections and produce responses, with threads from a thread pool doing the work.
While the Jetty request/responses are derived from the Servlet API, the full features of the Servlet API are only available if you configure the appropriate handlers. For example, the session API on the request is inactive unless the request has been passed to a Session Handler. The concept of a servlet itself is implemented by a Servlet Handler. If servlets are not required, there is very little overhead in the use of the servlet request/response APIs. Thus you can build a Jetty server using only connectors and handlers, without using servlets.
The job of configuring Jetty is building a network of connectors and handlers and providing their individual configurations. As Jetty components are simply Plain Old Java Objects (POJOs), you can accomplish this assembly and configuration of components by a variety of techniques:
The implementation of Jetty follows some fairly standard patterns.
Most abstract concepts such as Connector, Handler and Buffer are captured by interfaces.
Generic handling for those interfaces is then provided in an Abstract implementation such as
AbstractHandler and ` AbstractBuffer`.
The JSR77 inspired life cycle of most Jetty components is represented by the
LifeCycle interface and the
AbstractLifeCycle implementation used as the base of many Jetty components.
Jetty provides its own IO Buffering abstract over String, byte arrays and NIO buffers. This allows for greater portability of Jetty as well as hiding some of the complexity of the NIO layer and its advanced features.
This diagram is a little out of date, as a Connection interface has been extracted out of ` HttpConnector` to allow support for the AJP protocol.
The connectors represent the protocol handlers that accept connections, parse requests and generate responses. The different types of connectors available are based on the protocols, scheduling model, and IO APIs used:
SocketConnector–for few busy connections or when NIO is not available
BlockingChannelConnector–for few busy connections when NIO is available
SelectChannelConnector–for many mostly idle connections or asynchronous handling of Ajax requests
SslSocketConnector–SSL without NIO
SslSelectChannelConnector–SSL with non blocking NIO support
AJPConnector–AJP protocol support for connections from apache mod_jk or mod_proxy_ajp
The Handler is the component that deals with received requests. The core API of a handler is the handle method:
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
An implementation of this method can handle the request, pass the request onto another handler (or servlet) or it might modify and/or wrap the request and then pass it on. This gives three styles of Handler:
You can combine handlers to handle different aspects of a request by nesting them, calling them in sequence, or by combining the two models.
Handlers called in sequence perform actions that do not depend on the next invocation, nor on the handler order. They handle a request and generate the response without interacting with other handlers. The main class for this model is Handler Collection.
Nested handlers are called according to a before/invokeNext/after pattern. The main class for nested handlers is Handler Wrapper. Nested handlers are much more common than those called in sequence.
See also Writing Custom Handlers.
The ServletHandler is a Handler that generates content by passing the request to any configured filters and then to a Servlet mapped by a URI pattern.
A ServletHandler is normally deployed within the scope of a servlet Context, which is a ContextHandler that provides convenience methods for mapping URIs to servlets.
Filters and Servlets can also use a RequestDispatcher to reroute a request to another context or another servlet in the current context.
Contexts are handlers that group other handlers below a particular URI context path or a virtual host. Typically a context can have:
Contexts implementations include:
A web application context combines handlers for security, session and servlets in a single unit that you can configure with a
A WebApp Context is a derivation of the servlet Context that supports the standardized layout of a web application and configuration of session, security, listeners, filter, servlets, and JSP via a
web.xml descriptor normally found in the
WEB-INF directory of a webapplication.
Essentially the WebAppContext is a convenience class that assists the construction and configuration of other handlers to achieve a standard web application configuration.
Configuration is actually done by pluggable implementations of the Configuration class and the prime among these is