Image

Imageshiroineko wrote in Imageru_java

Струтс. Проблема с передачей объекта между экшнами.

Скорее всего, я где-то откровенно туплю, но где именно - понять никак не могу - тупик, нужен сторонний аудит.

Пример из книжки про Струтс. Есть две 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.parseInt(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.ContactForm" name="ContactFormBean">
</form-bean>

...

<action-mappings>

<!--Ссылка на обработчик формы редактирования контакта-->
<action path="/ContactFormHandler">
type="net.thinksquared.lilldep.struts.ContactAction"
name="ContactFormBean"
scope="request"
validate="true"
input="/full.jsp"&gt;

<forward path="/full.jsp" name="success" />

</action>

<!--обработчик ссылки в списке контактов (которая должна перекинуть на страницу редактирования-->
<action path="/EditContact">
type="net.thinksquared.lilldep.struts.EditContactAction"
name="ContactFormBean"
scope="session"
validate="false"
input="/Listing.do"&gt;

<forward path="/full.jsp" name="success" />
</action>

<!--обработчик ссылки на список контактов-->
<action type="net.thinksquared.lilldep.struts.ListingAction" path="/Listing">

<forward path="/listing.jsp" name="success" />
</action>
</action-mappings>


Я дошёл до самого поганого варианта - скопировал код из ответов к упражнениям в книжке, но всё равно получаю пустую форму. Помогите разобраться, пожалуйста.

UPD. А надо было сделать так:
<action path="/ContactFormHandler">
...
scope="session"
....

Спасибо всем.