Jsf - url amigável redirecionada a um certo objeto

primeiramente estou abrindo este tópico pois não sei por onde começar… se vai ser um servlet, framework, etc…

To com uma grande dúvida… eu estou fazendo um site/blog onde as pessoas cadastram e fazem post…

ao entrar tem uma lista de post, e quando alguem clica em um post vai para uma página e exibe o post inteiro

então é +ou- assim;

o cara entra na index.xhtml e ve a lista de post

ai ele clica em um post e vai para abrir-post.xhtml mostrando um post

então na URL temos projeto.com.br/index.xhtml e depois projeto.com.br/abrir-post.xhtml

eu queria fazer algo assim:

projeto.com.br/index
projeto.com.br/abrir-post/aqui-o-titulo-do-post

uma pergunta… eu vi uns tópicos sobre URL amigável, mais nao eh bem isso… pq na verdade eu não tenho nem a url sem ser amigável, por exemplo eu não tenho nem abrir-post?id=1

eu teria que fazer um servlet? algo assim? como eu faço para capturar o /abrir-post/titulo-do-post e exibir o post corretamente?

meu projeto:

  • jsf 2
  • primefaces (em algumas coisas)
  • hibernate

eu uso o padrao de projeto
modelo, dao, daoimp, controller (managedbeans)

[edit] esqueci de mencionar… e uso Spring Security para autenticação dos usuários… então tudo que ta na /*.xhtml é acesso livre… /usuario e /admin é restrito

  • acredito que isso nao implica em nada…

alandiniz você consegue fazer com que tudo depois da ‘/’ Ex. ( projeto/.xhtml) não seja mostrado usando Spring Security. Ou seja
não quero deixar o usuário ver qual página está sendo passada pela URL quando ele clica em alguma ação.

Luis obrigado pela resposta rápida, vou dar uma pesquisada sobre isso que você me disse, parece ser interessante…

eu consegui achar o que preciso aqui: http://www.devmedia.com.br/artigo-java-magazine-58-quickupdate-urls-amigaveis-em-aplicacoes-web/9460

essa parte descreve exatamente o que preciso:

site.com/post/nome-do-post
convertido
site/busca.xhtml?titulo=nome-do-post

pelo que vi da pra usar servlet
mais tem essa lib urlrewrite que faz automatico… vou dar uma pesquisada maior e qlqr coisa posto aqui

se alguem tiver um exemplo simples de usar a urlrewrite por favor poste aqui, irá ajudar futuros GUJ’s members ^^

será que to fazendo gambiarra? huahua ou é o correto? muitas vezes me pergunto isso :frowning:

eu fiz o teste implementando o extends do httpservlet e implementei a classe doGet
quando eu passo no navegador
projeto/PostController?titulo=nome-do-post

realmente funciona… na parte (System.out.println("nome do post: " + post.getTitulo()):wink: realmente me traz o nome do post, e se eu coloco pra imprimir no console no system.out por exemplo post.getUsuario ou post.getId ele mostra certinho… então o que eu fiz ta dando certo… porém quando ele redireciona pra /abre-post.xhtml ele nao carrega o post…

porém no meu index.xhtml na lista de posts quando eu clico em um post ele vai pra mesma página abre-post e carrega o post normal…

package br.com.techsquare.controller;

//omitido os imports do meu projeto
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author Alan
 */
@ManagedBean
@SessionScoped
public class PostController extends HttpServlet {

    private Post post;
    private PostDAO dao = new PostDAOImp();
    private Mensagens msg = new Mensagens();
    private List<Categoria> categorias;
    private List<Post> posts;
    private CategoriaDAO catDao = new CategoriaDAOImp();
    private PostDAO postDao = new PostDAOImp();

    public PostController() {
        long t1 = System.currentTimeMillis();
        try {
            if (post == null) {
                post = new Post();
            }
            if (categorias == null) {
                categorias = new ArrayList<Categoria>();
                categorias = catDao.list();
            }
            if (posts == null) {
                posts = new ArrayList<Post>();
                posts = postDao.list();
            }
        } catch (Exception e) {
            msg.enviar(msg.ERRO_SISTEMA);
        }
        long t2 = System.currentTimeMillis();
        System.out.println("PostController - construtor: " + (t2 - t1));
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String titulo = request.getParameter("titulo");
        System.out.println("entro no doGet com o titul: " + titulo);
        if(titulo != null || titulo != ""){
            post = new Post();
            post = dao.getPostsTitulo(titulo);
            System.out.println("pego o post");
            PostController pc = new PostController();
            pc.setPost(post);
            System.out.println("nome do post: " + post.getTitulo());
        }
        response.sendRedirect("/abre-post.xhtml");
    }

    public String enviarPost() {
        post = new Post();
        return "enviar-post.xhtml";
    }

    public String verPost(Post post) {
        long t1 = System.currentTimeMillis();
        try {
            this.post = dao.getPostId(post.getId());
            int cliques = post.getCliques();
            post.setCliques(cliques + 1);
            dao.update(post);
        } catch (Exception e) {
        }
        long t2 = System.currentTimeMillis();
        System.out.println("PostController - verPost: " + (t2 - t1));
        return "abre-post.xhtml";
    }


    public void salvarPost() {
        try {
            UsuarioController uc = new UsuarioController();
            post.setUsuario(uc.getUsuario());
            post.setDtcadastro(new Date());
            dao.save(post);
            msg.enviar(msg.POST_OK);
            post = new Post();
         } catch (Exception e) {
            msg.enviar(msg.ERRO_SISTEMA);
        }
    }

//getters and setters omitidos
}