Vraptor 3 + vários submits

6 respostas
B

Olá galera

Estou iniciando em Vraptor e estou uma dúvida. Tenho o seguinte modelo:

@Entity
public class Projeto {
	
	@Id@Column(nullable = false, length = 50)
	private String nome;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
}

Bem Simples.
E o seguinte controller:

@Resource
public class ProjetoController {

	private Result result;
	
	public ProjetoController(Result result){
		this.result = result;
	}
	
	public void insert(Projeto projeto){
		new ProjetoDao().insert(projeto);
		result.use(Results.logic()).redirectTo(ProjetoController.class).list();
	}
	
	public void delete(Projeto projeto){
		new ProjetoDao().delete(projeto);
		result.use(Results.logic()).redirectTo(ProjetoController.class).list();
	}
	
	public void update(Projeto projeto){
		new ProjetoDao().update(projeto);
		result.use(Results.logic()).redirectTo(ProjetoController.class).list();
	}
	
	public List<Projeto> list(){
		return new ProjetoDao().list();
	}
	
}

O list.jsp, que está funcionando perfeitamente:

<table border="1" width="100%" cellpadding="10">
	<tr>
	
		<td width="30%" valign="top">
		<form action="insert"/>
			Projeto: <br><input name="projeto.nome"/><br>
			<input type="submit"/>	
		</form>
		</td>
		
		<td width="70%" valign="top">
		<table border="1" align="center" width="100%">
		<tr><th>Nome do Projeto</th></tr>
		<c:forEach var="projeto" items="${projetoList}">
			<tr><td>${projeto.nome}</td></tr>
		</c:forEach>
		</table>
		</td>
	
	</tr>
	</table>

Com este jsp eu insiro novos projetos no banco e listo em outro quadro.

Só que agora eu quero ter vários submits e usar o mesmo formulário para os métodos “delete” e “update”. Talvez eu consiga por javascript mas idéia é não usá-lo.

Como não achei mais nenhuma idéia, pensei em fazer o seguinte:

public void metodo(int m, Projeto projeto){
		if (m == 1){
			insert(projeto);
		}
		if (m == 2){
			delete(projeto);
		}
		...
		
	}

E assim associar no jsp:

<form action="metodo"/>
	Projeto: <br><input name="projeto.nome"/><br>
	<input type="submit"/>	
</form>

Porém não sei como passar os parâmetros. Não sei como passar o “m” e não sei se Vraptor pegará o “projeto.nome” e popular um objeto do tipo Projeto.
Alguém já fez isso ou tem alguma idéia de como fazer? Ou um outro jeito q não seja esse…
VALEU!!!

6 Respostas

G
bruno.ribeiro:
Porém não sei como passar os parâmetros. Não sei como passar o "m" e não sei se Vraptor pegará o "projeto.nome" e popular um objeto do tipo Projeto. Alguém já fez isso ou tem alguma idéia de como fazer? Ou um outro jeito q não seja esse... VALEU!!!

Por padrão o vraptor faz o parametro do seu método seguido das propriedades. No caso se você tem um método foo(Bar bar) e supondo que dentro da classe bar você tem uma propriedade nome, ele injeta automatico caso você usar no JSP bar.nome. No seu caso, projeto.nome será injetado caso seu método possuir o parametro projeto. Nesse caso você tem, tudo ok então.

Porém, desculpe a sugestão, mas você poderia separar as funções, não? Faz um método delete e outro store, que você acha? Vou te passar um exemplo meu. Nesse caso o método de edição é o mesmo quando o objeto está sendo inserido como quando ele é carregado para edição. Assim como o store é o mesmo para persistir a inclusão ou alteração. Removi os javadocs para ficar menor para postar aqui.

@Resource
public class DegreeController {

	private final CommonService commonService = ServiceLocator.getEJB(CommonService.class);
	private final Result result;

	public DegreeController(Result result) {
		this.result = result;
	}

	@Path("/admin/degree/")
	public void list() {
		result.use(Results.logic()).forwardTo(getClass()).list(new Paging());
	}

	@Path("/admin/degree/page-{paging}/")
	public void list(Paging paging) {
		result.include("degreeList", commonService.findDegrees(paging));
	}

	@Path("/admin/degree/new/")
	public void editNew() {
		result.use(Results.logic()).forwardTo(getClass()).edit(null);
	}

	@Path("/admin/degree/edit/{id}/")
	public void edit(Long id) {
		if (id != null) {
			result.include("degree", commonService.loadDegree(id));
		}
	}

	@Path("/admin/degree/store/")
	public void store(DegreeDTO degree) {
		commonService.storeDegree(degree);
		result.use(Results.logic()).redirectTo(getClass()).list();
	}

	@Path("/admin/degree/delete/{id}/")
	public void delete(Long id) {
		commonService.deleteDegree(id);
		result.use(Results.logic()).redirectTo(getClass()).list();
	}
}

E o meu JSP de edição, que é o mesmo para novo registro como atualização:

<w:form action="/admin/degree/store/" method="post">
		<w:hidden name="degree.id" />
		<w:text name="degree.name" size="40" />
		<w:button value="button.back" onclick="document.location = '/admin/degree/'" />
		<w:submit value="button.store" />
	</w:form>

Tentei reduzir o código para postar aqui, mas você vai entender bem, está super intuitivo. Qualquer dúvida, avise.

B

Opa Garcia

Pelo que vi, vc usou EJB, o que é desconhecido para mim, hehe. Mas consegui acompanhar a lógica do código. Vou pesquisar pra entender melhor o EJB.

Valeu!!!

B

É, como o meu propósito é estudo, preferi ainda não tentar com EJB. Mas consegui fazendo as seguintes alterações:

No JSP:

<form action="action"/>
	Projeto: <br><input name="projeto.nome"/><br>
	<input type="submit" name="insert" value="insert"/>
	<input type="submit" name="delete" value="delete"/>
</form>

No controller:

@RequestScoped
@Resource
public class ProjetoController {

	private Result result;
	private ProjetoDao dao = new ProjetoDao();
	private HttpServletRequest request;
	
	public ProjetoController(Result result, HttpServletRequest request) throws Exception{
		this.result = result;
		this.request = request;
	}
	
	public void action(Projeto projeto){
		if (request.getParameter("insert") != null){
			dao.insert(projeto);
		}
		if (request.getParameter("delete") != null){
			dao.delete(projeto);
		}
		result.use(Results.logic()).redirectTo(getClass()).list();
	}
	
	public List<Projeto> list(){
		return new ProjetoDao().list();
	}
}

Funcionou certinho!!!

Lucas_Cavalcanti

bruno, tem um jeito mais legal de fazer isso…

por padrão você não vai receber nunca HttpServletRequest no seu controller…

dá uma olhada nessa parte da documentação: http://vraptor.caelum.com.br/documentacao/resources-rest/

o que você pode fazer:

coloca a action do form para “/projetos”:

<form action="<c:url value="/projetos"/>"/>

crie os botões assim:

<button type="submit" name="_method" value="POST">Insere</button>
<button type="submit" name="_method" value="DELETE">Remove</button>

isso vai “mudar” o método HTTP da requisição, daí você consegue fazer no seu controller:

@Resource  
public class ProjetoController {  
    //...
    @Path("/projetos")
    @Post
    public void insere(Projeto projeto) {
         // insere o projeto
    }

    @Path("/projetos")
    @Delete
    public void remove(Projeto projeto) {
       //remove o projeto
    }
}

Entendeu?

[]'s

B

Entendi sim lucas, show hein!!!

Eu tinha lido esse capítulo na apostila mas acho q não tinha compreendido o propósito :slight_smile:

Valeu!!!

R

Lucas Cavalcanti:
bruno, tem um jeito mais legal de fazer isso…

por padrão você não vai receber nunca HttpServletRequest no seu controller…

dá uma olhada nessa parte da documentação: http://vraptor.caelum.com.br/documentacao/resources-rest/

o que você pode fazer:

coloca a action do form para “/projetos”:

<form action="<c:url value="/projetos"/>"/>

crie os botões assim:

<button type="submit" name="_method" value="POST">Insere</button>
<button type="submit" name="_method" value="DELETE">Remove</button>

isso vai “mudar” o método HTTP da requisição, daí você consegue fazer no seu controller:

@Resource  
public class ProjetoController {  
    //...
    @Path("/projetos")
    @Post
    public void insere(Projeto projeto) {
         // insere o projeto
    }

    @Path("/projetos")
    @Delete
    public void remove(Projeto projeto) {
       //remove o projeto
    }
}

Entendeu?

[]'s

Lucas,

E para criar os dois botões: Salvar, Salvar e continuar.
Que vão fazer a mesma ação POST, mas terão lógicas de redirecionamento diferentes. Tem alguma lógica “pré-ponta” ou só interceptando a ação no JS?

Criado 20 de outubro de 2009
Ultima resposta 24 de mai. de 2012
Respostas 6
Participantes 4