Mapear URLs?

Boas pessoal,

Tive a ver no mvnForum, ele usa um tipo de sistema que pessoalmente não conhecia, nem sei como o chamar mas é bastante interessante… basicamente funciona da seguinte maneira… as URLs ficam todas do estilo:

http://www.mvnforum.com/XXXXXXX

dependendo do valor q é atribuido ao “XXXXXXX” ele vai fazer o foward para uma determinada pagina jsp ou servlet…

ou seja… todas as paginas vao ficar do estilo:
http://www.mvnforum.com/threadlist
http://www.mvnforum.com/profile
http://www.mvnforum.com/index
etc etc etc

Isto faz com q nao exista aqueles URLs feios e que dao problemas depois na programacao como:
http://www.mvnforum.com/en/web/joaquim/xpto/profile.jsp

Estao a perceber a ideia? Na teoria é facil de perceber como funciona, mas alguem me pode dar um exemplo simples de como fazer uma coisa destas em java?

Obrigado

Se eu entendi bem o contexto, tudo que você precisa fazer é colocar o servlet-mapping no seu deployment descriptor.

Exemplo:<servlet-mapping> <servlet-name>nome do servlet</servlet-name> <url-pattern>/profile</url-pattern> </servlet-mapping>

Bom, isso funciona para Servlet, mas para JSP não sei como ficaria.

a mesma coisa, é só criar a declaração de servlet para a JSP :slight_smile:

<servlet>
<servlet-name>minhaJSP</servlet-name>
<jsp-file>/caminho/minhaJsp.jsp</jsp-file>
</servlet>

e depois criar o servlet-mapping como a bani mostrou

obrigadao pessoal mas não era nada disso :P… entretanto ja descubri como se faz… era o seguinte, no web.xml apenas vou declarar um servlet…

[code] <servlet>
<servlet-name>ForumServlet</servlet-name>
<servlet-class>org.thegathering.ForumServlet</servlet-class>
</servlet>

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;ForumServlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/forum/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;[/code]

Agora qualquer URI irá ter que passar por este servlet primeiro… e vai ser neste servlet que eu vou fazer o mapping… do genero:

[code]public class ForumServlet extends HttpServlet {

protected void doGet&#40;HttpServletRequest request, HttpServletResponse response&#41; &#123;
	try &#123;
		PrintWriter out = response.getWriter&#40;&#41;;
		String page = request.getPathInfo&#40;&#41;; 
	  out.print&#40;page&#41;;

		if &#40;page.equals&#40;&quot;/index&quot;&#41;&#41; &#123;
			RequestDispatcher dispatcher = getServletContext&#40;&#41;.getRequestDispatcher&#40;&quot;/templates/listforums.jsp&quot;&#41;;
			dispatcher.forward&#40;request, response&#41;;
		&#125;
		
	&#125; catch &#40;IOException e&#41; &#123;
		e.printStackTrace&#40;&#41;;
	&#125; catch &#40;ServletException e&#41; &#123;
		e.printStackTrace&#40;&#41;;
	&#125;
&#125;

}[/code]

fica aqui a solução para o meu problema, caso alguem venha a ter o mesmo :slight_smile:

Fiquem bem

PS: Bani… Virtual Machine man ? :open_mouth:

Morcego, nesse caso o controle de requisicao e redirecionamento ficou dentro de um controller/dispatcher, com a desvantagem de ficar hardcodeado no binario. Se alguma hora precisar mudar, vai ser preciso recompilar a aplicacao.

Deixando no web.xml ( como mostrado pelo urubatan/bani), voce tem mais flexiblidade.

Rafael

Sim, mas não custar recompilar isso… alem disso para o que eu quero fazer vai ter mesmo que ficar assim… ja agora… por acaso algum de vcs alguma vez deu uma vista de olhos no codigo do mvnforum?

Cara, o RecJUG teve a infeliz idéia de colocar o mvnForum, é um dos aplicativos mais mal escritos que ja vi, principalmente quando vc deseja traduzir, tem texto que esta hardcode na classe e vc tem que ficar recompilando, por isso vamos migrar logo epara outro fórum. E morcego da uma olhada no pattern Front Controller!

Porque é que vc diz que é um dos aplicativos mais mal escritos que ja viu? E já agora onde posso ver isso do “pattern Front Controller” ?

Sobre o Front Controller:
http://java.sun.com/blueprints/patterns/FrontController.html

[quote=“Rafael Steil”]

Deixando no web.xml ( como mostrado pelo urubatan/bani), voce tem mais flexiblidade.

Rafael[/quote]

Não entendi muito bem uma coisa: parece-me que o “XXXX” que ele usa na url funciona como uma especie de action para indicar o que o servlet controller dele vai fazer. Criando esses mappings pelo web.xml como ele poderia indicar que quando fosse “/profile” faça isso? Quando for “/index” faça aquilo? Isso supondo que no web.xml tivesse algo assim:

...
&lt;servlet&gt; 
        &lt;servlet-name&gt;ForumServlet&lt;/servlet-name&gt; 
        &lt;servlet-class&gt;org.thegathering.ForumServlet&lt;/servlet-class&gt; 
&lt;/servlet&gt;
...
&lt;servlet-mapping&gt; 
        &lt;servlet-name&gt;ForumServlet&lt;/servlet-name&gt; 
        &lt;url-pattern&gt;/profile&lt;/url-pattern&gt; 
&lt;/servlet-mapping&gt;

&lt;servlet-mapping&gt; 
        &lt;servlet-name&gt;ForumServlet&lt;/servlet-name&gt; 
        &lt;url-pattern&gt;/index&lt;/url-pattern&gt; 
&lt;/servlet-mapping&gt;
...

Não sei era bem isso ou se estou me confundindo.

Até mais.

[quote=“Bani”]Sobre o Front Controller:
http://java.sun.com/blueprints/patterns/FrontController.html[/quote]

Acho que é exactamente isto que eu queria usar… no caso do mvnforum ele tem apenas um unico servlet que vai processar os eventos todos… tudo o resto sao classes java e JSPs… eu estou habituado a usar servlets + velocity por isso estou um bocado confuso de como usar JSPs com simples classes de java… vou tentar perceber isto… mas ainda gostava de saber porque é que o Richardson disse q o mvnForum era uma má aplicação… quanto ao que o cancao disse acho que não se pode fazer dois mappings para o mesmo servlet… acho…

Dois mappings para o mesmo servlet não tem problema. O que causaria erro são dois url-pattern iguais para servlets diferentes, pois aí o conteiner não saberia para qual servlet mapear.

Mas nesse caso de servlet-mapping você normalmente não irá mapear o servlet para o front controller, e sim já diretamente para o servlet responsável por responder a requisição, por isso seriam servlet-name e url-pattern diferentes.

Eu sei que esse post é velho, porém estou implementado um front controller, sei que existe varios frameworks que o fazem, porém quero implementar para estudar.

Enfim, não achei a solução de request.getPathInfo(), para saber qual página ou jsp redirecionar ao invés de usar um xml, o que vcs acham?