Adding AJAX to your pages
Update parts of the page without full reloads using Wicket's built-in AJAX support
TutorialBuilding your first form
Collect user input with Wicket forms, models, validation, and feedback messages
TutorialGetting started with Wicket
Create your first Wicket application in 10 minutes
TutorialPage layouts with markup inheritance
Build reusable page layouts using Wicket's markup inheritance
TutorialTesting Wicket pages
Write tests for your Wicket pages and forms with WicketTester
How-To formsHow to build stateless forms
Use StatelessForm to avoid session dependency and page expiration issues
How-To formsHow to convert text input to numbers, dates, and custom types
Learn how to control the conversion from raw string input to typed Java objects like numbers, dates, and enums
How-To formsHow to handle file uploads
Upload single and multiple files using FileUploadField with size limits
How-To formsHow to handle multiple selections
Use ListMultipleChoice and Palette components for multi-select form inputs
How-To formsHow to nest forms
Use nested forms to split complex forms into reusable sub-forms
How-To formsHow to use checkboxes and radio buttons
Work with CheckBox, CheckBoxMultipleChoice, and RadioChoice components
How-To formsHow to use multiple submit buttons
Add multiple submit buttons to a form using Button and SubmitLink components
How-To formsHow to validate form input and show error messages
Learn how to add validation rules to form fields and display feedback messages when input is invalid
How-To formsHow to validate forms with annotations like @NotNull
Learn how to use Jakarta Bean Validation (JSR 303) annotations on your domain objects and have Wicket enforce them automatically
How-To ajaxBuilt-in AJAX components
Overview of AJAX-enabled components shipped with Wicket including links, buttons, editable labels, and tree repeaters
How-To ajaxHow to make any component respond to browser events via AJAX
Learn how to attach built-in AJAX behaviors to existing components so they react to clicks, changes, and other events
How-To ajaxHow to refresh parts of the page without reloading
Learn how to use AjaxRequestTarget to update individual components and run JavaScript without a full page reload
How-To ajaxHow to run JavaScript before, during, or after AJAX calls
Learn how to customize AJAX request attributes and attach client-side listeners for loading indicators, confirmations, and error handling
How-To ajaxHow to use AJAX on stateless pages
Make AJAX components and behaviors work on stateless Wicket pages by overriding getStatelessHint
How-To repeatersHow to add paging to large lists
Learn how to display large datasets one page at a time using DataView and a paging navigator
How-To repeatersHow to display a list with nested components
Learn how to use ListView to render a list of objects with rich markup containing links, labels, and other components
How-To repeatersHow to keep form state when repeating items
Learn how to control which child components are recreated or reused when a repeater re-renders
How-To repeatersHow to render a dynamic number of items
Learn how to repeat a simple HTML fragment once per item using RepeatingView
How-To html-controlHow to add or change HTML attributes from Java
Learn how to use AttributeModifier to dynamically set CSS classes, styles, data attributes, and other HTML attributes from your Java code
How-To html-controlHow to automatically hide labels when their content is invisible
Learn how to use wicket:enclosure to automatically hide surrounding markup when a component is not visible
How-To html-controlHow to control component visibility
Learn how to show, hide, and disable components programmatically and understand how visibility affects the component hierarchy
How-To html-controlHow to create reusable page wrappers
Learn how to use Border to wrap page content with reusable decorating markup like headers, footers, and sidebars
How-To html-controlHow to switch between different HTML blocks at runtime
Learn how to use Fragments to conditionally display different sections of markup without creating separate panel classes
How-To resourcesHow to add CSS and JavaScript to your pages
Learn how to include stylesheets and scripts in the page header from your components and behaviors
How-To resourcesHow to control CSS and JavaScript load order
Learn how to declare dependencies between stylesheets and scripts so they load in the right order
How-To resourcesHow to generate dynamic content like PDFs or JSON
Learn how to create custom resources that generate files on the fly, such as RSS feeds, CSV exports, or PDF documents
How-To resourcesHow to serve CSS, JS, and images from your Java packages
Learn how to bundle static files alongside your components so they stay self-contained and reusable
How-To resourcesHow to serve files at custom URLs
Learn how to mount resources at clean, predictable URLs instead of using auto-generated paths
How-To i18nHow to control where Wicket looks for translations
Learn how the resource bundle lookup algorithm works and how to customize where translation files are found
How-To i18nHow to display localized text in components
Learn how to use ResourceModel and StringResourceModel to show translated, parameterized text in your UI
How-To i18nHow to make your application multilingual
Learn how to set the user's locale and provide translated strings through properties files
How-To securityHow to configure Content Security Policy
Set up Content Security Policy headers in Wicket to prevent XSS attacks
How-To securityHow to enforce HTTPS
Configure Wicket to require HTTPS connections for secure pages
How-To securityHow to implement login
Implement authentication and login pages in Apache Wicket
How-To securityHow to prevent CSRF attacks
Protect your Wicket application against cross-site request forgery
How-To securityHow to restrict access by role
Set up role-based authorization to restrict page access in Wicket
How-To securityHow to restrict which file types Wicket serves
Learn how to configure package resource guards so that only safe file extensions are accessible from the browser
How-To urlsHow to create bookmarkable links
Create bookmarkable page links that users can share and bookmark
How-To urlsHow to mount pages with clean URLs
Mount Wicket pages at custom URL paths for clean, SEO-friendly URLs
How-To urlsHow to use page parameters
Pass and retrieve page parameters in Wicket pages
How-To testingHow to test forms
Test form submission and validation with WicketTester
How-To testingHow to test markup with TagTester
Use TagTester to verify generated HTML markup in Wicket tests
How-To testingHow to test pages with WicketTester
Use WicketTester to unit test your Wicket pages and components
How-To integrationHow to call JavaScript from Java and vice versa
Learn how to wrap a JavaScript widget in a Wicket component and communicate between client and server
How-To integrationHow to integrate with Spring
Integrate Apache Wicket with the Spring Framework for dependency injection
How-To integrationHow to use WebSockets
Add real-time WebSocket communication to your Wicket application
ReferenceComponent lifecycle — stages and hook methods
The stages a Wicket component goes through from creation to removal, and which methods to override at each stage
ReferenceConfiguration
Configuring your Wicket application settings and deployment options
ReferenceGlossary — Wicket terminology explained
Plain-English explanations of Wicket terms like Models, Behaviors, Resources, and Panels
ReferenceMaven setup
Setting up a Wicket project with Apache Maven
ReferenceModels — connecting components to data
How Wicket models work as the bridge between your components and their underlying data
ReferenceRequest processing — from HTTP to rendered page
How an HTTP request travels through Wicket's request cycle, filters, and mappers to produce a response
ReferenceWicket modules and dependencies
Overview of Wicket's module structure and their dependencies
ExplanationBest practices
Recommended patterns and practices for building Wicket applications
ExplanationMarkup inheritance — sharing layouts across pages
How to define a base page layout once and let child pages fill in their own content areas
ExplanationPage storage internals
How Wicket stores and manages page instances internally
ExplanationStateful vs stateless pages — when sessions matter
Why some pages store state in the session and others do not, and how that affects performance, bookmarkability, and scalability
ExplanationWhy Wicket
Understanding the benefits and philosophy behind Apache Wicket