Escolhendo métodos no Spring

8 respostas
lipe82

Oi pessoal!
Estou desenvolvendo minha primeira aplicação spring e estou tentando usar o MultiActionController para funcionar como o DispatchAction do Struts, mas estou tendo alguns problemas… Ele não está reconhecendo os parâmetros passados na URL.
Eu passo na URL http://localhost:9080/springapp/hello1.htm?action=consultar e no meu springapp-servlet.xml tenho

<bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
		<property name="paramName">
			<value>action</value>
		</property>
	</bean>
	<bean id="paramMultiController" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
		<property name="methodNameResolver"><ref bean="paramResolver"/></property>
		<property name="delegate"><ref bean="hello1"/></property>
	</bean>
    <bean id="hello1" class="springapp.web.ProductFormController" name="/hello1.htm">
    	<property name="productManager" ref="productManager"/>
    </bean>

e minha classe Java ProductFormController.java

package springapp.web;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import springapp.service.ProductManager;

public class ProductFormController extends MultiActionController {

    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());

    private ProductManager productManager;

    public ModelAndView consultar(HttpServletRequest request, HttpServletResponse response) {
    	
    	System.out.println("We are inside ProductFormController.consultar() !!");
    	
        String now = (new java.util.Date()).toString();
        logger.info("returning hello view with " + now);
        
        Map<String, Object> myModel = new HashMap<String, Object>();
        myModel.put("now", now);
        myModel.put("products", this.productManager.getProducts());
        
        return new ModelAndView("hello", "model", myModel);
    }

    public ModelAndView hello1(HttpServletRequest request, HttpServletResponse response) 
    	throws ServletException, IOException {
    	
    	System.out.println("We are inside ProductFormController.hello1() !!");
    	
        String now = (new Date()).toString();
		
		logger.info("Returning hello view with " + now);
		
		return new ModelAndView("hello", "now", now);
    }

    public void setProductManager(ProductManager productManager) {
        this.productManager = productManager;
    }
}

mas a aplicação está acessando o método hello1 ao invés do consultar informado na URL

Vcs sabem como resolver este?
Obrigado

8 Respostas

joaosouza

Olá lipe82 blz…

Cara segue abaixo como configuro minhas applicações com o Spring…

spring-servlet.xml…

<beans>
 	
	<import resource="controllers.xml" />	

	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="message"/>
	</bean>

	
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />		
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />	
	</bean>  
		
	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.Exception">error</prop>
			</props>
		</property>
	</bean>
	
	<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>	            
   	                  <prop key="/mountPesquisaCentroCusto.do">pesquisaCentroCustoController</prop>	  
                        <prop key="/mountPesquisaUnidadesCentroCusto.do">pesquisaCentroCustoController</prop>	
			</props> 
		</property>
	</bean>
	
	<bean id="springControllerResolver"   class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
		<property name="mappings">
		    <props>
                       <prop key="/mountPesquisaCentroCusto.do">mountPesquisaCentroCusto</prop> 
                     <prop key="/mountPesquisaUnidadesCentroCusto.do">getUnidadesCentroCusto</prop>                                             
		    </props>
		</property>
	</bean>
	
</beans>

controller.xml…

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
            
    <bean id="pesquisaCentroCustoController"  class="br.com.dix.intranet.controller.PesquisaCentroCustoController">
    	<property name="methodNameResolver" ref="springControllerResolver"/>		 			
    </bean>     
</beans>

e minha classe PesquisaCentroCustoController…

public class PesquisaCentroCustoController extends MultiActionController
{
		
	
	public ModelAndView getUnidadesCentroCusto(HttpServletRequest request, HttpServletResponse response) 
	throws Exception
	{			
                /*seu codigo aqui...*/ 
		return new ModelAndView("pesquisaCentroCustoDiretoriasForm");
	}
	
	
	public ModelAndView mountPesquisaCentroCusto(HttpServletRequest request, HttpServletResponse response) 
	throws Exception
	{
		/*seu codigo aqui*/               
		return new ModelAndView("pesquisaCentroCustoDiretoriasForm");
	}

e na sua URL ficaria assim…

http://localhost:9080/suaApp/mountPesquisaCentroCusto.do

e o outro metodo assim…

http://localhost:9080/suaApp/mountPesquisaUnidadesCentroCusto.do

Espero q tenha ajudado, qualquer duvida posta aqui…

Falow !!! :wink:

lipe82

Oi João, vc pode dar uma olhada no meu código, não tá aparecendo nada na tela qd eu acesso http://localhost:9080/springapp/consultar.do

Qual o nome da minha jsp deve ter?

springapp-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- the application context definition for the springapp DispatcherServlet -->

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    	<!-- 'messages' é o nome do arquivo messages.properties -->
        <property name="basename" value="messages"/>
    </bean>

    <!-- isso implica que as páginas serão /WEB-INF/jsp/productinsert.htm.jsp -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.Exception">error</prop>
			</props>
		</property>
	</bean>
    
    <!-- comporta-se como o DispatchAction -->
	<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/consultar.do">productFormController</prop>
			</props>
		</property>
	</bean>
	<bean id="springControllerResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
		<property name="mappings">
			<props>
				<prop key="/consultar.do">consultar</prop>
			</props>
		</property>
	</bean>
	<bean id="productFormController" class="springapp.web.ProductFormController">
		<property name="methodNameResolver" ref="springControllerResolver"/>
	</bean>

</beans>

ProductFormController.java

package springapp.web;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import springapp.service.ProductManager;

public class ProductFormController extends MultiActionController {

    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());

    private ProductManager productManager;

    public ModelAndView consultar(HttpServletRequest request, HttpServletResponse response) 
    throws Exception {
    	
    	System.out.println("We are inside ProductFormController.consultar() !!");
    	
        String now = (new java.util.Date()).toString();
        logger.info("returning hello view with " + now);
        
        Map<String, Object> myModel = new HashMap<String, Object>();
        myModel.put("now", now);
        myModel.put("products", this.productManager.getProducts());
        
        return new ModelAndView("consultar");
    }

    public ModelAndView inserir(HttpServletRequest request, HttpServletResponse response) 
    throws Exception {
    	
    	System.out.println("We are inside ProductFormController.inserir() !!");
    	
        String now = (new Date()).toString();
		
		logger.info("Returning hello view with " + now);
		
		return new ModelAndView("hello1");
    }

    public void setProductManager(ProductManager productManager) {
        this.productManager = productManager;
    }
}
joaosouza

Olá blz…

No retorno de seu metodo consultar return new ModelAndView("consultar");

Ao colocar como parametro a String “consultar”, vc terá que ter um arquivo consultar.jsp no diretorio em que definiu onde eles estariam no bean “viewResolver” declarado no spring-servlet.xml…

Vc já tentou debugar para ver se ocorre algum erro ??? caso ocorra posta ele aqui…

Aparentemente está tudo certo…

Falow !!!

lipe82

Nussa, o pior é q vc não sabe… o resto da minha aplicação q eu fiz antes sem usar o PropertiesMethodNameResolver não está funcionando mais, eu tenho mais coisas no springapp-servlet.xml e tenho um applicationContext.xml
Será que ele funciona com os dois tipos de configuração?

Vc tem alguma luz? Vlw…

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- the application context definition for the springapp DispatcherServlet -->

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    	<!-- 'messages' é o nome do arquivo messages.properties -->
        <property name="basename" value="messages"/>
    </bean>

    <!-- isso implica que as páginas serão /WEB-INF/jsp/productinsert.htm.jsp -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.Exception">error</prop>
			</props>
		</property>
	</bean>

    <bean name="/hello.htm" class="springapp.web.InventoryController">
        <property name="productManager" ref="productManager"/>
    </bean>

    <bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController">
        <property name="sessionForm" value="true"/>
        <property name="commandName" value="priceIncrease"/>
        <property name="commandClass" value="springapp.service.PriceIncrease"/>
        <property name="validator">
            <bean class="springapp.service.PriceIncreaseValidator"/>
        </property>
        <property name="formView" value="priceincrease"/>
        <property name="successView" value="hello.htm"/>
        <property name="productManager" ref="productManager"/>
    </bean>

	<bean name="/productinsert.htm" class="springapp.web.ProductInsertFormController">
        <property name="sessionForm" value="true"/>
        <property name="commandName" value="productInsert"/>
        <property name="commandClass" value="springapp.domain.Product"/>
        <property name="validator">
            <bean class="springapp.service.ProductInsertValidator"/>
        </property>
        <property name="formView" value="productinsert"/>
        <property name="successView" value="hello.htm"/>
        <property name="productManager" ref="productManager"/>
    </bean>

    <bean name="/productedit.htm" class="springapp.web.ProductEditFormController">
        <property name="sessionForm" value="true"/>
        <property name="commandName" value="productEdit"/>
        <property name="commandClass" value="springapp.domain.Product"/>
        <property name="validator">
            <bean class="springapp.service.ProductEditValidator"/>
        </property>
        <property name="formView" value="productedit"/>
        <property name="successView" value="hello.htm"/>
        <property name="productManager" ref="productManager"/>
    </bean>

    <!-- comporta-se como o DispatchAction -->
	<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/consultar.do">productFormController</prop>
			</props>
		</property>
	</bean>
	<bean id="springControllerResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
		<property name="mappings">
			<props>
				<prop key="/consultar.do">consultar</prop>
			</props>
		</property>
	</bean>
	<bean id="productFormController" class="springapp.web.ProductFormController">
		<property name="methodNameResolver" ref="springControllerResolver"/>
	</bean>

</beans>
lipe82

Coloquei o consultar.jsp dentro da pasta jsp e ele nem chega lá, tb não passa pela classe java.
Nussa, vc tem uma luz?

Vlw…

lipe82

Oi, alguém tem algum exemplo com PropertiesMethodNameResolver?

Ainda não consegui fazer esse método funcionar…

Obrigado galera

lipe82

Oi pessoal, alguém tem alguma luz pra mim ai…?
Obrigado

lipe82

Oi galera, descobri, faltava implementar o bean…

<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/consultar.htm">ipNodeDetailsController</prop> </props> </property> </bean>

Criado 4 de junho de 2008
Ultima resposta 5 de jun. de 2008
Respostas 8
Participantes 2