blob: 106d543db6e1b3f5d8a8130a4c894cdbbbf2a5e4 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="description" content="A short introduction to the Wicket web framework
in NetBeans IDE">
<meta name="keywords" content="NetBeans, IDE, integrated development environment,
Wicket, wereplacedb frameworks, open source">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<script type="text/javascript" src="../../../images_www/js/window_opener.js"></script>
<title>Introduction to the Wicket Web Framework - NetBeans IDE Tutorial</title>
</head>
<body>
<h1>Introduction to the Wicket Web Framework</h1>
<p>This document takes you through the basics of creating reusable components
and assembling them into a web application. Each component consists of
a Java class and an HTML file. The framework that allows you to develop
your application in this way is called Wicket. In addition to its
component-based approach, a distinguishing feature of Wicket is the absence
of XML configuration files. Instead of an XML configuration file, you
use a Java class for application-wide settings, such as the identification
of a home page. <p>Each widget in your web application is created in a Java class
and rendered in an HTML page. The Java class and HTML page must have
the same name and exist in the same source structure. They are linked
to each other via a Wicket identifier. You will be shown how the IDE
supports the development of Wicket applications so that
you can quickly and efficiently create reusable components that can
give your web application a consistent look and feel without
very much work on your part.</p>
<p><strong>Contents</strong></p>
<img src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" class="stamp" alt="Content on this page applies to NetBeans IDE 7.2, 7.3, 7.4 and 8.0" title="Content on this page applies to the NetBeans IDE 7.2, 7.3, 7.4 and 8.0" >
<ul class="toc">
<li><a href="#setup">Setting Up the Environment</a>
<ul>
<li><a href="#creating">Creating the Source Structure of a Wicket Application</a>
<ul>
<li><a href="#create-1">Scenario 1: Creating an Ant Based Wicket Application from Scratch</a></li>
<li><a href="#create-2">Scenario 2: Creating a Maven Based Wicket Application from Scratch</a></li>
<li><a href="#create-3">Scenario 3: Creating a Maven Based Wicket Application from Archetype</a></li>
<li><a href="#create-4">Scenario 4: Adding Wicket Support to an Existing Application</a></li>
</ul>
</li>
<li><a href="#libraries">Providing Support for Alternative Versions of Wicket</a></li>
<li><a href="#examining">Examining the Source Structure of the Generated Wicket Application</a></li>
</ul>
</li>
<li><a href="#features">Using Wicket Features</a>
<ul>
<li><a href="#widget">Adding a Widget</a>
<li><a href="#component">Adding a Reusable Component</a></li>
<li><a href="#ajax">Adding AJAX Features</a></li>
</ul>
</li>
<li><a href="#next">Next Steps</a></li>
<li><a href="#seeAlso">See Also</a></li>
</ul>
<p><strong>To follow this tutorial, you need the following software and resources.</strong></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">7.2, 7.3, 7.4, 8.0, Java EE</td>
</tr>
<tr>
<td class="tbltd1">Java Development Kit (JDK)</td>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">version 7</a> or
above</td>
</tr>
<tr>
<td class="tbltd1">Wicket plugin for NetBeans IDE</td>
<td class="tbltd1"><a href="http://plugins.netbeans.org/plugin/3586/wicket-support">NetBeans Wicket plugin page</a></td>
</tr>
<tr>
<td class="tbltd1">GlassFish Server Open Source Edition
<br><em class="indent margin-around">or</em>
<br>Tomcat servlet container</td>
<td class="tbltd1">3.1.x or above
<br><em class="margin-around indent">&nbsp;</em>
<br>version 7.x or above</td>
</tr>
</tbody>
</table>
<p><strong class="notes">Notes:</strong></p>
<ul>
<li>The Wicket support plugin for NetBeans consists of the following modules:
<ul>
<li><b>org-netbeans-modules-web-wicket.nbm.</b>
Provides the Wicket-specific functionality that is
used in this tutorial.</li>
<li><b>org-netbeans-modules-wicket-templates.nbm.</b>
Provides Wicket file-level templates for creating typical
Wicket artifacts, such as pages
and panels.</li>
<li><b>org-netbeans-modules-wicket-library.nbm.</b>
Provides the Wicket JARs, installs them in the IDE's Library Manager.
Therefore, you do not need to download the Wicket distribution from
the Wicket site, because the plugin provides everything you need.</li>
</ul></li>
<li>To install the Wicket support plugin into the IDE, go to the Plugin Manager
(Tools &gt; Plugins from the main menu) and install the plugin under the
Downloaded tab. For more detailed instructions on how to install a framework
plugin into the IDE, see: <a href="framework-adding-support.html">Adding
Support For A Web Framework</a>.</li>
<li>
For more information on Wicket, see <a href="http://wicket.sourceforge.net/">http://wicket.sourceforge.net/</a>.
For the development page for support for Wicket in NetBeans IDE, see
<a href="http://java.net/projects/NbWicketSupport">http://java.net/projects/NbWicketSupport</a>.
If you are familiar with Wicket, you are welcome to contribute code to the Wicket
plugin for NetBeans IDE.</li>
</ul>
<a name="setup"></a>
<h2>Setting Up the Environment</h2>
<p>Before you start writing your Wicket application, you have to make
sure you have all of the necessary software and that your project is set up
correctly. Once you have installed the Wicket support plugin for NetBeans IDE
as described above, you will have a wizard that sets up all the basic files
needed for a Wicket application.</p>
<div class="indent">
<a name="creating"></a>
<h3>Creating the Source Structure of a Wicket Application</h3>
<p>The source structure of our application must include the Wicket JAR files,
the registration of the Wicket servlet in the <tt>web.xml</tt> file, as
well as some standard artifacts such as the application class and a home page.
Since we are using an IDE, we shouldn't need to create all these files by hand.
Instead, we have wizards to do the work for us.</p>
<p>Depending on your needs, choose one of the appropriate scenarios below:</p>
<ul>
<li><a href="#create-1">Scenario 1: Creating an Ant Based Wicket Application from Scratch</a></li>
<li><a href="#create-2">Scenario 2: Creating a Maven Based Wicket Application from Scratch</a></li>
<li><a href="#create-3">Scenario 3: Creating a Maven Based Wicket Application from Archetype</a></li>
<li><a href="#create-4">Scenario 4: Adding Wicket Support to an Existing Application</a></li>
</ul>
<div class="indent">
<h4><a name="create-1"></a>Scenario 1: Creating an Ant Based Wicket Application from Scratch</h4>
<p>When creating a new web application in the IDE, the final
panel of the Web Application wizard will be very useful in the context of
our Wicket application.</p>
<ol>
<li>Choose File &gt; New Project. Under Categories, select Web. Under
Projects, select Web Application. Click Next.</li>
<li>In the Name and Location panel, type <tt>MyFirstWicketApp</tt> in Project Name.
Change the
Project Location to any directory on your computer. Click Next.
<li>Leave all the settings unchanged. Or, if you like, you can change them.
Wicket supports any version of Java EE. A Wicket application can be deployed
to any server. Click Next.
<li><p>In the Frameworks panel, choose Wicket, as shown here:</p>
<p><p class="align-left"><img src="https://blogs.oracle.com/geertjan_images/resource/wicket-160-nb.png" alt="frameworks 1">
<p class="notes"><b>Note:</b> Depending on the modules installed into the IDE, you
may see more or less items in the Frameworks list shown in the screenshot above.
<p>In the panel shown above,
leave all the defaults unchanged. The fields in the panel above provide the following:
<p><ul>
<li><b>Wicket Filter Name.</b> Shows the name of the filter that will be defined in the <tt>web.xml</tt> file.
<li><b>Wicket URL Pattern.</b> Adds the relative URL pattern to the <tt>web.xml</tt> file.
<li><b>Wicket Application Class.</b> Specifies name of the class where the application-wide
settings, such as the home page, are set.
<li><b>Wicket Home Page.</b> Specifies the name of the home page, which will consist
of a file called <tt>xxx.java</tt> and <tt>xxx.html</tt>.
<li><b>Main Package.</b> The Java package in which all the generated artifacts will be
put by the IDE.
<li><b>Version.</b> The Wicket version. Any library in the
Library Manager with a name starting with "Wicket" will
be listed in the Version drop-down above. By default, the
only version listed is 1.6.0 because that is the version
provided by the plugin.
</ul>
<li>Click Finish.
</ol>
<p>The IDE creates the <tt>MyFirstWicketApp </tt>
project. The project contains all of your sources and
project metadata, such as the project's Ant build script. The project
opens in the IDE. You can view its logical structure in the Projects window (Ctrl-1):
<p><p class="align-left"><img src="https://blogs.oracle.com/geertjan_images/resource/wicket-160-nb-2.png" alt="Initial Projects window.">
<h4><a name="create-2"></a>Scenario 2: Creating a Maven Based Wicket Application from Scratch</h4>
<p>When you already have an Ant based application, the IDE can
help you add Wicket support.</p>
<ol>
<li>Choose File &gt; New Project. Under Categories, select Maven. Under
Projects, select Web Application.
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-1.png" alt="HTML side of hyperlink.">
<p>Click Next.</p>
</li>
<li>In the Name and Location panel, type <tt>MyFirstWicketApp</tt> in Project Name.
Change the
Project Location and the default Maven settings as required by your needs.
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-3.png" alt="HTML side of hyperlink.">
<p>Click Next.</p>
</li>
<li>Choose the appropriate server for your needs, as well as "Java EE 6 Web" for the Java EE Version setting.
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-4.png" alt="HTML side of hyperlink.">
<p>Click Finish. The IDE creates the source structure shown below:</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-5.png" alt="HTML side of hyperlink.">
</li>
<li><p>Because we have added support for Java EE 6, no <tt>web.xml</tt> file is created in
the previous step. However, Wicket requires the Wicket application filter to be
registered in the <tt>web.xml</tt> file. Therefore, before continuining, we add
a new <tt>web.xml</tt> file in the application.</p>
<p>Right-click the application, choose New &gt; Other, followed by
Web &gt; Standard Deployment Descriptor (web.xml). Click Next and then click Finish.</p>
</li>
<li><p>Now we are ready to add Wicket support to the application.
Right-click the project node and choose Properties. In the Project Properties dialog,
select Frameworks, and click Wicket. Use the descriptions in the previous sections
to fill out the details in the Wicket Configuration part of the dialog. Click OK.</p>
<p>The IDE creates all the Wicket files needed to get started:</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-6.png" alt="HTML side of hyperlink.">
</li>
</ol>
<h4><a name="create-3"></a>Scenario 3: Creating a Maven Based Wicket Application from Archetype</h4>
<p>Archetypes exist in Maven repositories for setting up Wicket applications.</p>
<ol>
<li><p>Choose File &gt; New Project. Under Categories, select Maven. Under
Projects, select Project from Archetype.</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-7.png" alt="HTML side of hyperlink.">
<p>Click Next.</p>
</li>
<li><p>In the Search field, type "wicket" and then select the archetype you would like to use.</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-8.png" alt="HTML side of hyperlink.">
<p>Complete the wizard with values appropriate to your needs. Click Finish.</p>
</li>
</ol>
<p>The IDE adds Wicket support to the application created from archetype.</p>
<h4><a name="create-4"></a>Scenario 4: Adding Wicket Support to an Existing Application</h4>
<p>When you already have an application, whether created on Ant or Maven, the IDE can
help you add Wicket support.</p>
<ol>
<li>Right-click the application and choose Properties.</li>
<li>In the Project
Properties dialog, select the Frameworks panel, and then click Add.
Then choose Wicket. Click OK.</li>
<li>Use the descriptions in the previous section to fill out
the Wicket Configuration in the Frameworks panel.</li>
<li>Click OK to confirm.</li>
</ol>
<p>The IDE adds Wicket support to the existing application.</p>
</div>
<p>In the next section, we will explore each of the generated files in detail.
<h3><a name="libraries"></a>Providing Support for Alternative Versions of Wicket</h3>
<p>The version of Wicket included in the NetBeans Wicket plugin might not be the one you need.
Take the steps below to register and use an alternative version of Wicket.</p>
<ol>
<li><p>Go to Tools | Ant Libraries. Notice that the Wicket JARs registered
by the NetBeans Wicket plugin are available:</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-9.png" alt="Ant Libraries">
</li>
<li>In the dialog shown above, click New Library and create a new library with a name beginning with "Wicket". Add JARs
to the library, that is, register the JARs of your preferred version of Wicket into the library you have created.</li>
<li><p>When next you create a new web application, or when you add Wicket support to an existing
application, the Frameworks panel will display your newly registered library,
if its name begins with the word "Wicket":</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/maven-91.png" alt="Ant Libraries">
<p>When you complete the wizard, the JARs registered in the selected library will be put on the classpath of your application.</p>
</li>
</ol>
<p class="notes"><b>Note:</b> The approach above applies to Ant-based Wicket applications. If you want to use
an alternative version of Wicket in a Maven-based application, change the relevant POM file.</p>
<h3><a name="examining"></a>Examining the Source Structure of the Generated Wicket Application</h3>
<p>The IDE's Web Application wizard has created a lot of files for us.
Here,
we look at the files and see how they relate to each other within
the context of a Wicket development.</p>
<ol>
<li>Let's begin our tour of the generated files.<p></p><p></p><p></p>
<ul>
<li><b>Web Descriptor.</b> We begin by looking in the <tt>web.xml</tt> file, which is
the general deployment descriptor common to all web applications
that comply with the Servlet specification. Expand the <tt>WEB-INF</tt> folder
or the Configuration Files folder, open the file in raw XML view, and
notice the definition of the Wicket filter:
<p><pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&gt;
&lt;filter&gt;
&lt;filter-name&gt;WicketApplication&lt;/filter-name&gt;
&lt;filter-class&gt;org.apache.wicket.protocol.http.WicketFilter&lt;/filter-class&gt;
&lt;init-param&gt;
&lt;param-name&gt;applicationClassName&lt;/param-name&gt;
&lt;param-value&gt;com.myapp.wicket.Application&lt;/param-value&gt;
&lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;WicketApplication&lt;/filter-name&gt;
&lt;url-pattern&gt;/wicket/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;session-config&gt;
&lt;session-timeout&gt;
30
&lt;/session-timeout&gt;
&lt;/session-config&gt;
&lt;welcome-file-list&gt;
&lt;welcome-file/&gt;
&lt;/welcome-file-list&gt;
&lt;/web-app&gt;</pre>
<p class="notes"><b>Note:</b> The value of the application class name
is set to <tt>com.myapp.wicket.Application</tt>. In the
next step, we will open the application class file
and inspect its content.
<li><b>Wicket Application Class.</b> Open the
<tt>com.myapp.wicket</tt> package in the Source Packages folder
and then open the <tt>Application.java</tt> file. It looks like this:
<p><pre class="examplecode">package com.myapp.wicket;
import org.apache.wicket.protocol.http.WebApplication;
public class Application extends WebApplication {
public Application() {
}
@Override
public Class getHomePage() {
return HomePage.class;
}
}</pre>
<p>This is the Java file that provides application-wide
settings, comparable to <tt>struts-config.xml</tt> in the
Struts framework and <tt>faces-config.xml</tt> in the
JSF framework. Notice the definition of the <tt>getHomePage()</tt> method.
This method is the minimum requirement of the
application-wide class. It specifies the first page (the home
page) that will be displayed when you deploy the
application. Notice that <tt>HomePage.class</tt> is returned. In
the next step, we will open the <tt>HomePage.java</tt> file
and inspect its content.
<li><b>Wicket Home Page.</b> Open <tt>HomePage.java</tt>.
It looks like this:
<p><pre class="examplecode">package com.myapp.wicket;
public class HomePage extends BasePage {
public HomePage() {
add(new Label("message", "Hello, World!"));
}
}</pre>
<p>The file adds a label to the home page. Rendering of Wicket widgets
created in this file is done in a file with the
same name in the same source structure, which
can only be <tt>HomePage.html</tt>, which looks
as follows, currently:
<p><pre class="examplecode">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"
xml:lang="en"
lang="en"&gt;
&lt;head&gt;
&lt;wicket:head&gt;
&lt;title&gt;Wicket Example&lt;/title&gt;
&lt;/wicket:head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;wicket:extend&gt;
&lt;h1 wicket:id="message"&gt;This gets replaced&lt;/h1&gt;
&lt;/wicket:extend&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Notice that in <tt>HomePage.java</tt>
we are extending <tt>BasePage</tt>. In <tt>HomePage.html</tt>
we have a <tt>wicket:id</tt> attribute, which tells
us that this is a placeholder
for something created somewhere by a Java file. Also, we have
a reference to the CSS stylesheet that the IDE generated for us. You
can find it in the Web Pages folder, in the Projects window. In the
next step, we will open <tt>BasePage</tt>
and examine its content.</p></li>
<li><b>Base Page.</b> Open
<tt>BasePage.java</tt>. This is what
it looks like:
<p><pre class="examplecode">package com.myapp.wicket;
import org.apache.wicket.markup.html.WebPage;
public abstract class BasePage extends WebPage {
public BasePage() {
super();
add(new HeaderPanel("headerpanel", "Welcome To Wicket"));
add(new FooterPanel("footerpanel", "Powered by Wicket and the NetBeans Wicket Plugin"));
}
}</pre>
<p>This is the class that we want all our
web pages to extend. Every class extending <tt>BasePage</tt>
will inherit an instance of <tt>HeaderPanel</tt> and <tt>FooterPanel</tt>. This
ensures that all our web pages will have the same header and footer.
The HTML side of the base page is as follows:</p>
<p><pre class="examplecode">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"
xml:lang="en"
lang="en"&gt;
&lt;head&gt;
&lt;wicket:head&gt;
&lt;wicket:link&gt;
&lt;link rel="stylesheet" type="text/css" href="style.css"/&gt;
&lt;/wicket:link&gt;
&lt;/wicket:head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;header wicket:id="headerpanel" /&gt;
&lt;section class="content_container"&gt;
&lt;wicket:child/&gt;
&lt;/section&gt;
&lt;footer wicket:id="footerpanel" /&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>In
the next step, we will open <tt>HeaderPanel.java</tt>
and inspect its content.
<li><b>Header Panel.</b> Open
<tt>HeaderPanel.java</tt>. This is what
it looks like:
<p><pre class="examplecode">package com.myapp.wicket;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
public class HeaderPanel extends Panel {
public HeaderPanel(String componentName, String exampleTitle)
{
super(componentName);
<b>add(new Label("exampleTitle", exampleTitle));</b>
}
}</pre>
<p>Notice the line in bold above. Here, we create
a Wicket Label widget. The HeaderPanel is a reusable
component. This is the Java side, where widgets are created.
Next we will look at the HTML side, which is where we can
expect the Wicket Label widget to be rendered. In the
next step, we will open the <tt>HeaderPanel.html</tt>
file and inspect its content.
<p>Now change the second argument to "My Very First Component Based Application",
so that the definition of the Label is now as follows:
<p><pre class="examplecode">add(new Label("exampleTitle", "My Very First Component Based Application"));</pre>
<p>Open
<tt>HeaderPanel.html</tt>. Notice that
it has the same name as the Java file we have
just looked at. It is found within
the same package structure. This is what it looks like:
<p><pre class="examplecode">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"
xml:lang="en"
lang="en"&gt;
&lt;head&gt;&lt;title&gt;Wicket Example&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;wicket:panel&gt;
&lt;h1&gt;Wicket Example&lt;/h1&gt;
&lt;p id="titleblock"&gt;
&lt;b&gt;&lt;font size="+1"&gt;Start of &lt;span wicket:id="exampleTitle"&gt;Example Title Goes Here&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;/wicket:panel&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Notice the line in bold above. This is
how you specify where a widget should be rendered
in the HTML side of a web page. Hold down the Ctrl
key and move your mouse over the value
of the <tt>wicket:id</tt> attribute in
the <tt>span</tt> tag. Notice that
the value turns into a hyperlink:
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/hyperlink-1.png" alt="HTML side of hyperlink.">
<p>Click the hyperlink and notice that the Java side
of the web page opens.
<p>Now click the left arrow at the top of the Source Editor to
return to the HTML page:
<p><p class="align-left"><img border="1" src="../../../images_www/articles/74/web/wicket/hyperlink-2.png" alt="Java side of hyperlink.">
<p>In this way, you can navigate quickly
and efficiently between the two sides of Wicket components.
<li><b>Footer Panel.</b> The structure of the footer panel is the same as the header panel, described above.</li>
</ul></li>
<li><p>Right-click the project and run it. The IDE compiles
the application, creates a WAR file, sends it to the deployment server,
opens the IDE's default browser, and displays the application:</p>
<p><p class="align-left"><img border="1" src="../../../images_www/articles/74/web/wicket/deploy-1.png" alt="first deployment.">
<p class="notes"><b>Note:</b> Make sure that "/wicket" is appended to the URL, as shown
above, which maps the URL to the Wicket filter registered in the <tt>web.xml</tt> file.</p>
</ol>
</div>
<br />
<!-- ===================================================================================== -->
<h2><a name="features"></a>Using Wicket Features</h2>
<p>In the next sections, you will learn about three key Wicket features and how NetBeans IDE supports them
via the NetBeans Wicket plugin:</p>
<ul>
<li><a href="#widget">Widget</a></li>
<li><a href="#component">Reusable Component</a></li>
<li><a href="#ajax">AJAX Support</a></li>
</ul>
<p>The sections below also introduce you to various supporting features that the NetBeans Wicket
plugin makes available.</p>
<div class="indent">
<h3><a name="widget"></a>Adding a Widget</h3>
<p>In this section, we create our first widget in Wicket. Just like
most other artifacts in Wicket, a widget has a Java side and an HTML side.
On the Java side, the widget is created. On the HTML side, it is rendered.
As shown previously, navigation
between the two sides is made possible via a hyperlink.
<ol>
<li><p>Open <tt>HomePage.html</tt>. If the Palette does not open automatically,
open it via Window &gt; Palette (Ctrl-Shift-8).</p>
<p><p class="align-left"><img border="1" src="../../../images_www/articles/74/web/wicket/widget-2.png" alt="Java side of hyperlink.">
</li>
<li><p>After adding a line below the H1 element in the HTML file,
drag the Label item from the Palette and drop it below the H1 element. You see the
dialog below:</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/widget-3.png" alt="Java side of hyperlink.">
<p><p>Change the values in the dialog to the following:</p>
<p><p class="align-left"><img src="../../../images_www/articles/74/web/wicket/widget-4.png" alt="Java side of hyperlink.">
<p><p>Click OK. Notice that the tag in bold below has been added to the file:</p>
<p><pre class="examplecode">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"
xml:lang="en"
lang="en"&gt;
&lt;head&gt;
&lt;wicket:head&gt;
&lt;title&gt;Wicket Example&lt;/title&gt;
&lt;/wicket:head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;wicket:extend&gt;
&lt;h1 wicket:id="message"&gt;This gets replaced&lt;/h1&gt;
<b>&lt;span wicket:id="message1"&gt;This gets replaced&lt;/span&gt;</b>
&lt;/wicket:extend&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Now you can style the newly added widget by, for example, using H3 tags:</p>
<pre class="examplecode">&lt;h3 wicket:id="message1">This gets replaced&lt;/h3&gt;</pre>
<p>Next, open <tt>HomePage.java</tt> and notice that a label has been added, with the same
identifier as in the HTML file
(changes in <strong>bold</strong>):
<pre class="examplecode">public class HomePage extends BasePage {
public HomePage() {
add(new Label("message", "Hello, World!"));
<b>add(new Label("message1", "Hello again, World!"));</b>
}
}</pre>
</li>
<li><p>Save the files. Refresh the browser and you will see the Wicket Label,
rendered in the <tt>HomePage.html</tt> file:</p>
<p><p><img border="1" src="../../../images_www/articles/74/web/wicket/deploy-2.png" alt="palette.">
</ol>
<p>You can create placeholders, just like the tag you created
in the <tt>HomePage.html</tt> file above, and then hand the HTML file to your
web designer. While the web designer designs the web page, you can work
on the Java side and create the widgets completely independently. Since the
HTML tags are not embedded in the Java file, you and the web designer can
reap the rewards of Wicket's central focus of "separation of concerns".</p>
<p class="tips">Open the Navigator (Window &gt; Navigating &gt; Navigator), while
the above HTML file is selected in the editor, and then
you can see an overview of the tags, in the Navigator's "Wicket Tags" list:</p>
<p><img border="1" src="../../../images_www/articles/74/web/wicket/wicket-navigator.png" alt="wicket navigator">
<p class="tips">If there is no matching tag in the matching HTML page, you see an
error message in the Java file:
<p><img alt="Label import statement displayed from clicking lightbulb icon in left margin"
src="../../../images_www/articles/74/web/wicket/widget-1.png" style="border:1px solid">
</p>
<!-- ===================================================================================== -->
<h3><a name="component"></a>Adding a Reusable Component</h3>
<p>One of strengths of Wicket is the concept of "reusable components". Here,
in this section, we use a wizard to generate a panel, which again has
a Java side and an HTML side. We will create this panel so that we have
a banner that we will reuse in our web pages, so that the banner
is consistent across our web site. We will see how easy it is to add
a panel to a web page.
<ol>
<li><p>Right-click the <tt>com.myapp.wicket</tt> package node
and choose New &gt; Other. Under Categories, choose Web.
Under File Types, notice the following templates:</p>
<p><p><img src="../../../images_www/articles/74/web/wicket/panel-1.png" alt="file templates"></p>
<p>Choose Wicket Panel and click Next.</p>
<li>Type <tt>BannerPanel</tt> in File Name. You should now
see the following:
<p><p><img src="../../../images_www/articles/74/web/wicket/panel-2.png" alt="file templates">
<p>Click Finish.</p>
<p>Notice that we now have two new files in our package, <tt>BannerPanel.html</tt>
and <tt>BannerPanel.java</tt>.
<li>Open <tt>BannerPanel.html</tt> and notice that the content of
the file is as follows:
<p><pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns:wicket&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;
&lt;title&gt;BannerPanel&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;wicket:panel&gt;
&lt;!-- TODO - add components here, ala
&lt;span wicket:id="title"&gt;title here&lt;/span&gt;
--&gt;
&lt;/wicket:panel&gt;
&lt;/body&gt;
&lt;/html</pre>
<p>Between <tt>wicket:panel</tt> tags, a Wicket placeholder is found. Remove
the line above and below the SPAN tag, so that the line with the SPAN
tag is no longer commented out. Hold down
the Ctrl key, move the mouse over the value of the Wicket id, and click
the hyperlink that appears. The <tt>BannerPanel.java</tt> file opens:
<p><pre class="examplecode">package com.myapp.wicket;
import org.apache.wicket.markup.html.panel.Panel;
public final class BannerPanel extends Panel {
BannerPanel(String id) {
super (id);
}
}</pre>
<p>Add a label, as you did earlier in the <tt>HomePage.java</tt> file,
shown in bold below:
<p><pre class="examplecode">package com.myapp.wicket;
<b>import org.apache.wicket.markup.html.basic.Label;</b>
import org.apache.wicket.markup.html.panel.Panel;
public final class BannerPanel extends Panel {
BannerPanel(String id) {
super (id);
<b>add(new Label("title","I am a reusable component!"));</b>
}
}</pre>
<li>Our panel, while simple, is actually complete already. Lets add
it to the home page. Open <tt>HomePage.java</tt> and then create a new
instance of BannerPanel, by adding the following line to the end
of the Constructor:
<p><pre class="examplecode">add(new BannerPanel("bannerPanel"));</pre>
<li>Next, we need to render the panel. Open <tt>HomePage.html</tt>
and add the placeholder tag right above the closing BODY tag,
making sure to use the same Wicket identifier as used in the Java file:
<p><pre class="examplecode">&lt;span wicket:id='bannerPanel'/&gt;</pre>
<li><p>Run the project again. Notice that the panel is displayed,
exactly where the HTML file specified it should be rendered:</p>
<p class="align-left"><p><img border="1" src="../../../images_www/articles/74/web/wicket/result-3.png" alt="new deploy">
</ol>
<p>In Wicket terminology, a panel is a reusable component. Exactly
as shown in this section, you can reuse the panel as often as you like
and in as many web pages as you fancy.
<!-- ===================================================================================== -->
<h3><a name="ajax"></a>Adding AJAX Features</h3>
<p>Instead of using JavaScript to add asynchronous web features (via <a href="http://en.wikipedia.org/wiki/Ajax_(programming)">AJAX technology</a>) to a Wicket
application, Wicket makes available
a Java component model that encapsulates AJAX features. Below, you
are shown how to change the BannerPanel to include an AJAX autocomplete
widget, instead of the label widget you created previously.</p>
<ol>
<li><p>On the HTML side of the <tt>BannerPanel</tt> class, drag an AJAX Text Input item
from the Palette (Ctrl-Shift-8), as shown below:</p>
<p><p><img src="../../../images_www/articles/74/web/wicket/drag-1.png" alt="file templates"></p>
<p>Drop the item below the existing Wicket placeholder, as shown below:</p>
<p><pre class="examplecode">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns:wicket&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;
&lt;title&gt;BannerPanel&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;wicket:panel&gt;
&lt;span wicket:id="title"&gt;title here&lt;/span&gt;
<b>&lt;input type="text" wicket:id="countries" size="50"/&gt;</b>
&lt;/wicket:panel&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</li>
<li>On the matching Java side, notice that the following has been added automatically:
<p><pre class="examplecode">final AutoCompleteTextField field = new AutoCompleteTextField("countries", new Model("")) {
@Override
protected Iterator getChoices(String input) {
if (Strings.isEmpty(input)) {
return Collections.EMPTY_LIST.iterator();
}
List choices = new ArrayList(10);
Locale[] locales = Locale.getAvailableLocales();
for (int i = 0; i < locales.length; i++) {
final Locale locale = locales[i];
final String country = locale.getDisplayCountry();
if (country.toUpperCase().startsWith(input.toUpperCase())) {
choices.add(country);
if (choices.size() == 10) {
break;
}
}
}
return choices.iterator();
}
};</pre>
</li>
<li>Press Ctrl-Shift-I and then make sure to select the correct import statements:
<p><p><img src="../../../images_www/articles/74/web/wicket/imports-1.png" alt="file templates"></p>
<p>Click OK and make sure the <tt>BannerPanel</tt> class uses the following import statements:
<pre>import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.string.Strings;</pre>
</li>
<li><p>Refresh the browser again and you will have an AJAX autocomplete field.
As you type, the field will be filled with countries matching the entered text.</p>
<p><p><img border="1" src="../../../images_www/articles/74/web/wicket/result-4.png" alt="file templates"></p>
</ol>
</div>
<!-- ===================================================================================== -->
<h2><a name="next"></a>Next Steps</h2>
<p>This is the end of the introduction to Wicket development in
NetBeans IDE. You are encouraged to continue your journey in the Wicket
framework by working through the Pizza Application Sample described
in <a href="http://www.ensode.net/wicket_first_look.html">A First Look at the Wicket Framework</a>
by David R. Heffelfinger. Note that the result of that tutorial is available as a sample
in the New Project wizard, together with other samples, as shown here:
<p><img src="../../../images_www/articles/74/web/wicket/samples.png" alt="file templates">
<br>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback: Introduction to the Wicket Framework in 7.2">Send
Us Your Feedback</a></div>
<br style="clear:both;">
<a name="seeAlso"></a>
<h2>See Also</h2>
<p>For related or more advanced tutorials, see the following resources:</p>
<ul>
<li><a href="../../docs/web/quickstart-webapps.html">Introduction to Developing Web Applications</a></li>
<li><a href="../../docs/web/quickstart-webapps-struts.html">Introduction to the Struts Web Framework</a></li>
<li><a href="quickstart-webapps-spring.html">Introduction to the Spring Web Framework</a></li>
</ul>
</body>
</html>