como posso mapear varias ações com o método post em um mesmo controller no vraptor?
por exemplo quero ter os métodos “salvar” e “salvar e enviar”?
Cada método define uma ação.
Se você tiver dois métodos públicos no controller:
public void salvar() {}
public void salvarEEnviar() {}
Cada um deles já terá um url associada para fazer o post.
consigo fazer isso em um mesmo form sem fivar interceptando as ações via javascript? desculpa as perguntas de iniciante!!
Sem javascript não dá para fazer o mesmo form ter duas actions diferentes.
Qual o problema de usar javascript?
Você pode usar o padrão Strategy e cada botão passa como parâmetro o nome da classe que vai fazer a ação.
Algo assim:
// Form:
<form action="/apply/strategy" method="post">
// Componentes
<button type="submit" name="strategy" value="SaveStrategy">Salvar</button>
<button type="submit" name="strategy" value="SaveAndSendStrategy">Salvar e enviar</button>
</form>
Aí você cria uma interface que vai ter um método:
public interface ActionStrategy {
public void apply(...);
}
e cria as duas classes que vão fazer ações diferentes:
public class SaveStrategy implements ActionStrategy {
public void apply(...){...}
}
public class SaveAndSendStrategy implements ActionStrategy {
public void apply(...){...}
}
E ai você cria um converter para a ActionStrategy:
@Converts(ActionStrategy.class)
public class ActionStrategyConverter implements Converter<ActionStrategy> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public ActionStrategy convert(String value, Class<? extends ActionStrategy> type, ResourceBundle bundle) {
try {
String classPackage = ""; // Poe o pacote das implementações
String className = value;
return (ActionStrategy) Class.forName(classPackage + className).newInstance();
} catch (IllegalArgumentException e) {
logger.error("Unable to instantiate this action strategy, will return null.", e);
} catch (InstantiationException e) {
logger.error("Unable to instantiate this action strategy, will return null.", e);
} catch (IllegalAccessException e) {
logger.error("Unable to access this action strategy, will return null.", e);
} catch (ClassNotFoundException e) {
logger.error("This action strategy could not be found, will return null.", e);
}
return null;
}
}
Daí a sua action fica ± assim:
@Post("/apply/strategy")
public void applyStrategy(ActionStrategy strategy, /*outros parâmetros*/){
strategy.apply(...);
}
Se você for implementar isso, tome cuidado com as exceptions que podem acontecer… Trate as coisas com try{}catch{}…
Qualquer coisa grita ai!
valeu Rafael!! tinha pensado em algo parecido, boa dica vou testar depois posto os resultados