Validator.nu Servlet Overview
Validator.nu has its own
main() method in a class called
nu.validator.servlet.Main. This makes makes debugging and isolated deployment an order of magnitude easier than doing XML situps to make application server load the right bits.
main() method does the following thing:
- Initializes log4j
VerifierServletTransactionto trigger its static initializer early.
- Instantiates Jetty.
- Sets up an HTTP or AJP13 connector.
- Builds a servlet filter chain.
- Adds the servlet to the server.
- Starts the server.
If you want to run the servlet in a larger application server, the only mandatory step you need to take care of before the servlet loads is initializing log4j. The filter chain is optional (but without it some non-core features do not work; see below).
Validator.nu is encapsulated in one servlet:
nu.validator.servlet.VerifierServlet. This servlet handles the generic facet, the HTML5 facet and the parsetree facet and does URI dispatching and decides which controller class to instantiate.
Servlets are by default required to be re-entrant, so for programming convenience the servlet instantiates controller object whose lifetime is limited to one HTTP request.
Some non-core features are implemented as servlet filters. These features are inbound and outbound gzip compression, support for HTML form-based file uploads and textarea-based input and limiting the input data size before performing decompression and before performing form POST decoding.
The filter from outer (closer to container) to inner (closer to the servlet) are:
Implements response compression.
This filter throws a
nu.validator.io.StreamBoundExceptionif the request entity body is too large. This filter throttles the input for
nu.validator.servlet.MultipartFormDataFilter. If those filters are not in use, this one isn’t needed, either.
Implements request decompression.
Implements support for HTML form-based file upload and textarea input by exposing these to the servet as if the document were POSTed straight as the entity body.
The bulk of the Validator.nu UI controller and random glue that holds it all together is in
nu.validator.servlet.VerifierServletTransaction. This is probably the ugliest class in Validator.nu; UI-related code tends to be uglier than back end code and the class has grown organically over time.
Most of the initialization of Validator.nu is performed in the static initializer of this class. The default
Maintriggers early initialization by instantiating this class once before starting the HTTP server.
This is a subclass of
VerifierServletTransactionthat tweaks the overall behavior just enough to implement the HTML5 facet of Validator.nu.
This is the controller for parsetree.validator.nu.