At line 21 changed 1 line. |
In this step, you'll generate a ''skeleton'' JSP to display information from the Person object. I say ''skeleton'' because it'll just be the <form> itself. It will contain table rows with Spring's "bind" tags for each property in Person.java. The tool that we use to do this was written by [Erik Hatcher|http://www.blogscene.org/erik/]. It's basically just a single class (FormTagsHandler.java) and a couple of XDoclet templates (FormKeys.xdt and Form_jsp.xdt). All these files are located in extras/viewgen. |
In this step, you'll generate a JSP page to display information from the Person object. It will contain Spring's JSP tags that render table rows for each property in Person.java. The [AppGen] tool that's used to do this is based off a StrutsGen tool - which was originally written by [Erik Hatcher|http://www.blogscene.org/erik/]. It's basically just a couple of classes and a bunch of XDoclet templates. All these files are located in extras/appgen. |
At line 25 changed 6 lines. |
* From the command-line, navigate to "extras/viewgen" |
* Execute __ant -Dform.name=Person__ to generate three files in extras/viewgen/build: |
** Person.properties (labels for your form elements) |
** personForm.jsp (skeleton JSP file for viewing a single Person) |
** personList.jsp (skeleton JSP file for viewing a list of People) |
* Copy the contents of Person.properties into web/WEB-INF/classes/ApplicationResources_en.properties. Here is an example of what you might add to ApplicationResources_en.properties: |
* From the command-line, navigate to "extras/appgen" |
* Execute __ant -Dobject.name=Person -Dappgen.type=pojo -Dapp.module=__ to generate a bunch of files in extras/appgen/build/gen. In fact, it'll generate all the files you need to complete this tutorial. However, let's just grab the ones you need. |
** web/WEB-INF/classes/Person.properties (labels for your form elements) |
** web/pages/personForm.jsp (JSP file for viewing a single Person) |
** web/pages/personList.jsp (JSP file for viewing a list of People) |
* Copy the contents of Person.properties into web/WEB-INF/classes/ApplicationResources.properties. These are all the keys you will need for titles/headings and form properties. Here is an example of what you should add to ApplicationResources.properties: |
At line 34 removed 1 line. |
person.firstName=First Name |
At line 35 added 1 line. |
person.firstName=First Name |
At line 37 added 12 lines. |
|
person.added=Person has been added successfully. |
person.updated=Person has been updated successfully. |
person.deleted=Person has been deleted successfully. |
|
# -- person list page -- |
personList.title=Person List |
personList.heading=Persons |
|
# -- person detail page -- |
personDetail.title=Person Detail |
personDetail.heading=Person Information |
At line 39 changed 1 line. |
* Copy personForm.jsp to web/pages/personForm.jsp. Copy personList.jsp to web/pages/personList.jsp. ''Notice that each of the new filename's first character is lowercase.'' |
* Copy personForm.jsp to web/pages/personForm.jsp. Copy personList.jsp to web/pages/personList.jsp. |
At line 48 changed 2 lines. |
* Add keys in ApplicationResources_en.properties the titles and headings in the JSPs |
In the generated JSPs, there are two keys for the title (top of the browser window) and the header (heading in the page). We now need to add these two keys (personDetail.title and personDetail.heading) to ApplicationResources_en.properties. |
* Add keys in ApplicationResources.properties the titles and headings in the JSPs |
In the generated JSPs, there are two keys for the title (top of the browser window) and the header (heading in the page). We now need to add these two keys (personDetail.title and personDetail.heading) to ApplicationResources.properties. |
At line 119 changed 1 line. |
assertNotNull(request.getSession().getAttribute("messages")); |
assertNotNull(request.getSession().getAttribute("successMessages")); |
At line 127 changed 1 line. |
assertNotNull(request.getSession().getAttribute("messages")); |
assertNotNull(request.getSession().getAttribute("successMessages")); |
At line 155 added 2 lines. |
import java.util.Locale; |
|
At line 185 added 1 line. |
|
At line 212 added 1 line. |
Locale locale = request.getLocale(); |
At line 198 removed 3 lines. |
Object[] args = |
new Object[] { person.getFirstName() + ' ' + person.getLastName() }; |
|
At line 204 changed 1 line. |
saveMessage(request, getText("person.deleted", args)); |
saveMessage(request, getText("person.deleted", locale)); |
At line 209 changed 1 line. |
saveMessage(request, getText(key, args)); |
saveMessage(request, getText(key, locale)); |
At line 223 changed 1 line. |
There are a few keys that we need to add to ApplicationResources_en.properties to display the success messages. This file is located in ''web/WEB-INF/classes'' - open it and add the following: |
There are a few keys you (might) need to add to ApplicationResources.properties to display the success messages. This file is located in ''web/WEB-INF/classes'' - open it and add the following: |
At line 227 changed 3 lines. |
{{{person.added=Information for <strong>{0}</strong> has been added successfully. |
person.deleted=Information for <strong>{0}</strong> has been deleted successfully. |
person.updated=Information for <strong>{0}</strong> has been updated successfully. |
{{{person.added=Person has been added successfully. |
person.updated=Person has been updated successfully. |
person.deleted=Person has been deleted successfully. |
At line 234 changed 1 line. |
You might notice that the code we're using to call the PersonManager is the same as the code we used in our PersonManagerTest. Both PersonAction and PersonManagerTest are ''clients'' of PersonManagerImpl, so this makes perfect sense. |
You might notice that the code we're using to call the PersonManager is the same as the code we used in our PersonManagerTest. Both PersonFormController and PersonManagerTest are ''clients'' of PersonManagerImpl, so this makes perfect sense. |
At line 303 removed 1 line. |
Now let's clean up the generated personForm.jsp by making the "id" property a hidden field. Remove the following code block from web/pages/personForm.jsp: |
At line 305 removed 26 lines. |
[{Java2HtmlPlugin |
|
<tr> |
<th> |
<appfuse:label key="person.id"/> |
</th> |
<td> |
<spring:bind path="person.id"> |
<input type="text" name="<c:out value="${status.expression}"/>" |
id="<c:out value="${status.expression}"/>" |
value="<c:out value="${status.value}"/>" /> |
<span class="fieldError"><c:out value="${status.errorMessage}"/></span> |
</spring:bind> |
</td> |
</tr> |
}] |
|
And add the following before the <table> tag: |
|
[{Java2HtmlPlugin |
|
<spring:bind path="person.id"> |
<input type="hidden" name="<c:out value="${status.expression}"/>" value="<c:out value="${status.value}"/>" /> |
</spring:bind> |
}] |
|
At line 384 added 1 line. |
<verifytext description="verify success message" text="${person.updated}"/> |
At line 417 changed 2 lines. |
<verifytext description="verify success message" |
text="Information for <strong>Abbie Raible</strong> has been added successfully."/> |
<verifytext description="verify success message" text="${person.added}"/> |
At line 417 added 1 line. |
<prepareDialogResponse description="Confirm delete" dialogType="confirm" response="true"/> |
At line 419 added 1 line. |
<verifyNoDialogResponses/> |
At line 433 changed 2 lines. |
<verifytext description="verify success message" |
text="Information for <strong>Matt Canoo</strong> has been deleted successfully."/> |
<verifytext description="verify success message" text="${person.deleted}"/> |