Duvidas sobre RequestDispatcher

Tenho um Servlet que recebe a requisição de um formulário (codigo abaixo) e faz a validação dos dados, se alguma informação estiver inválida o Servlet faz um forward para esse formulário novamente passando uma mensagem. Porém quando o Servlet faz isso o formulário e a mensagem são exibidos, mas a imagem de logo não é encontrada. Minha dúvida é porque isso acontece e se existe alguma forma de resolver isso.

No servlet estou fazendo isso:


request.setAttribute("message", message);
RequestDispatcher dispatcher = request.getRequestDispatcher("/socio/formulario.jsp");
dispatcher.forward(request, response);

Estrutura da minha aplicação:


+cadastro
|    +socio
|    |---+images
|    |   |---logo.jpg
|    |---formulario.jsp
|    |

codigo formulario.jsp:


<jsp:useBean id="message" class="java.lang.String" scope="request"/>
<jsp:useBean id="nome" class="java.lang.String" scope="request"/>
<jsp:useBean id="telefone" class="java.lang.String" scope="request"/>

<html>
<head><title>JSP Page</title></head>
<body>
    <img src='images/logo.jpg' border='0'>

    <form name="form1" method="post" action="/Cadastro">
    <table width='500'>
    <tr>
        <td colspan='2'><font size="2" face="Arial, Helvetica, sans-serif">Nome:<br>
        <input name="nome" type="text" id="nome" value='<%=nome%>' style="border: 1px #043A82 solid;" size="62">
        </font>
        </td>
    </tr>
    <tr>
        <td><font size="2" face="Arial, Helvetica, sans-serif">R.E.:<br>
        <input name="re" type="text" id="re" value='<%=re%>' style="border: 1px #043A82 solid;">
        </font>
        </td>
        <td><font size="2" face="Arial, Helvetica, sans-serif">Telefone:<br>
        <input name="telefone" type="text" id="telefone" value='<%=telefone%>' style="border: 1px #043A82 solid;">
        </font>
        </td>
    </tr>
    <tr>
        <td colspan='2' align="center">
        <input name="enviar" type="submit" id="enviar" value=" Enviar ">  
        </td>
    </tr>
    <tr>
        <td colspan='2' align="center">
        <font size="2" face="Arial, Helvetica, sans-serif" color='red'><%=message%></font>
        </td>
    </tr>
    </table>
    </form>
</body>
</html>

uma solucao bem imbecil, mas pode funcionar:

<img src=’./images/logo.jpg’ border=‘0’>

Valeu!!! Max, mas não funcionou :frowning:

isso ta estranho…

eu tow tendo um problema parecido com esse

o usuario entra com login e senha se tiver tudo ok manda pra welcome.jsp
senao manda pra login.html de novo, soh que quando o LoginServlet é chamado ele
simplesmente não faz nada…não aparece nehuma mensagem de erro
fica em branco

jah dei uma procurada aqui no forum e até achei alguem com situação parecida mas não
consegui respostas

se alguem tiver alguma ideia, fico muito grato

Rodrigo Gomes

[quote=“maxguzenski”]uma solucao bem imbecil, mas pode funcionar:

&lt;img src='./images/logo.jpg' border='0'&gt;

:idea: Ae leonardom, tenta voltar dois niveis.

&lt;img src='../../images/logo.jpg' border='0'&gt;

[quote=“Lucashgt”]

:idea: Ae leonardom, tenta voltar dois niveis.

&lt;img src='../../images/logo.jpg' border='0'&gt;

Se eu voltar dois níveis ai não mostra a imagem nem na primeira vez que abro a página.

Correto, estava apenas tentando tirar uma dúvida.

Só não consigo entender, como ele não está conseguindo encontrar a imagem.

O diretório socio é único na estrutura, não? Ou você possui mais algum, em outros niveis?

[quote=“Lucashgt”]
O diretório socio é único na estrutura, não? Ou você possui mais algum, em outros niveis?[/quote]

Sim o diretório socio é o único abaixo de cadastro. Dentro de sócio tenho images.

Acho que isso ocorre porque qdo executo o Dispacher, ele deve voltar um nível e então não localiza a pasta images porque ela está dentro de socio. Mas o correto era isso não acontecer. Realmente não entendo!!!

Posso estar perguntando algo idiota, mas não tem nada a haver com Buffer?

:arrow: Tenta setar para que a mesma não seja armazenada em Buffer, assim quando solicitada, ela terá que fazer as solicitações de imagens e tudo mais novamente.

O que acha?

O negócio é o seguinte, no seu web.xml, a url-pattern do seu servlet deve estar configurada como:

<servlet-mapping>
<servlet-name>Cadastro</servlet-name>
/Cadastro
</servlet-mapping>

Assim, quando vc executa o dispatcher.forward(request, response) dentro deste servlet vc pode ver que a sua url que está na barra de endereços do seu navegador não está localhost:8080/cadastro /socio/formulario.jsp
e sim como localhost:8080/cadastro /Cadastro.
Desta forma ele não vai achar a sua imagem porque se a sua referencia é: img src=‘images/logo.jpg’ border=‘0’, então ele vai buscar em: localhost:8080/cadastro/images/logo.jpg, e como vc pode ver este não é o caminho correto, que é localhost:8080/cadastro/socio/images/logo.jpg
Sendo assim, se vc mudar a referencia da sua imagem na sua jsp para
img src=‘socio/images/logo.jpg’ border=‘0’, aí vc conserta a referencia quando vc voltar do servlet mas por outro lado vc vai perdê-la quando for chamar a pagina do formulario diretamente, pois a referencia a imagem ficaria: localhost:8080/cadastro/socio/socio/images/logo.jpg que nao está certo.
Ou seja, para consertar isso, vc precisa dar nova referencia a url-pattern deste servlet para que ele nao volte para a raiz de forma que então ele passe a possuir o mesmo nivel de estrutura de arvore da jsp que o chamou e para a qual ele retorna a requisição.
Espero que vc tenha entendido.
Otávio