Струтс. Проблема с передачей объекта между экшнами.
Скорее всего, я где-то откровенно туплю, но где именно - понять никак не могу - тупик, нужен сторонний аудит.
Пример из книжки про Струтс. Есть две JSP, одна - формочка с данными контактов, другая - список этих контактов. Идея в том, что в списке контактов имя контакта - это гиперссылка, нажав на которую пользователь переходит к форме редактирования контакта и вот тут как я понял, нужные поля должны быть заполнены. Проблема в том что к форме редактирования-то переходит, но она пустая.
Привожу только значимые с моей точки зрения куски кода.
1. Форма редактирования контакта определена следующим образом:
...
<html:form action="ContactFormHandler.do" focus="name">
<html:text property="contact.name" size="60" />
<html:errors property="name" />
<html:text property="contact.designation" size="60" />
...
2. Для формы добавления контакта заданы Action и ActionForm:
public final class ContactAction extends Action{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
ContactForm contactForm = (ContactForm)form;
Contact contact = contactForm.getContact();
//complex validation: check if userid exists
try{
contact.save();
} catch(Exception ex){
ActionMessages errors = new ActionMessages();
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("lilldep.error.save"));
saveErrors(request,errors);
return mapping.getInputForward();
}
return mapping.findForward("success");
}
}
public class ContactForm extends ActionForm{
protected Contact _contact;
public ContactForm(){
_contact = new Contact();
}
public Contact getContact(){ return _contact; }
public void setContact(Contact contact){ _contact = contact; }
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request){
ActionErrors errors = new ActionErrors();
.....
return errors;
}
public void reset(ActionMapping mapping,
HttpServletRequest request){
_contact.clear();
}
}
3. Ссылки в списке оформлены таким образом: <a href="EditContact.do?id=...">
4. Action для EditContact, с комментариями по ходу выполнения:
public final class EditContactAction extends Action implements JSPConstants{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
String id = request.getParameter(ID);
if(id != null){
try{
//создаём запрос к модели, выбираем нужный контакт по айдишнику
Criteria crit = new Criteria();
crit.add(Contact.CONTACT_ID,Integer.pars eInt(id.trim()));
Scroller results = ContactPeer.doSelect(crit);
if(!results.hasNext()) return mapping.getInputForward(); //до сюда доходим успешно, выборка выполняется нормально
//создаётся форма и в неё кладётся контакт
ContactForm cForm = (ContactForm) form;
cForm.setContact((Contact) results.next()); // Watch (cForm.getContact()) показывает, что контакт там есть тот, какой нужен.
return mapping.findForward("success"); //А дальше я даже не знаю, как проследить, куда оно идёт, и что туда приходит, но форма редактирования контакта открывается пустой
}catch(Exception ignore){
ignore.printStackTrace();
}
}
return mapping.getInputForward();
}
}
5. struts-config.xml:
<form-beans>
<form-bean type="net.thinksquared.lilldep.struts.Co ntactForm" name="ContactFormBean">
</form-bean>
...
<action-mappings>
<!--Ссылка на обработчик формы редактирования контакта-->
<action path="/ContactFormHandler">
type="net.thinksquared.lilldep.struts.Co ntactAction"
name="ContactFormBean"
scope="request"
validate="true"
input="/full.jsp">
<forward path="/full.jsp" name="success" />
</action>
<!--обработчик ссылки в списке контактов (которая должна перекинуть на страницу редактирования-->
<action path="/EditContact">
type="net.thinksquared.lilldep.struts.Ed itContactAction"
name="ContactFormBean"
scope="session"
validate="false"
input="/Listing.do">
<forward path="/full.jsp" name="success" />
</action>
<!--обработчик ссылки на список контактов-->
<action type="net.thinksquared.lilldep.struts.Li stingAction" path="/Listing">
<forward path="/listing.jsp" name="success" />
</action>
</action-mappings>
Я дошёл до самого поганого варианта - скопировал код из ответов к упражнениям в книжке, но всё равно получаю пустую форму. Помогите разобраться, пожалуйста.
UPD. А надо было сделать так:
<action path="/ContactFormHandler">
...
scope="session"
....
Спасибо всем.
Пример из книжки про Струтс. Есть две JSP, одна - формочка с данными контактов, другая - список этих контактов. Идея в том, что в списке контактов имя контакта - это гиперссылка, нажав на которую пользователь переходит к форме редактирования контакта и вот тут как я понял, нужные поля должны быть заполнены. Проблема в том что к форме редактирования-то переходит, но она пустая.
Привожу только значимые с моей точки зрения куски кода.
1. Форма редактирования контакта определена следующим образом:
...
<html:form action="ContactFormHandler.do" focus="name">
<html:text property="contact.name" size="60" />
<html:errors property="name" />
<html:text property="contact.designation" size="60" />
...
2. Для формы добавления контакта заданы Action и ActionForm:
public final class ContactAction extends Action{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
ContactForm contactForm = (ContactForm)form;
Contact contact = contactForm.getContact();
//complex validation: check if userid exists
try{
contact.save();
} catch(Exception ex){
ActionMessages errors = new ActionMessages();
errors.add(ActionMessages.GLOBAL_MESSAGE,
saveErrors(request,errors);
return mapping.getInputForward();
}
return mapping.findForward("success");
}
}
public class ContactForm extends ActionForm{
protected Contact _contact;
public ContactForm(){
_contact = new Contact();
}
public Contact getContact(){ return _contact; }
public void setContact(Contact contact){ _contact = contact; }
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request){
ActionErrors errors = new ActionErrors();
.....
return errors;
}
public void reset(ActionMapping mapping,
HttpServletRequest request){
_contact.clear();
}
}
3. Ссылки в списке оформлены таким образом: <a href="EditContact.do?id=...">
4. Action для EditContact, с комментариями по ходу выполнения:
public final class EditContactAction extends Action implements JSPConstants{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
String id = request.getParameter(ID);
if(id != null){
try{
//создаём запрос к модели, выбираем нужный контакт по айдишнику
Criteria crit = new Criteria();
crit.add(Contact.CONTACT_ID,Integer.pars
Scroller results = ContactPeer.doSelect(crit);
if(!results.hasNext()) return mapping.getInputForward(); //до сюда доходим успешно, выборка выполняется нормально
//создаётся форма и в неё кладётся контакт
ContactForm cForm = (ContactForm) form;
cForm.setContact((Contact) results.next()); // Watch (cForm.getContact()) показывает, что контакт там есть тот, какой нужен.
return mapping.findForward("success"); //А дальше я даже не знаю, как проследить, куда оно идёт, и что туда приходит, но форма редактирования контакта открывается пустой
}catch(Exception ignore){
ignore.printStackTrace();
}
}
return mapping.getInputForward();
}
}
5. struts-config.xml:
<form-beans>
<form-bean type="net.thinksquared.lilldep.struts.Co
</form-bean>
...
<action-mappings>
<!--Ссылка на обработчик формы редактирования контакта-->
<action path="/ContactFormHandler">
type="net.thinksquared.lilldep.struts.Co
name="ContactFormBean"
scope="request"
validate="true"
input="/full.jsp">
<forward path="/full.jsp" name="success" />
</action>
<!--обработчик ссылки в списке контактов (которая должна перекинуть на страницу редактирования-->
<action path="/EditContact">
type="net.thinksquared.lilldep.struts.Ed
name="ContactFormBean"
scope="session"
validate="false"
input="/Listing.do">
<forward path="/full.jsp" name="success" />
</action>
<!--обработчик ссылки на список контактов-->
<action type="net.thinksquared.lilldep.struts.Li
<forward path="/listing.jsp" name="success" />
</action>
</action-mappings>
Я дошёл до самого поганого варианта - скопировал код из ответов к упражнениям в книжке, но всё равно получаю пустую форму. Помогите разобраться, пожалуйста.
UPD. А надо было сделать так:
<action path="/ContactFormHandler">
...
scope="session"
....
Спасибо всем.
