Hello Jonathan.
I'm no guru but maybe I can help anyway.
The problem is when your form is submitted and the form fields are
supposed to be inserted back into in the Report
(getReport().setName(...)). Since this is a new request, your old Report
(the one that was rendered) doesn't exist anymore ("target is null").
If your Report is serializable, you can make Tapestry encode it into the
form and then recreate it again on form submit. Just add this to your
class:
@Persist
public abstract Report getReport();
If the Report can't be serialized or if its a very big object, you can
choose to persist its primary key instead and recreate the object yourself
in pageBeginRender(...) (check the docs).
A property is just a getter/setter pair, you need to populate it yourself
(Tapestry can help you remember it with @Persist).
A bean will be instantiated for you when the getter is first called.
Injected objects are stuff from HiveMind, typically Tapestry
infrastructure stuff such as the HttpServletRequest or whatever.
--Martin
On Tue, 28 Feb 2006 00:02:51 +0100, Jonathan Cowperthwaite
<[EMAIL PROTECTED]> wrote:
Hi,
I am using Tapestry 4. What is the best way to create a details page for
an object I will persist via Spring? This question just seems to basic
to ask so my apologies, I have been working through various tutorials
but still fail to grasp what the best practice is.
If you have a bean, how do you create a details page to display and
update its properties
I have the spring service already fetching from the database so I think
I have that correct. My problem is with the details page. On submitting
my form I am getting the following error
/Unable to update OGNL expression '<parsed OGNL expression>' of
[EMAIL PROTECTED] to namebo: target is null
for setProperty(null, "name", namebo)/
I have a basic html form:
<form jwcid="[EMAIL PROTECTED]" listener="listener:onSave">
<table>
<tr>
<td><span jwcid="@FieldLabel"
field="component:name">Name</span></td>
<td colspan="3"><input type="text" jwcid="[EMAIL PROTECTED]"
value="ognl:report.name" displayName="Name" /></td>
</tr>
<tr>
<td><span jwcid="@FieldLabel"
field="component:description">Description</span></td>
<td colspan="3"><textarea rows="5" cols="50"
jwcid="[EMAIL PROTECTED]" value="ognl:report.description"
displayName="Description" /></td>
</tr>
....
With an accompanying class:
public abstract class ReportDetails extends BasePage {
@InjectObject("spring:reportService")
public abstract ReportService getReportService();
@InjectPage("Reports")
public abstract ReportDetails getReportListPage();
public abstract Report getReport();
public abstract void setReport(Report report);
public IPage onSave() {
getReportService().saveReport(getReport());
return getReportListPage();
}
....
}
Is this correct? I can get to the details page from my list page ok, the
list page calls setReport(..) and my details page renders with the
fields populated. When I click submit things fall over, obviously I'm
missing some essential tapestry fundamentals. Am i right to have my
object as a property of the page class and expect it to be populated,
should I be using a bean instead (and what is the difference,
technically or in terms of use, between a property, a bean and an
injected object)?
If there is any patient tapestry guru out there that could point me in
the right direction I would be very grateful.
many thanks
Jonathan
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]