Boa noite senhores,
Estou com problemas para usa o metodo addActionMessage() no Struts2
Criei uma tela para registrar os pedidos em 1 restaurante, um form bem simples com 2 campos de texto e 2 combobox, sendo a segunda dependente da primeira, até ai tudo bem (sou novo com struts2 e estou seguindo alguns tutoriais para aprender).
Ele registra no meu DB sem problemas… mas eu nao consigo fazer ele exibir uma simples mensagem de sucesso!
Eis o meu código
Pedido.jsp
<s:form action="Registrar_Pedido">
<s:textfield name="numeroDaMesa" label="Número da Mesa"/>
<s:select name="tipo" label="Tipo" emptyOption="true" list="#application.tipos"
onchange="this.form.submit()" />
<s:select name="item" label="Item" emptyOption="true" list="alimentos"
listKey="nome" listValue="nome" />
<s:textfield name="quantidade" label="Quantidade"/>
<s:submit/>
</s:form>
<s:actionmessage />
meu Listener que popula a primeira combobox
public class ApplicationListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent cse) {
try {
ControleDLO controle = new ControleDLO();
List<Alimento> alimentos = controle.ListarAlimentos();
Map<String, String> tipos = new HashMap<String, String>();
for (Alimento alimento : alimentos) {
tipos.put(alimento.getTipo(), alimento.getTipo());
}
ServletContext servletContext = cse.getServletContext();
servletContext.setAttribute("tipos", tipos);
} catch (DLOException ex) {
ex.printStackTrace();
}
}
public void contextDestroyed(ServletContextEvent arg0) {
}
}
Minha classe ActionSupport, uso ModelDriven para jogar a instancia de Pedido na pilha (meu real VO da aplicacao) e nao ter de reescrever novamente a classe.
public class PedidoAction extends ActionSupport implements ModelDriven {
private Pedido pedido;
@Override
public String execute() {
if (pedido.getItem().equalsIgnoreCase("") ||
pedido.getNumeroDaMesa() == 0 ||
pedido.getQuantidade() == 0) {
return "combo_vazia";
} else {
try {
pedido.setStatus("aberto");
pedido.setDataRegistro(new Timestamp(System.currentTimeMillis()));
ControleDLO controle = new ControleDLO();
controle.criarPedido(pedido);
addActionMessage("Pedido realizado com sucesso!");
return SUCCESS;
} catch (DLOException ex) {
ex.printStackTrace();
return ERROR;
}
}
}
public Object getModel() {
pedido = new Pedido();
return pedido;
}
}
struts.xml
<struts>
<package name="Pedido" extends="struts-default">
<action name="Montar_Pedido" class="action.SelectItemAction">
<result>/jsp/Pedido.jsp</result>
</action>
<action name="Registrar_Pedido" class="action.PedidoAction" method="execute">
<result name="success" type="chain">Montar_Pedido</result>
<result name="combo_vazia" type="chain">Montar_Pedido</result>
<result name="error">/jsp/Erro.jsp
</result>
</action>
</package>
</struts>
Tudo funciona, chamo Montar_Pedido.action… o form eh montado, e enquanto todos os dados do form nao forem preenchidos ele fica em loop (assim consegui manter a segunda combobox compativel com a escolha da primeira) e quando tudo eh preenchido… ele salva na minha base de dados sem problemas.
O problema:
- eu so consigo exibir minha "addActionMessage(“Pedido realizado com sucesso!”); " no JSP se eu manter o type do resultado como “chain”, o que pra mim nao funciona ja que junto dessa mensagem deve voltar o form limpo pronto pra uso, e o chain mantem o estado da action original… fazendo o form voltar preenchido com um pedido ja registrado.
- se eu mudar o type para qualquer outro tipo (dispatcher / redirect / redirect-action usando ou nao param) acontecem dois problemas… jogando para o JSP eu tenho um nullpointerexception, jogando para a mesma action apenas a mensagem nao aparece mas a aplicacao continua sem erros.
Agradeço desde ja toda ajuda.
Rodrigo.