Well I found my problem, more or less. It's obvious if you look at my code. This is what I was doing in showForm():
... ModelAndView mav = new ModelAndView("findSections", "sections", sections); mav.addObject("streets",referenceData(request)); return mav; ... Nowhere was I actually returning the Model itself, a FindStreetSection object. I was only returning the reference data. The problem was also that I had thought out the problem wrong. What I want to do is: 1. upon entering the page don't load ANYTHING, not Streets, not StreetSections, nothing 2. once the user enters a text to search for display a list of Streets with that text 3. once the user has selected a Street from the list (step 2) and entered a number of StreetSection to search for, display a list of StreetSections for that Street with a range of addresses that encompasses the number entered. I wound up changing it like this, using onSubmit() rather than showForm(): public ModelAndView onSubmit() { List<StreetSection> sections = null; FindStreetSection fss = (FindStreetSection) command; // command obj loaded in formBackingObject() ModelAndView mav = new ModelAndView("findstreetsection", "findStreetSection", fss); if (fss.getStreetName() != null) { mav.addObject("streets", streetManager.findByName(fss.getStreetName())); } if (fss.getStreet() != null) { sections = streetSectionManager.findByNumber(fss.getStreet(), fss.getNumber()); mav.addObject("sections", sections); } return mav; } This did the trick. I was even able to get rid of the commandName and commandClass parameters in my applicationContext; Spring now knows what the Command is based on the name of my Controller. Thanks for your help, I hope this post helps some lost soul like me someday ... Bob syg6 wrote: > > I'll give this a try tomorrow at work (3-day weekend here in Barcelona > ...) But I am curious, why should this be necessary? According to Spring's > 'convention over configuration' rules, if I create any type of > FormController that uses a Command object (say MyObjectFormController), it > should use the MyObject Command object by default, correct? That's what I > thought anyway ... But even after hard-wiring it in my applicationContext > file it doesn't seem to like it ... > > Anyway, as I said, I'll try your recommendation tomorrow. Many thanks! > > Bob > > > > mraible wrote: >> >> On 9/21/07, syg6 <[EMAIL PROTECTED]> wrote: >>> >>> Well, not sure why this is necessary but I stuck this in my >>> dispatcher-servlet.xml: >>> >>> <property name="commandName" value="findStreetSection"/> >>> <property name="commandClass" >>> value="com.myco.myapp.model.FindStreetSection"/> >>> >>> and now when I debug commandClass is correct. But in my page I still >>> don't >>> have access to it. If I put something like this: >>> >>> <form:form method="post" action="findstreetsection.html" >>> id="findStreetSectionForm"> >>> <form:input path="idStreet" id="idStreet" cssClass="text medium"/> >>> >>> I get this error: >>> >>> Neither BindingResult nor plain target object for bean name 'command' >>> available as request attribute >> >> Have you tried <form:form commandName="findStreetSection">? >> >> Matt >> >> >>> >>> The fact that I have to manually tell my Controller what its Command >>> class >>> is worries me, and is probably the problem. But I think my names are all >>> correct. What's certain is, despite the fact that my commandClass seems >>> to >>> be set, it doesn't make it to the jsp. >>> >>> Bummer. >>> >>> Bob >>> >>> >>> >>> syg6 wrote: >>> > >>> > I tried doing it with showForm() and it kind of works: >>> > >>> > protected ModelAndView showForm( >>> > { >>> > List<StreetSection> sections = null; >>> > >>> > if (request.getParameter("id") != null) >>> > { >>> > String id = (String)request.getParameter("id"); >>> > Street street = streetManager.get(new Long(id)); >>> > >>> > Integer number = new Integer(request.getParameter("number")); >>> > sections = streetSectionManager.findByNumber(street, number); >>> > } >>> > >>> > ModelAndView mav = new ModelAndView("findSections", "sections", >>> > sections); >>> > mav.addObject("streets",referenceData(request)); >>> > return mav; >>> > >>> > } >>> > >>> > showForm() is called, and referenceData() is also called, thus loading >>> my >>> > streets. I am not sure if this is the best way to do it ... and I am >>> not >>> > sure if that second-to-last line, mav.addObject() should be mav.put() >>> > instead ... both seem to work ... >>> > >>> > But now in my page I don't have access to the Command (Model) object. >>> In >>> > theory, naming my Controller FindStreetSectionController, because of >>> > conventions, will automatically use my FindStreetSection object, >>> right? >>> > But when I debug and look at this.commandClass it is null. >>> > >>> > What am I doing wrong? >>> > >>> > Thanks, >>> > Bob >>> > >>> > >>> > syg6 wrote: >>> >> >>> >> I've been messing with this issue for a while. Basically I want to be >>> >> able to search for StreetSections. Each StreetSection has a Street >>> and a >>> >> range of numbers. When you enter the search page the first time you >>> see a >>> >> list of Streets. Select one and enter a number and it will show you a >>> >> list of StreetSections. >>> >> >>> >> Originally I wanted to do this without a Model object. But when I >>> made my >>> >> FindStreetSectionsController with an AbstractController I noticed >>> that >>> >> the referenceData() method, which I use to load all Streets, wasn't >>> being >>> >> called. That's because it is only called when you use a >>> *FormController >>> >> and call showForm() or a method that calls showForm() (like >>> onSubmit()). >>> >> Eventually I got it working but was calling referenceData() by hand, >>> >> which I thought was ugly. But, I thought, I can't use a >>> *FormController >>> >> because I am not using a Command (Model) object. >>> >> >>> >> After further thought though I realized that on the search page I >>> always >>> >> have a form with two fields - idStreet and number - the stuff to >>> search >>> >> for, so I decided to create a FindStreetSection Model object with >>> those >>> >> two fields , and that way I'd be able to use a BaseFormController and >>> >> theoretically load automagically the Streets with referenceData(). >>> >> >>> >> But I have a problem - I am not sure what method to implement in my >>> >> Controller. I have tried implementing both formBackingObject() and >>> >> onSubmit() but my test is failing. Here is my Controller: >>> >> >>> >> protected Object formBackingObject() >>> >> { >>> >> FindStreetSection fss = new FindStreetSection(); >>> >> String id = request.getParameter("id"); >>> >> String number = request.getParameter("number"); >>> >> >>> >> if (!StringUtils.isBlank(id)) >>> >> { >>> >> fss.setIdStreet(new Long(id)); >>> >> fss.setNumber(new Integer(number)); >>> >> } >>> >> >>> >> return fss; >>> >> } >>> >> >>> >> public ModelAndView onSubmit() >>> >> { >>> >> >>> >> List<StreetSection> sections = null; >>> >> FindStreetSection fss = (FindStreetSection) command; >>> >> >>> >> if (ft.getIdStreet() != null) >>> >> { >>> >> Street street = streetManager.get(fss.getIdStreet()); >>> >> sections = streetSectionsManager.findByNumber(street, >>> >> fss.getNumber()); >>> >> } >>> >> >>> >> return new ModelAndView("findStreetSections", "sections", >>> sections); >>> >> } >>> >> >>> >> And here is my test: >>> >> >>> >> public void testSearch() throws Exception >>> >> { >>> >> MockHttpServletRequest request = newGet("/findstreetsection.html"); >>> >> request.addParameter("id", "1"); >>> >> request.addParameter("number", "196"); >>> >> >>> >> ModelAndView mav = c.handleRequest(request, new >>> >> MockHttpServletResponse()); >>> >> ModelMap m = mav.getModelMap(); >>> >> >>> >> assertNotNull(m.get("sections")); >>> >> assertTrue(((List) m.get("sections")).size() > 0); >>> >> } >>> >> >>> >> formBackingMethod() is being called but onSubmit() is not, thus my >>> test >>> >> fails saying sections is null. I think my test is correctly written, >>> I am >>> >> just not sure which method I need to implement in my Controller. >>> >> onSubmit() doesn't seem to be it. Looking at other (form) tests, in >>> order >>> >> to get onSubmit() to be called it seems you have to do something like >>> >> this: >>> >> >>> >> request = newPost("/findstreetsection.html"); >>> >> super.objectToRequestParameters(fss, request); >>> >> request.addParameter("number", "198"); >>> >> >>> >> in order for onSubmit() to be called. I tried this as well but no go. >>> >> Anyway I never need to do any kind of save, update or delete, I >>> simply am >>> >> using a Command (Model) object to making searching easier. So which >>> >> method to I need to implement in my Controller to get this to work? >>> >> >>> >> Thanks, >>> >> Bob >>> >> >>> > >>> > >>> >>> -- >>> >>> View this message in context: >>> http://www.nabble.com/How-to-write-a-controller-and-test-for-%27find%27-functionality-tf4496287s2369.html#a12824550 >>> >>> Sent from the AppFuse - User mailing list archive at Nabble.com. >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>> For additional commands, e-mail: [EMAIL PROTECTED] >>> >>> >> >> >> -- >> http://raibledesigns.com >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> >> > > -- View this message in context: http://www.nabble.com/How-to-write-a-controller-and-test-for-%27find%27-functionality-tf4496287s2369.html#a12881288 Sent from the AppFuse - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]