Historico com vraptor

8 respostas
jingle

Olá estou tentando fazer um historico pra saber as paginas que carreguei e poder usar o voltar de uma forma melhor que o javascript que volta (chamando método que foi chamado para carregar a tela e passando os parametros que foi passado.).

tentei fazer da seguinte forma criei um objeto historyinfo que deixo sessionscoped e nele tem uma lista de history.

dai no meu interceptor faço da seguinte forma
para guardar o método stack e tudo mais que for preciso.

this.historyInfo.getLocalHistory().add(0, new History(stack, method, resourceInstance));

e quando quero voltar no history faço assim:

@Path("/localHistory/{historyNum}")
	public void localHistory(Integer historyNum) {
		// tentando ir pra coisa.
		History history = historyInfo.getLocalHistory().get(historyNum);
		history.getStack().next(history.getMethod(),
				history.getResourceInstance());	}

porém nao deu certo pois tem métodos que nao tem o result.redirect que simplesmente usa o default e assim após executar esse meu localhistory ele ia tentar ir para tela localHistory.jsp

tem alguma forma melhor de fazer isso?

8 Respostas

G

Talvez alguma coisa assim. Creio que o melhor é você guardar o método e os argumentos ao invés do resourceInstance (esse deve morrer a cada requisição(?)).

public void localHistory(Integer historyNum) {
	History history = historyInfo.getLocalHistory().get(historyNum);
	Method method = history.getMethod();
	Object[] args = history.getArgs();
	Object target = result.forwardTo(method .getDeclaringClass());

	new Mirror().on(target).invoke().method(method).withArgs(args);
}
jingle

método que tu diz seria o method mesmo né? não o resourceMethod.
e o args? não estou encontrando onde ele tira os args pra dar o invoke nesse method.

exemplo:

public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {
//aqui obtenho o método
 method.getMethod;

//onde fica os argumentos do metodo?
Lucas_Cavalcanti

receba no seu construtor um MethodInfo… e chame o getParameters

jingle

mas da onde vem os parametros? pq qndo intercepto algo ele usa o Stack.next passando o ResourceMethod e um Ojbeto que é a instancia da classe (não é isso?)

onde vou conseguir os parametros que ele usa pra chamar o metodo ?

Lucas_Cavalcanti

receba no construtor do interceptor um (MethodInfo info)…

e quando for guardar no historyInfo, guarde o info.getParameters()

public class HistoryInfoInterceptor implements Interceptor {

	private final MethodInfo info;

	public HistoryInfoInterceptor(MethodInfo info) {
		this.info = info;
	}

	public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) throws InterceptionException {
		info.getParameters(); //os parametros (args) para o método
		
	}
G

jingle, cabe algumas considerações sobre esse histórico.

Você tem que ter em mente que nem todas as páginas deve ir para o histórico. Um exemplo é um CRUD, onde você tem 4 operações básicas: listar, editar/incluir, salvar, excluir. As operações de listar e editar/incluir podem e devem ir para o histórico, porém os métodos de salvar e excluir não devem ir para o histórico, pois uma vez que você já excluiu o registro 2, por exemplo, você não tem mais como excluir novamente o 2.

Ou seja, essas operações com POST e DELETE não devem ir para seu histórico, inclusive se não me engano o Vraptor nem faz forward/redirect para métodos anotados com POST e DELETE.

Outra coisa a se pensar é a integridade de dados. Se eu estava no método que visualiza o registro 2, depois excluí o mesmo, e quando eu voltar no histórico e tentar acessar a página que visualiza o registro 2 você precisa dizer que ele não existe mais.

Lucas_Cavalcanti

Só algumas correções:

Se vc implementa o DELETE direito, ele é indepotente, ou seja, excluir um recurso uma vez, ou 100 vezes da na mesma…
Mas na prática vc está certo :wink:

o VRaptor só faz redirect para GET.

G

Lucas Cavalcanti:
garcia-jj:

Ou seja, essas operações com POST e DELETE não devem ir para seu histórico, inclusive se não me engano o Vraptor nem faz forward/redirect para métodos anotados com POST e GET.

o VRaptor só faz redirect para GET.

Lucas, deveria ser POST e DELETE. Na correria me confundi, hahahaha. Já fiz a correção no meu comentário.

Abraços

Criado 15 de julho de 2010
Ultima resposta 16 de jul. de 2010
Respostas 8
Participantes 3