include::../shared-doc/attributes.adoc[]

= servlet-filterlistener: How to Write Servlet Filters and Listeners
:author: Jonathan Fuerth
:level: Intermediate
:technologies: Servlet Filter, Servlet Listener

[abstract]
The `servlet-filterlistener` quickstart demonstrates how to use Servlet filters and listeners in an application.

:standalone-server-type: default
:archiveType: war

//*************************************************
// Shared CD and Product Release content
//*************************************************

== What is it?

The `servlet-filterlistener` quickstart demonstrates how to use Servlet filters and listeners in {productNameFull}.

This example contains the following classes:

* `FilterExampleServlet`: A simple servlet that prints a form that contains an input field and a _Send_ button.
* `VowelRemoverFilter`: A servlet filter that removes the vowels from the text entered in the form.
* `ParameterDumpingRequestListener`: A simple servlet request listener that creates a map of the original HTTP request parameter values before the filter is applied.

//*************************************************
// Product Release content only
//*************************************************

ifndef::EAPCDRelease[]

// System Requirements
include::../shared-doc/system-requirements.adoc[leveloffset=+1]
// Use of {jbossHomeName}
include::../shared-doc/use-of-jboss-home-name.adoc[leveloffset=+1]
// Start the {productName} Standalone Server
include::../shared-doc/start-the-standalone-server.adoc[leveloffset=+1]
// Build and Deploy the Quickstart
include::../shared-doc/build-and-deploy-the-quickstart.adoc[leveloffset=+1]

== Access the Application

The application will be running at the following URL http://localhost:8080/{artifactId}/.

You are presented with a form containing an input field and a _Send_ button. To test the quickstart:

. Enter some text in the field, for example:
+
[source,options="nowrap"]
----
This is only a test!
----

. Click _Send_.
. The servlet filter intercepts and removes the vowels from the text entered in the form and displays:
+
[source,options="nowrap"]
----
You Typed: Ths s nly tst!
----

. The server console displays the following log messages.
+
The following messages appear in the log when you access the application URL. This is because the ParameterDumpingRequestListener, which is a ServletRequestListener, and the VowelRemoverFilter both map to the application context and print logs for every request. Note that the VowelRemoveFilter contains logic to handle empty input field arguments.
+
[source,options="nowrap"]
----
INFO  [io.undertow.servlet] (default task-46) ParameterDumpingRequestListener: request has been initialized. It has 0 parameters:
INFO  [io.undertow.servlet] (default task-46) VowelRemoverFilter initialized
INFO  [io.undertow.servlet] (default task-46) VowelRemoverFilter invoking filter chain...
INFO  [io.undertow.servlet] (default task-46) VowelRemoverFilter done filtering request
INFO  [io.undertow.servlet] (default task-46) ParameterDumpingRequestListener: request has been destroyed
INFO  [io.undertow.servlet] (default task-48) ParameterDumpingRequestListener: request has been initialized. It has 0 parameters:
INFO  [io.undertow.servlet] (default task-48) VowelRemoverFilter invoking filter chain...
INFO  [io.undertow.servlet] (default task-48) VowelRemoverFilter done filtering request
INFO  [io.undertow.servlet] (default task-48) ParameterDumpingRequestListener: request has been destroyed
----
+
The following messages appear in the log when you type "This is only a test!" in the input field and click `Send`.
+
[source,options="nowrap"]
----
INFO  [io.undertow.servlet] (default task-50) ParameterDumpingRequestListener: request has been initialized. It has 1 parameters:
INFO  [io.undertow.servlet] (default task-50)   userInput=This is only a test!
INFO  [io.undertow.servlet] (default task-50) VowelRemoverFilter invoking filter chain...
INFO  [io.undertow.servlet] (default task-50) VowelRemoverFilter done filtering request
INFO  [io.undertow.servlet] (default task-50) ParameterDumpingRequestListener: request has been destroyed
----

// Undeploy the Quickstart
include::../shared-doc/undeploy-the-quickstart.adoc[leveloffset=+1]
// Run the Quickstart in Red Hat JBoss Developer Studio or Eclipse
include::../shared-doc/run-the-quickstart-in-jboss-developer-studio.adoc[leveloffset=+1]
// Debug the Application
include::../shared-doc/debug-the-application.adoc[leveloffset=+1]

endif::[]

//*************************************************
// CD Release content only
//*************************************************

ifdef::EAPCDRelease[]

// Getting Started with OpenShift
include::../shared-doc/cd-openshift-getting-started.adoc[leveloffset=+1]
//Prepare OpenShift for Quickstart Deployment
include::../shared-doc/cd-create-project.adoc[leveloffset=+1]
// Import the Latest {xpaasproduct-shortname} Image Streams and Templates
include::../shared-doc/cd-import-imagestreams-templates.adoc[leveloffset=+1]
// Deploy the {ProductShortName} Source-to-Image (S2I) Quickstart to OpenShift
include::../shared-doc/cd-deploy-project.adoc[leveloffset=+1]
// OpenShift Post Deployment Tasks: This is not currently needed.
// include::../shared-doc/cd-post-deployment-tasks.adoc[leveloffset=+1]

endif::[]

