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

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]

Reply via email to