Quando devo usar h: outputLink em vez de h: commandLink?

129

Quando devo usar um em <h:outputLink>vez de um <h:commandLink>?

Eu entendo que um commandLinkgera uma postagem HTTP; Eu estou supondo que outputLinkirá gerar HTTP recebe. Dito isto, a maioria do material tutorial JSF que eu li usa commandLink(quase?) Exclusivamente.

Contexto: estou implementando um pequeno projeto de demonstração que mostra um link de cabeçalho para uma página de usuário, muito parecido com o Stack Overflow ...

precisa de mais jquery

... e não tenho certeza se commandLink(talvez usando ?faces-redirect=truepara marcar) ou se outputLinké a escolha certa.

Matt Ball
fonte

Respostas:

195

A <h:outputLink>renderização é um <a>elemento HTML completo com a URL adequada no hrefatributo que aciona uma solicitação GET que pode ser marcada como favorito. Ele não pode chamar diretamente um método de ação do bean gerenciado.

<h:outputLink value="destination.xhtml">link text</h:outputLink>

O <h:commandLink>torna um HTML <a>elemento com um onclickscript que envia um formulário (oculto) POST e pode invocar um método de ação managed bean. Também é necessário ser colocado dentro de a <h:form>.

<h:form>
    <h:commandLink value="link text" action="destination" />
</h:form>

O ?faces-redirect=trueparâmetro no <h:commandLink>, que aciona um redirecionamento após o POST (conforme o padrão Pós-Redirecionado-Obter ), apenas melhora a capacidade de marcação de favoritos da página de destino quando o link é realmente clicado (o URL não ficará mais "atrás") , mas ele não altera hrefo <a>elemento para ser um URL válido. Ainda permanece #.

<h:form>
    <h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>

Desde o JSF 2.0, também é <h:link>possível obter um ID de visualização (um resultado de caso de navegação) em vez de um URL. Ele irá gerar um <a>elemento HTML , bem como o URL apropriado href.

<h:link value="link text" outcome="destination" />

Portanto, se for para uma navegação página a página pura e com favoritos, como o link do nome de usuário SO, use <h:outputLink>ou <h:link>. Isso também é melhor para SEO, pois os bots geralmente não codificam os formulários POST nem o código JS. Além disso, o UX será aprimorado, pois as páginas agora podem ser marcadas como favoritos e o URL não está mais "atrasado".

Quando necessário, você pode executar o trabalho de pré-processamento no construtor ou @PostConstructem um @RequestScopedou @ViewScoped @ManagedBeanque esteja anexado à página de destino em questão. Você pode usar @ManagedPropertyou <f:viewParam>definir parâmetros GET como propriedades do bean.

Veja também:

BalusC
fonte
2
Não, não precisa ser. Somente UICommandcomponentes precisam entrar em um UIFormcomponente.
BalusC
3
Nenhuma, na verdade. Geralmente, quando você puder, atenha-se a h:outputLinkou h:linkpara links. SEO não deve ser subestimado. A propósito, para obter bons URLs semelhantes a REST, como aqui no SO, dê uma olhada no PrettyFaces .
BalusC
1
Não, a diferença é que h:linkleva JSF ID vista (por exemplo page) como valor e h:outputLinkleva um URL real (por exemplo, /page.xhtmlou /page.jsf, ou outra dependendo do seu FacesServletmapeamento) como valor. A codificação de URL acontece de qualquer maneira nos dois casos. A propósito, não há diferença entre o comportamento de renderização do EL no texto do modelo #{...}e h:outputText. Ambos escapam às entidades XML predefinidas (não, isso não é o mesmo que a codificação de URL). O h:outputTextúnico oferece mais atributos como id, styleClassetc para controlar o componente e / ou marcação.
BalusC
1
@BalusC O que exatamente você quer dizer com "fullworthy HTML" na primeira linha da sua resposta?
25412 Geek
1
@Geek: just-a-ponto HTML um <a>elemento, nada mais, nada fanciness, nenhum código JS, etc.
BalusC
4

Também vejo que o carregamento da página (desempenho) demora muito tempo usando h: commandLink do que h: link. h: link é mais rápido em comparação com h: commandLink

Ashok
fonte
1
Acho isso difícil de acreditar. Além de boatos / sua própria evidência anedótica, você tem alguma coisa para apoiar isso?
Matt Bola
5
@ Matt: Eu posso imaginar que é mais lento quando você tem um link de navegação neste POST dentro de um formulário "Deus" em uma página com, por exemplo, uma tabela de dados com> 1000 linhas contendo 3 campos de entrada por linha. Mas essa página um tem outros problemas graves de qualquer maneira :)
BalusC