Author: hlship
Date: Mon Jun 18 17:53:03 2007
New Revision: 548539
URL: http://svn.apache.org/viewvc?view=rev&rev=548539
Log:
Chapter 4: Forms
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Address.java
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Honorific.java
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/pages/address/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/pages/address/CreateAddress.java
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/pages/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/pages/address/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/pages/address/CreateAddress.properties
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/address/
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/address/CreateAddress.html
tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v1.png
(with props)
tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v2.png
(with props)
Modified:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/Start.html
tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/apt/forms.apt
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Address.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Address.java?view=auto&rev=548539
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Address.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Address.java
Mon Jun 18 17:53:03 2007
@@ -0,0 +1,124 @@
+package org.apache.tapestry.tutorial.data;
+
+public class Address
+{
+ private Honorific _honorific;
+
+ private String _firstName;
+
+ private String _lastName;
+
+ private String _street1;
+
+ private String _street2;
+
+ private String _city;
+
+ private String _state;
+
+ private String _zip;
+
+ private String _email;
+
+ private String _phone;
+
+ public Honorific getHonorific()
+ {
+ return _honorific;
+ }
+
+ public String getFirstName()
+ {
+ return _firstName;
+ }
+
+ public String getLastName()
+ {
+ return _lastName;
+ }
+
+ public String getStreet1()
+ {
+ return _street1;
+ }
+
+ public String getStreet2()
+ {
+ return _street2;
+ }
+
+ public String getCity()
+ {
+ return _city;
+ }
+
+ public String getState()
+ {
+ return _state;
+ }
+
+ public String getZip()
+ {
+ return _zip;
+ }
+
+ public String getEmail()
+ {
+ return _email;
+ }
+
+ public String getPhone()
+ {
+ return _phone;
+ }
+
+ public void setCity(String city)
+ {
+ _city = city;
+ }
+
+ public void setEmail(String email)
+ {
+ _email = email;
+ }
+
+ public void setFirstName(String firstName)
+ {
+ _firstName = firstName;
+ }
+
+ public void setHonorific(Honorific honorific)
+ {
+ _honorific = honorific;
+ }
+
+ public void setLastName(String lastName)
+ {
+ _lastName = lastName;
+ }
+
+ public void setPhone(String phone)
+ {
+ _phone = phone;
+ }
+
+ public void setState(String state)
+ {
+ _state = state;
+ }
+
+ public void setStreet1(String street1)
+ {
+ _street1 = street1;
+ }
+
+ public void setStreet2(String street2)
+ {
+ _street2 = street2;
+ }
+
+ public void setZip(String zip)
+ {
+ _zip = zip;
+ }
+}
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Honorific.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Honorific.java?view=auto&rev=548539
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Honorific.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/data/Honorific.java
Mon Jun 18 17:53:03 2007
@@ -0,0 +1,6 @@
+package org.apache.tapestry.tutorial.data;
+
+public enum Honorific
+{
+ MR, MRS, MISS, DR
+}
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/pages/address/CreateAddress.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/pages/address/CreateAddress.java?view=auto&rev=548539
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/pages/address/CreateAddress.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/java/org/apache/tapestry/tutorial/pages/address/CreateAddress.java
Mon Jun 18 17:53:03 2007
@@ -0,0 +1,19 @@
+package org.apache.tapestry.tutorial.pages.address;
+
+import org.apache.tapestry.tutorial.data.Address;
+
+public class CreateAddress
+{
+ private Address _address;
+
+ public Address getAddress()
+ {
+ return _address;
+ }
+
+ public void setAddress(Address address)
+ {
+ _address = address;
+ }
+
+}
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/pages/address/CreateAddress.properties
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/pages/address/CreateAddress.properties?view=auto&rev=548539
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/pages/address/CreateAddress.properties
(added)
+++
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/resources/org/apache/tapestry/tutorial/pages/address/CreateAddress.properties
Mon Jun 18 17:53:03 2007
@@ -0,0 +1 @@
+foo=Foo Bar Baz Baby!
Modified:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/Start.html
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/Start.html?view=diff&rev=548539&r1=548538&r2=548539
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/Start.html
(original)
+++
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/Start.html
Mon Jun 18 17:53:03 2007
@@ -12,5 +12,11 @@
<t:actionlink>Start guessing</t:actionlink>
</p>
+ <h1>Address Book</h1>
+
+ <ul>
+ <li><t:pagelink page="address/create">Create new
address</t:pagelink></li>
+ </ul>
+
</body>
</html>
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/address/CreateAddress.html
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/address/CreateAddress.html?view=auto&rev=548539
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/address/CreateAddress.html
(added)
+++
tapestry/tapestry5/trunk/tapestry-tutorial1/src/main/webapp/WEB-INF/address/CreateAddress.html
Mon Jun 18 17:53:03 2007
@@ -0,0 +1,12 @@
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
+ <head>
+ <title>Create New Address</title>
+ </head>
+ <body>
+
+ <h1>Create New Address</h1>
+
+ <t:beaneditform object="address"/>
+
+ </body>
+</html>
Modified: tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/apt/forms.apt
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/apt/forms.apt?view=diff&rev=548539&r1=548538&r2=548539
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/apt/forms.apt
(original)
+++ tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/apt/forms.apt Mon Jun
18 17:53:03 2007
@@ -4,4 +4,297 @@
Chapter 4: Forms in Tapestry
- <Coming soon!>
\ No newline at end of file
+ In the previous chapters, we saw how Tapestry can handle simple links, even
links that pass information in the URL. In this chapter,
+ we'll see how Tapestry can do the same, and quite a bit more, for HTML
forms.
+
+ Form support in Tapestry is deep and rich, more than can be covered in a
single chapter. However, we can show the basics, including
+ some very common development patterns. To get started, let's create a simple
address book application.
+
+ We'll start with the data, a simple object to store the information we'll
need. By convention, these classes go in a <<<data>>> sub-package. Unlike
+ the use of the <<<pages>>> sub-package (for page component classes), this is
not enforced by Tapestry; it's just a convention.
+
+
+ <<src/main/java/org/apache/tapestry/tutorial/data/Address.java:>>
+
+----
+package org.apache.tapestry.tutorial.data;
+
+public class Address
+{
+ private Honorific _honorific;
+
+ private String _firstName;
+
+ private String _lastName;
+
+ private String _street1;
+
+ private String _street2;
+
+ private String _city;
+
+ private String _state;
+
+ private String _zip;
+
+ private String _email;
+
+ private String _phone;
+
+ public String getCity()
+ {
+ return _city;
+ }
+
+ public String getEmail()
+ {
+ return _email;
+ }
+
+ public String getFirstName()
+ {
+ return _firstName;
+ }
+
+ public Honorific getHonorific()
+ {
+ return _honorific;
+ }
+
+ public String getLastName()
+ {
+ return _lastName;
+ }
+
+ public String getPhone()
+ {
+ return _phone;
+ }
+
+ public String getState()
+ {
+ return _state;
+ }
+
+ public String getStreet1()
+ {
+ return _street1;
+ }
+
+ public String getStreet2()
+ {
+ return _street2;
+ }
+
+ public String getZip()
+ {
+ return _zip;
+ }
+
+ public void setCity(String city)
+ {
+ _city = city;
+ }
+
+ public void setEmail(String email)
+ {
+ _email = email;
+ }
+
+ public void setFirstName(String firstName)
+ {
+ _firstName = firstName;
+ }
+
+ public void setHonorific(Honorific honorific)
+ {
+ _honorific = honorific;
+ }
+
+ public void setLastName(String lastName)
+ {
+ _lastName = lastName;
+ }
+
+ public void setPhone(String phone)
+ {
+ _phone = phone;
+ }
+
+ public void setState(String state)
+ {
+ _state = state;
+ }
+
+ public void setStreet1(String street1)
+ {
+ _street1 = street1;
+ }
+
+ public void setStreet2(String street2)
+ {
+ _street2 = street2;
+ }
+
+ public void setZip(String zip)
+ {
+ _zip = zip;
+ }
+}
+----
+
+ It's just a collection of getter and setter methods. We also need to define
the enum type, Salutation:
+
+ <<src/main/java/org/apache/tapestry/tutorial/data/Honorific.java:>>
+
+---
+package org.apache.tapestry.tutorial.data;
+
+public enum Honorific
+{
+ MR, MRS, MISS, DR
+}
+---
+
+* Address Pages
+
+ We're probably going to create a few pages related to addresses: pages for
creating them, for editting them, for searching and listing them.
+ We'll create a sub-folder, address, to hold them. Let's get started on the
first of these pages, "address/Create" (that's the real name, including
+ the slash --- we'll see in a minute how that maps to classes and templates).
+
+ First, we'll update the Start.html template, to create a link for creating a
new page:
+
+ <<src/main/webapp/WEB-INF/Start.html:>>
+
+----
+ <h1>Address Book</h1>
+
+ <ul>
+ <li><t:pagelink page="address/create">Create new
address</t:pagelink></li>
+ </ul>
+----
+
+ Now we need the page, let's start with an empty shell, just to test our
navigation.
+
+ <<src/main/webapp/WEB-INF/address/CreateAddress.html:>>
+
+---
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
+ <head>
+ <title>Create New Address</title>
+ </head>
+ <body>
+
+ <h1>Create New Address</h1>
+
+ <em>coming soon ...</em>
+
+ </body>
+</html>
+---
+
+ And the corresponding class:
+
+
<<src/main/java/org/apache/tapestry/tutorial1/pages/address/CreateAddress.java:>>
+
+----
+package org.apache.tapestry.tutorial.pages.address;
+
+public class CreateAddress
+{
+
+}
+----
+
+ So ... why is the class named "CreateAddress" and not simply "Create"?
Actually, we could have, and it would work. Tapestry noticed the redundancy in
the
+ class name:
<<<org.apache.tapestry.tutorial1.pages.>>><address><<<.Create>>><Address> and
just stripped it out.
+
+ Eventually, your application will probably have more entities: perhaps
you'll have a "create/User" page and a "create/Payment" page and a
"create/Account" page.
+ Now, you <could> have a bunch of different classes named <<<Create>>>
spread across a number of different packages. That's legal Java, but it isn't
ideal. You may find yourself
+ accidentally editting the Java code for creating an Account when your
really want to be editting the code for creating a Payment.
+
+ Tapestry is encouraging you to use a more descriptive name:
<<<Create>>><Address> not just <<<Create>>>, but it isn't making you pay the
cost (in terms of longer,
+ uglier URLs). The URL will still be
http://localhost:8080/tutorial1/address/create.
+
+* Using the BeanEditForm component
+
+ Time to start putting together the logic for this form. In fact, let's use
a magic trick ... the BeanEditForm component. This component can analyze a
class and create an editor UI for it all in one go.
+ Let's give it a try.
+
+ Add the following to the CreateAddress template (replacing the "coming soon
..." message):
+
+---
+ <t:beaneditform object="address"/>
+---
+
+ And match that up with a property in the CreateAddress class:
+
+----
+ private Address _address;
+
+ public Address getAddress()
+ {
+ return _address;
+ }
+
+ public void setAddress(Address address)
+ {
+ _address = address;
+ }
+----
+
+ When you refresh the page, you'll see the following:
+
+[address-v1.png] Initial version of the create address form
+
+ Tapestry's done quite a bit of work here. It's created a form that includes
a field for each property. Further, it's seen that the
+ honorific property is an enumerated type, and presented that as a drop-down
list.
+
+ In addition, Tapestry has converted the property names ("city", "email",
"firstName") to user presentable labels ("City", "Email", "First Name").
+ In fact, these are \<label\> elements, so clicking a label will move the
cursor into the corresponding field.
+
+ This is an awesome start; it's a presentable interface, quite nice in fact
for a few minute's work. But it's far from perfect; let's get started
+ with some customizations.
+
+* Changing field order
+
+ It looks like the fields are being displayed in alphabetical order, ("city"
first, "zip" last). That's not quite the reality, however: If you check the
listing
+ for the Address class, you'll see that the getter and setter methods are in
alphabetical order (care of Eclipse, which generated all those methods from the
fields).
+
+ The BeanEditForm works in the order in which the <getter methods> are
defined in the class. Let's reorder them into a more reasonable order:
+
+ * honorific
+
+ * firstName
+
+ * lastName
+
+ * street1
+
+ * street2
+
+ * city
+
+ * state
+
+ * zip
+
+ * email
+
+ * phone
+
+ []
+
+ (This is also the order of in which the fields are defined.)
+
+ Because Address is not a component class, it is necessary to restart Jetty
to see the effects of these changes.
+
+ Once Jetty is restarted, hit the browser's refresh button to see the fields
in the correct order:
+
+[address-v2.png] Create address form with fields in proper order
+
+
+
+
+
+
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v1.png
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v1.png?view=auto&rev=548539
==============================================================================
Binary file - no diff available.
Propchange:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v1.png
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v2.png
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v2.png?view=auto&rev=548539
==============================================================================
Binary file - no diff available.
Propchange:
tapestry/tapestry5/trunk/tapestry-tutorial1/src/site/resources/address-v2.png
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream