O controlador do Mentawai suporta search-friendly URLs facilmente. Ao invés de:
http://www.mysite.com/Topic.show.mtw?id=123
Você pode ter:
http://www.mysite.com/mtw/Topic-show/123/how-to-make-search-friendly-urls-with-mentawai
Mapeando a URL dentro do application manager:
<!-- Vc deve mapear todas as URL que começam com /mtw para o mentawai controller --> <servlet-mapping> <servlet-name>Controller</servlet-name> <url-pattern>*.mtw</url-pattern> <url-pattern>/mtw/*</url-pattern> </servlet-mapping>
Adicionando nomes aos parâmetros:
Uma pretty URL não possui nomes para os seus parâmetros. O controlador do Mentawai pega os valores da URL e os adiciona no input da action usando índices começando em 1 (um). Logo para a URL:
http://www.mysite.com/mtw/Topic-show/123/how-to-make-search-friendly-urls-with-mentawai
O input da action teria dois valores:
String id = input.getString("1"); // ===> "123" String title = input.getString("2"); // ===> "how-to-make-search-friendly-urls-with-mentawai"
Você pode trabalhar com os índices mas não é muito conveniente. O Mentawai permite que você adicione nomes aos parâmetros no application manager:
ActionConfig mainAction = action("/Page", PageAction.class) .prettyURLParams("id", "title") .on(SHOW, redir()) // para a pretty URL .on(SUCCESS, fwd("/show_page.jsp"));
Então você pode fazer na action:
String id = input.getString("id"); // ===> "123" String title = input.getString("title"); // ===> "how-to-make-search-friendly-urls-with-mentawai"
Redirecionando para a URL completa:
Na sua action, você pode checar se a URL está correta, isto é, se possui o id com o título correto. Logo se o usuário digitar:
http://www.mysite.com/mtw/Topic-show/123/are-you-crazy
a action irá automaticamente redirecionar para a URL correta. Você pode fazer isso com o seguinte código dentro da action:
if (isPrettyURL()) { // estamos lidando com uma pretty URL ou com uma URL normal? // checa se a URL possui o title correto String correctTitle = topic.getPrettyURLFormattedTitle(); String inputTitle = input.getString("title"); if (inputTitle == null || !inputTitle.equals(correctTitle)) { String prettyURL = getPrettyURL("Topic", "show", id, correctTitle); // => /mtw/Topic-show/id/correctTitle redir(prettyURL); // <=== redirecionamento dinâmico (SHOW vai para redir() no app manager) return SHOW; } }
NOTE: O método isPrettyURL e getPrettyURL são herdados de BaseAction.
Formatando um texto para ser usado na pretty URL:
O método topic.getPrettyURLFormattedTitle() acima retorna o título no formato correto para ser usado na pretty URL, isto é, sem espaços, acentos, etc. Para formatar qualquer String para ser usada numa pretty URL você pode usar o método abaixo da classe HttpUtils:
public void setTitle(String title) { this.title = title; this.prettyTitle = HttpUtils.getPrettyText(title); } public String getPrettyURLFormattedTitle() { return prettyTitle; }