Acessar método de Controller interceptado [Resolvido]

Tarde pessoal!

Como faço para acessar um método de um Controller que está interceptado?

Exemplo:

Tenho a classe ImovelController, e nela tenho o método de listar imóveis, mas queria que o método além de estar disponivel para quem se loga no sistema, estar disponivel na página inicial, assim a pessoa poderá ver os imóveis à venda ou para alugar.
Pelo Accepts só dá ra liberar uma classe Controller.

Abraço!

[quote=Guevara]Tarde pessoal!

Como faço para acessar um método de um Controller que está interceptado?

Exemplo:

Tenho a classe ImovelController, e nela tenho o método de listar imóveis, mas queria que o método além de estar disponivel para quem se loga no sistema, estar disponivel na página inicial, assim a pessoa poderá ver os imóveis à venda ou para alugar.
Pelo Accepts só dá ra liberar uma classe Controller.

Abraço![/quote]

vc esta confundido as coisas não ??

@Intercepts public MeuInterceptor implements Interceptor { public boolean accepts(ResourceMethod method) { return true;// assim por exemplo vc aceita o interceptor em todo lugar... } }

mas o que exatamente vc quer fazer ?? que não esta conseguido fazer ??

se quer a lista disponivel na pagina principal, então pq nao faz um

result.include(l"ista", imovelDal.lista());

dentro da sua pagina principal?

não necessariamente estou falando que tem q ser um dao, pode ser outro tipo de pattern no acesso a lista

E ai Lavieri!!

Perguntei isso devido a esta saida:

19:27:34,406 DEBUG [DefaultResourceTranslator] trying to access /venda
19:27:34,406 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: ImovelController.vendasImovelController.vendas()]
19:27:34,412 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
19:27:34,414 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
19:27:34,416 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor LoginFuncionarioInterceptor
19:27:34,424 DEBUG [DefaultLogicResult  ] redirecting to class IndexController
19:27:34,425 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for IndexController.index() as []
19:27:34,425 DEBUG [DefaultLogicResult  ] redirecting to /Imobiliaria/
19:27:34,426 DEBUG [VRaptor             ] VRaptor ended the request
19:27:34,438 DEBUG [VRaptor             ] VRaptor received a new request
19:27:34,447 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
19:27:34,455 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
19:27:34,455 DEBUG [DefaultResourceTranslator] trying to access /
19:27:34,455 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: IndexController.indexIndexController.index()]
19:27:34,461 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
19:27:34,463 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
19:27:34,467 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor InstantiateInterceptor
19:27:34,485 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
19:27:34,486 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: IndexController.indexIndexController.index()] are []
19:27:34,501 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
19:27:34,501 DEBUG [ExecuteMethodInterceptor] Invoking IndexController.index()
19:27:34,506 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor OutjectResult
19:27:34,515 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
19:27:34,515 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
19:27:34,522 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/index/index.jsp
19:27:34,522 DEBUG [DefaultStaticContentHandler] Deferring request to container: /Imobiliaria/WEB-INF/jsp/index/index.jsp 
19:27:34,529 DEBUG [VRaptor             ] VRaptor ended the request

O método de listar imóveis está dentro da classe ImóvelController, e como essa classe está interceptada para apenas usuário logado acessar, não consigo ir para a página de vendas com a lista de imóveis sem estar logado. Do jeito que está só consigo ver a listagem logado.

Fiz como vc postou, e ao clicar no menú, o Interceptor me redireciona para a Index. =/

Meu Accepts está assim:

public boolean accepts(ResourceMethod method) {
	    ResourceClass resource = method.getResource();
	    return !LoginController.class.isAssignableFrom(resource.getType()) 
	    && !IndexController.class.isAssignableFrom(resource.getType());	    
	    //return !resource.getType().isAssignableFrom(resource.getType());
	}	

Tõ liberando o Controller de Login e a da Index.

Abraço!

Acho que a arquitetura que esta errada… vamo lá…

pq o método listar imoveis, esta dentro do ImoveisController se vc também precisa dele fora do ImovelController ??

quando vc chega neste ponot, é hora de rever a arquitetura, e mover as coisas para outro lugar…

VRaptor é feito para auxiliar em uma arquitetura MVC

tanto o proprio VRaptor como o seu ImovelController fazem parte do controle, portanto não devem conter a lógica de negocio dentro deles…

como solucionar isso ??

[code]@Component
public class ImovelLogic {

public ImovelLogic(… coloque aqui as dependencias necessárias, exemplo daos, sessions, ou outras coisas … ) {
}

public List<Imovel> listar() {
//estou fazendo um exemplo com uma session, mas podia ser de outra forma
return (List<Imovel>)session.createCriteria(Imovel.class).list();
}

//...
//vários outros métodos que estajam ligados a lógica de imoveis.

}[/code]

pronto agora vc tem um componente que pode ser injetado dentro de seus controles, esse componente é parte do modelo, e portanto é ele que contém a lógica do negocio

[code]
@Resource
public class IndexController {
//… varios campos

public IndexController(... vários componentes ..., ImovelLogic imovelLogic) {
     //...
    this.imovelLogic = imovelLogic;
}

public void index() {
    //... outros códigos necessários
    result.include("imovelList",imovelLogic.listar());
}

//mais métodos...

}[/code]

la no seu ImovelController vc faz o mesmo puxa o componente imovellogic pois vc vai precisar dele…

espero ter ajudado…

não vejo como essa sua lista pode ser feita através de interceptors…

a dúvida do Guevara era sobre como interceptar métodos específicos, e não só a classe inteira…

tem um exemplo de como fazer isso na apostila do vraptor:
http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/

no final do capítulo de autenticação e autorização, usando anotações personalizadas pra fazer o accepts do interceptor

aqui há outro exemplo de fazer interceptors com anotações

http://vraptor.caelum.com.br/cookbook/interceptando-recursos-anotados/

mas a minha duvida é se é necessário interceptar para fazer o que ele esta querendo fazer ^^ … talvez não seja tão necessario

Obragado Lucas e Lavieri!
Fiz como está na apostila, era aquilo que eu tava precisando mesmo, anotar os métodos que são restritos para usuário logado, e o que não estiver anotado qualquer usuário poderá usar, porém a lista não está sendo mostrada na página venda.jsp.

Em Imovelcontroller fiz o result.include() para a página Venda.jsp:

@Path("/venda")
	public void venda() {
		result.include("imovel", imovelDao.lista());
	}

E no LoginFuncionarioInterceptor está assim:

public boolean accepts(ResourceMethod method) {
	    ResourceClass resource = method.getResource();
	    return 
	    !funcionarioLogado.isLogged() && method.containsAnnotation(Restrito.class)
	    && !LoginController.class.isAssignableFrom(resource.getType()) 
	    && !IndexController.class.isAssignableFrom(resource.getType());
	}	

Minha tabela para mostrar a lista:

<display:table name="${imovelList}" pagesize="5" id="imovel" requestURI="/Imobiliaria/imovel/lista">
 <display:column>${imovel_rowNum}</display:column>
 <display:column title="Imagem"><img src="<c:url value="/imovel/${imovel.idImovel}/imagem"/>" width="100" height="100"/></display:column>  
  <display:column property="codImovel" title="Codigo" />
  <display:column property="titulo" title="Titulo" />
  <display:column property="bairro" title="Bairro" />
  <display:column property="valor" title="Valor" />
  <display:column property="area" title="Área" />    
</display:table>

Apenas copiei essa tabela da página lista.jsp e colei na página venda.jsp, sem os links para alterar e excluir.

A saida é esta:

21:37:28,481 DEBUG [VRaptor             ] VRaptor received a new request
21:37:28,592 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
21:37:28,749 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
21:37:28,751 DEBUG [DefaultResourceTranslator] trying to access /venda
21:37:28,787 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: ImovelController.vendaImovelController.venda()]
21:37:28,821 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
21:37:28,832 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
21:37:28,851 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor InstantiateInterceptor
21:37:30,565 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
21:37:30,570 DEBUG [AsmBasedTypeCreator ] Trying to make class for ImovelController$venda$1387602019$1
21:37:30,594 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ImovelController.venda() as []
21:37:30,594 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: []
21:37:30,595 DEBUG [AsmBasedTypeCreator ] Methods: []
21:37:30,595 DEBUG [AsmBasedTypeCreator ] Fields: []
21:37:30,595 DEBUG [CacheBasedTypeCreator] cached generic type for method [DefaultResourceMethod: ImovelController.vendaImovelController.venda()]
21:37:30,607 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ImovelController.venda() as []
21:37:30,608 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: ImovelController.vendaImovelController.venda()] are []
21:37:30,655 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
21:37:30,656 DEBUG [ExecuteMethodInterceptor] Invoking ImovelController.venda()
Hibernate: 
    select
        this_.id_imovel as id1_0_0_,
        this_.area as area0_0_,
        this_.bairro as bairro0_0_,
        this_.cep as cep0_0_,
        this_.cidade as cidade0_0_,
        this_.cod_imovel as cod6_0_0_,
        this_.descricao as descricao0_0_,
        this_.dt_inclusao as dt8_0_0_,
        this_.endereco as endereco0_0_,
        this_.estado as estado0_0_,
        this_.medida as medida0_0_,
        this_.pais as pais0_0_,
        this_.status as status0_0_,
        this_.titulo as titulo0_0_,
        this_.valor as valor0_0_ 
    from
        Imovel this_
21:37:30,736 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor OutjectResult
21:37:30,750 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
21:37:30,751 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
21:37:30,778 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/imovel/venda.jsp
21:37:30,796 DEBUG [DefaultStaticContentHandler] Deferring request to container: /Imobiliaria/WEB-INF/jsp/imovel/venda.jsp 
21:37:32,869 DEBUG [VRaptor             ] VRaptor ended the request

Anotei os métodos que queria como restritos e deixei apenas o método de listar sem anotação.

Deveria ter mostrado não os dados não?

Abraço!

se vc deu um result.include(“imovel”, imovelDao.lista());, vc vai acessar na jsp com ${imovel}, não com ${imovelList}

se vc fizer result.include(“caramunholas”, imovelDao.lista());
na jsp vc vai acessar a lista de imóveis com ${caramunholas}

Era isso!!
Valeu Lucas!!! :smiley:

Opa!Beleza pessoal!
Tô tentando implementar a dica do Lavieri aqui. Criei um componente FilmeLogic e fiz a injeção no FilmeController:

FilmeLogic:

@Component
public class FilmeLogic {

	private FilmeDAO filmeDao;
	
	public FilmeLogic() {		
	}

	public List<Filme> lista() {
		return filmeDao.lista();
	}	

}

Injetando no FilmeController:

@Resource
public class FilmeController {

private final Result result;
private final FilmeDAO filmeDao;
private Validator validator;
private FilmeLogic filmeLogic;


@Path("/filme")
public void formulario() {	
	result.include("genero", filmeLogic.lista());
	}

public void lista() {
	result.include("filme", filmeLogic.lista());
}

    @Autowired()	
	public FilmeController(Result result, FilmeDAO filmeDao, Validator validator, FilmeLogic filmeLogic) {
	    this.result = result;
	    this.filmeDao = filmeDao;
	    this.validator = validator;
	    this.filmeLogic = filmeLogic;
	}

Pelo que eu entendi seria assim né? Mas estou com este erro:

root cause

java.lang.NullPointerException
	br.com.bruno.jmovie.component.FilmeLogic.lista(FilmeLogic.java:19)
	br.com.bruno.jmovie.controller.FilmeController.formulario(FilmeController.java:39)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:50)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(Spr

Pra popular o comboBox do formulário tô fazendo assim:

<c:forEach var="genero" items="${filmeLogicList}">
	<li><label for="genero">G&ecirc;nero
	</label>
	<div><select class="element select medium"
		name="genero.nome">
		<option value="" selected="selected"></option>
		<option value="${genero.id}">${genero.nome}</option>  
		</select></div>	
	</li>
</c:forEach>

Onde eu estaria errando?

Abraço!

vc precisa receber o FilmeDao no construtor do seu FilmeLogic…

Consegui popular o combobox Lucas!

Mas está salvando o Filme sem o gênero:

Estou enviando a lista de gêneros para o formulário desta forma:

@Path("/filme")
public void formulario() {
	result.include("genero", generoDao.lista());
	}

No formulário de Filme está assim o combobox:

<li><label for="genero">G&ecirc;nero</label>	
	<select id="genero" name="genero">
		<option value="" selected="selected"></option>					
		<c:forEach var="genero" items="${genero}">		
		<option value="${genero.id}">${genero.nome}</option>  
		</c:forEach>
	</select>
	</li>

Colocando esta validação:

that(!filme.getGenero().isEmpty(),"filme.genero","genero.obrigatorio");		

Tenho esta saida:

Hibernate: 
    select
        this_.id as id2_0_,
        this_.nome as nome2_0_ 
    from
        Genero this_
15/04/2010 16:52:14 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at br.com.bruno.jmovie.controller.FilmeController$1.<init>(FilmeController.java:49)
	at br.com.bruno.jmovie.controller.FilmeController.adiciona(FilmeController.java:46)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:50)
	... 37 more

Ou seja, o combobox é populado, pois estou cadastrando os gêneros em outro formulario e outra tabela do banco, mas não está salvando o que está no combobox populado, pq se eu remover a validação ele grava o filme sem o gênero. =/

Abraço!!

troca o name do select pra filme.genero:

<select id="genero" name="filme.genero"> 

Consegui!

Ficou assim o ComboBox populado e permitindo a gravação dos gêneros:

<li><label for="genero">G&ecirc;nero</label>	
	<select id="genero" name="filme.genero">
		<option value="" selected="selected"></option>					
		<c:forEach var="genero" items="${genero}">		
		<option value="${genero.nome}">${genero.nome}</option>  
		</c:forEach>
	</select>
	</li>

Têm que ser com ${genero.nome}, se for ${genero.id} salva a ID do gênero. Vacilei nessa tb. =/

Segui a dica do Lavieri para criar a classe FilmeLogic, porém eu percebi que poderia criar uma classe GeneroController onde teria o método de listar gêneros, além de outros como adicionar e remover gêneros, e para permitir a listagem de filmes sem depender do FilmeController eu fiz o método lista() na IndexController injetando o FilmeDAO. Então ao clicar no menú de listagem lá na Index sou redirecionado a uma página lista() cuja listagem de filmes vêm do IndexController injetado com FilmeDAO.

A IndexController ficou assim:

@Resource
public class IndexController {
	
	
	private Result result;
	private FilmeDAO filmeDao;
	public IndexController(FilmeDAO filmeDao, Result result) {
		
		this.result = result;
		this.filmeDao = filmeDao;
	}
@Path("/index")	
	public void index() {
	}	
	
	public void lista() {
		result.include("filme", filmeDao.lista());
	}
	
}

Obrigado pela ajuda Lucas! :smiley: