Struts2+Tiles2+annotation

Estou utilizando struts2 + tiles2 por annotation, fica a seguinte configuração em minha action:

    @TilesDefinitions(value = { 
    		@TilesDefinition (name = "baseLayout", template="/css/baseLayout.jsp", putAttributes = {
    				@TilesPutAttribute(name = "title", value = "Portal do Requerente"),
    				@TilesPutAttribute(name = "body", value = "conteudo da pagina"),
    			}
    		),
		
		@TilesDefinition (name = "loginRequerente", extend="baseLayout", putAttributes = {
				@TilesPutAttribute(name = "body", value = "/login/login_requerente/login.jsp"),
			}
		)
})

O método estou achando assim:

@Action(value = "inicio", results = @Result(name = "loginRequerente", type="tiles"))
public String loginRequerente(){
	return "loginRequerente";
}

Ou seja, quando eu chamar o ação inicio na tela irá me retornar “loginRequerente” na action do tipo tiles.
No tiles eu defini que o “loginRequerente” iria substituir a tag “body” com a página lá.

Sendo pelo annotation parece que ele não está achando o “loginRequerente”, ele só exibe o que está na baseLayout.jsp.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee" version="2.5">
	<listener>
      <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
   </listener>

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <init-param>
      <param-name>struts.devMode</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
		<filter-name>UTF8Filter</filter-name>
		<filter-class>utils.UTF8Filter</filter-class>
  </filter>
  <filter-mapping>
		<filter-name>UTF8Filter</filter-name>
		<url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
   <welcome-file>/blank.jsp</welcome-file>
  </welcome-file-list>
  <session-config>
  	<session-timeout>20</session-timeout>
  </session-config>
</web-app>

No struts.xml eu adicionei o tiles-default.

Cara, nunca vi tiles com anotações. Vivendo e aprendendo.
De qualquer forma, o título é alterado ou não?

Óbvio que fui pesquisar.
Esta thread tem informações bem bacanas sobre isso.

Então cara, eu estava fazendo via xml com o tiles.xml, só que deu ruim aqui na minha máquina e não estou conseguindo mais fazer por xml. Talvez alguma configuração que eu perdi e não lembro como faz.

E estudando muito, achei essa solução via annotation. E funcionou.
Sendo que ele só exibe o que está na baseLayout.jsp

É como se ele não encontrasse o retorno loginRequerente na configuração do tiles.

Entendi.
Dá uma olhada nessa trhead, tem umas informações bacanas ali.
Aliás, por que struts 2? Ele é bem chatinho em aspectos como as anotações.

Eu já havia visto esse link, confesso que não me ajudou muito.

Eu comecei a mexer com tiles tem uns dois dias, eu havia conseguido fazer via xml. Só que deu problema no projeto e eu perdi tudo que havia feito. Agora estou tentando reaver só que não consigo, quando tento via xml ele nem lê o xml, da erro.

Aí eu estudando e pesquisando muito, consegui fazer rodar via annotation, só que ele só abre a tela do baseLayout, parece que ele não lê no tiles o retorno da ação que é loginRequerente para substituir o body pela página.

Obs.: Respondendo a sua pergunta sobre struts2, é que eu já conhecia o Struts 1, e estava precisando fazer uma pequeno projeto em 15 dias, era só um projetinho de consulta interna aqui na empresa, então 3 dias estudando Struts2 consegui fazer o projeto, só que o chefe pediu para usar a mesma estrutura no projeto maior porque ele gostou e tal. No inicio tive alguns problemas com annotation e comecei fazendo via struts.xml, só que agora já faço tudo via annotation. E agora estou estudando o tiles para struts. E só falta esse detalhe para funcionar.

Puts, rapaz.
Se tivesse peerguntado aqui, diriam para usar Spring Boot + Spring MVC. Tão simples quanto e muito melhor em termos de facilidade de desenvolvimento.

Além disso, Struts 1 é 100% diferente do Struts 2.

Sobre não rodar com o xml do tiles, tem aqueles esquemas específicos para que ele seja incluído na leitura do projeto, no momento da execução e, então, possa funcionar (sem falar das dependências dele, né?)
Agora, eu notei que nessa thread que sugeri existe o seguinte comentário:

  1. Use your target tile definition, location="tiles-definition-name" , instead of JSP page, location="/jsp/userLogin.jsp" , in your result location

E percebi que você está usando:

@Action(value = "inicio", results = @Result(name = "loginRequerente", type="tiles"))

O que é um tanto diferente.

Sim sim Strus1 é muito diferente do Strus2. Mais é que não tive tento para estudar nada nem perguntar nada. Estava tendo uma cobrança alta aqui da empresa…enfim…

Eu fiz algumas alterações no código e funcionou.

Nas anotações do tiles estava assim:

@TilesDefinition (name = "loginRequerente", extend="baseLayout", putAttributes = {
				@TilesPutAttribute(name = "body", value = "/login/login_requerente/login.jsp"),
			}
		)

Onde extendia baseLayout. Como eu vi em vários tutoriais funcionando. Agora eu alterei para isso:

@TilesDefinition (name = "loginRequerente", template="/css/baseLayout.jsp", putAttributes = {
				@TilesPutAttribute(name = "title", value = "Mudança"),
				@TilesPutAttribute(name = "body", value = "/login/login_requerente/login.jsp"),
			}
		)

Onde eu chamo o template direto.

E no retorno da Action eu botei assim:

@Action(value = “inicio”, results = @Result(name = “loginRequerente”, type=“tiles”, location=“loginRequerente”))

E funcionou. Vou acabar usando assim mesmo.

Sobre o xml, diante de todas as configurações que vi na web, eu testei todas que encontrei e da sempre erro de nullpointer no doExecute do TilesResult que eu não soube solucionar, foi quando consegui via annotation.

Não sei se é a forma ideia, acho que não. Talvez da forma de extender o baseLayout seria o mais apropriado, mais estou sem tempo para estudar, conforme irei usando, vou aprendendo e modificando.

Obrigado por todo a ajuda Darlan.

Obs.: Não estou conseguindo botar as linhas de código como código, então coloquei como citação.

Isso é o que importa.

Muito normal.

E agora para tu fica também o aprendizado de Tiles via annotation, porque para mim também foi aprendizagem…hahahahaha

E mais uma vez obrigado pela ajuda.

Faz séculos que não uso struts 2. Gosto muito, mas, to em outras tecnologias.
Agora, essa do tiles me surpreendeu.