Estou aprendendo JSF, e resolvi criar um blog pra testar. Mas empaquei criando um link "delete" para cada item de uma lista iterada num facelet. Tentei de algumas formas passar o atributo id do bean do artigo iterado para o id do artigo no managed bean, mas ainda não encontrei um jeito de fazer isso. Busquei algumas alternativas no google e encontrei uma nesse post de blog: http://www.laliluna.de/articles/first-java-server-faces-tutorial.html
Mas sei lá, achei meio deslocado esse jeito... não tem um jeito melhor de intercambiar atributos entre os beans?
O Facelet está dessa forma:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich">
<ui:composition template="/template.xhtml">
<ui:define name="pageTitle"> Início</ui:define>
<ui:define name="pageHeader">
</ui:define>
<ui:define name="pageContent">
<ui:repeat var="article" value="#{articleMb.dao.enabled}" size="5">
<rich:panel>
<h:outputText styleClass="articleTitle" value="#{article.title}" />
<h:panelGroup styleClass="articleOperations" rendered="#{(request.remoteUser == article.author.email) or rich:isUserInRole('admin, moderator')}">
<h:form>
<h:inputHidden value="#{articleMb.article.id}">#{article.id}</h:inputHidden>
<h:commandLink action="#{articleMb.recycle}"><img /> Remover</h:commandLink>
</h:form>
<h:outputText value=" " escape="false" />
<h:outputLink value="#{request.contextPath}/secure/edit.jsf"><img /> Editar</h:outputLink>
</h:panelGroup>
<div class="articleInfo">
<h:outputFormat value="Postado {0, date, full} por #{article.author.name}.">
<f:param value="#{article.date}"/>
</h:outputFormat>
</div>
<rich:insert content="#{article.message}"/>
</rich:panel>
<br />
</ui:repeat>
</ui:define>
</ui:composition>
</html>
E o managed bean:
package br.com.todo.blog.managedbeans;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import br.com.todo.blog.ejb.ArticleDao;
import br.com.todo.blog.ejb.UserDao;
import br.com.todo.blog.ejb.entity.Article;
import br.com.todo.blog.ejb.entity.User;
public class ArticleMB{
@EJB(name="ArticleDao", mappedName="ArticleDao/remote")
private ArticleDao articleDao;
private Article article;
public String find(){
setArticle(articleDao.load(getArticle().getId()));
return getArticle().getId() != 0 ? "found" : "notFound";
}
public String persist(){
getArticle().setDate(new Date());
getArticle().setEnabled(true);
User author = new User();
String userId = getRemoteUser();
if(userId == null)
return "notPersisted";
author = userDao.load(userId);
getArticle().setAuthor(author);
articleDao.save(getArticle());
return "persisted";
}
public String update(){
articleDao.update(getArticle());
return "updated";
}
public String remove(){
setArticle(getDao().load(getArticle().getId()));
if(this.article == null) return "notFound";
getDao().remove(article);
return "removed";
}
public String recycle(){
setArticle(getDao().load(getArticle().getId()));
if(this.article == null) return "notFound";
getDao().recycle(article);
return "recycled";
}
public Article getArticle() {
if(article == null)
article = new Article();
return article;
}
public void setArticle(Article article) {
this.article = article;
}
public ArticleDao getDao() {
return articleDao;
}
public void setDao(ArticleDao articleDao) {
this.articleDao = articleDao;
}
public List<Article> listByAuthor() {
return articleDao.getByAuthor(getArticle().getAuthor());
}
public String removeByAuthor() {
articleDao.removeByAuthor(getArticle().getAuthor());
return "removedByAuthor";
}
private String getRemoteUser(){
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
return request.getRemoteUser();
}
}
