Problemas com o Exemplo do Livro Use a cabeça Servlet & JSP

38 respostas
T

Estou lendo o livro Servlet & JSP da série Usea a Cabeça e estou tendo problemas no exemplo do capítulo 3. Segui os exemplos como o livro pede porém a mensagem abaixo é apresentada quando uso o botão do formulario(form.html) pra chamar a servlet (BeerSelect)

HTTP Status 404 - /web/SelectBeer.do

type Status report

message /web/SelectBeer.do

description The requested resource (/web/SelectBeer.do) is not available.
Apache Tomcat/6.0.20

Minha Estrutura do Tomcat é:
C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\webapps\Beer-v1\WEB-INF\Web.xml
C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\webapps\Beer-v1\form.html
C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\webapps\Beer-v1\WEB-INF\classes\com\example\web\BeerSelect.class

Meu XML está abaixo.

<?xml version="1.0" encoding="UTF-8"?> Ch3 Beer BeerSelect Ch3 Beer /SelectBeer.do

Eu ainda não consegui enxergar onde está o erro.
Se alguém aí puder ajudar…agradeço.

Um abraço.

38 Respostas

ribclauport

Bom, este erro acontece quando o tomcat não encontra no xml sua servlet, acredito que no action do seu form voce deve ter esquecido a “/” ou escrito de forma errada na url… outra pegunta voce compilou a servlet?

posta o o form ai…

T

O Action estava sem a “/” sim, mas mesmo a colocando não funcionou.

Beer Selection

Select Beer characteristics

Color: Light Amber Brown Dark 1

Atualizei também o xml para a linha abaixo:

com.example.web.BeerSelect

edmarr

Por favor galerinha usem a tag CODE …
olha soh simples basta olhar no link

http://www.guj.com.br/posts/list/50115.java

Foxlol

Vc tem que usar o nome completamente qualificado (fully qualified name) em servlet-class:

<servlet> 
    <servlet-name>Ch3 Beer</servlet-name> 
    <servlet-class>com.example.web.BeerSelect</servlet-class> 
</servlet>
T

Já estou usando fully qualified name da servlet. Atualizei o web.xml mas não funcionou. Os códigos estão de acordo com as soluções citadas.

Foxlol

Posta o seu servlet ae.

T

<?xml version="1.0" encoding="utf-8" ?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>Ch3 Beer</servlet-name> <servlet-class>com.example.web.BeerSelect</servlet-class> </servlet> <servlet-mapping> <servlet-name>Ch3 Beer</servlet-name> <url-pattern>/SelectBeer</url-pattern> </servlet-mapping> </web-app>

Por algum motivo não está funcionado com a estrutura de pastas “com.example.web”. Quando uso meu .class direto na pasta do projeto, funciona !

T

Tá Resolvido.

Segui o livro e então criei a estrutura de pastas com\example\web na mão abaixo dos diretórios WEB-INF\classes no tomcat. Não estava encontrando a servlet.

O que eu fiz e resolveu foi apagar a estrutura com\example\web do tomcat que fiz na mão e deixar que essa mesma estrutura fosse criada com a compilação do meu .java, já que defini dentro dele a package com o mesmo endereço. Então a estrutura foi criada e funcionou.

Obrigado pelas ajudas e fica ai uma dica se alguém precisar dela.

R

Estou seguindo o memso livro e estou tendo problema para compilar o servlet.

quando eu compilo aparece os seguintes erros:

C:\Documents and Settings\Paschoal\Meus documentos\JSP\MyProjects\BeerV1>javac -
classpath “/arquivo de programas/apache software foundation/tomcat 6.0/lib/servl
et-api.jar”:classes:. -d classes src/com/example/web/BeerSelect.java
src\com\example\web\BeerSelect.java:3: package javax.servlet does not exist
import javax.servlet.*;
^
src\com\example\web\BeerSelect.java:4: package javax.servlet.http does not exist

import javax.servlet.http.*;

^

src\com\example\web\BeerSelect.java:7: cannot find symbol

symbol: class HttpServlet

public class BeerSelect extends HttpServlet

^

src\com\example\web\BeerSelect.java:10: cannot find symbol

symbol  : class HttpServletRequest

location: class com.example.web.BeerSelect

public void doPost(HttpServletRequest request,

^

src\com\example\web\BeerSelect.java:11: cannot find symbol

symbol  : class HttpServletResponse

location: class com.example.web.BeerSelect

HttpServletResponse response)

^

src\com\example\web\BeerSelect.java:13: cannot find symbol

symbol  : class ServletException

location: class com.example.web.BeerSelect

throws IOException, ServletException

^

6 errors

Alguem poderia me ajudar a resolver esse problema?

Att

T

Posta tua CLASSPATH !!

R

.

R

.;JAVA_HOME ; C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\lib\servlet-api.jar;.

R

Já vou aproveitar e vou enviar os locais onde estãos os Arquivoos .java e a estrutura dos ambientes.

Arquivo .java (servlet)
C:\Documents and Settings\Paschoal\Meus documentos\JSP\MyProjects\BeerV1\src\com\example\web

Arquivo .HTML
C:\Documents and Settings\Paschoal\Meus documentos\JSP\MyProjects\BeerV1\web; e
C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\webapps\Beer-v1

Arquivo .XML
C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\webapps\Beer-v1\WEB-INF; e
C:\Documents and Settings\Paschoal\Meus documentos\JSP\MyProjects\BeerV1\etc

As estruturas que montei ou foram configuradas pelo .exe do Tomcat foram:

C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\

bin\ (varios arquivos)

conf\catalina\localhost\ (varios arquivos)

lib\ (varios Arquivos) (servlet-api.jar está aki)

logs\ (varios Arquivos)

temp\ (varios Arquivos)

webapps\Beer-v1\WEB-INF\

…classes\com\example\ (vazio)
…model\ (vazio)
…web\ (vazio)
…lib\ (vazio)

work\Catalina\localhost\ (varios Arquivos)

C:\Documents and Settings\Paschoal\Meus documentos\JSP\MyProjects\BeerV1

classes\ (vazio)

etc\ web.xml

lib\ (vazio)

src\com\example
…model\ (vazio)
…web\ BeerSelect.java

web\ form.html

Os codigo do meu web.xml é:

<servlet> Ch3 Beer
`com.example.web.BerrSelect

Ch3 Beer `/SelectBeer.do

e o codigo do meu form.html é:

Beer Selection Page

Selecione as Caracteris da Cerveja

Cor: clara amber marron escura

Bem…agora acho que postei tudo que já modifiquei ou criei até agora…

Alguem consegue me Ajudar?

Att

R

Galera Fleliz 2010 para todos

resolvi o problema dos erros postado anteriormente,

Mas agora está dando o seguinte erro quando tento compilar o java

Microsoft Windows XP [versão 5.1.2600]
© Copyright 1985-2001 Microsoft Corp.

C:\MyProjects\BeerV1>javac -classpatch C:\Tomcat\common\lib\servlet-api.jar:clas
ses:. -d classes src\com\example\web\BeerSelect.java
javac: invalid flag: -classpatch
Usage: javac
use -help for a list of possible options

Alguem sabe o que isso significa?

Att,

M

riczanca89:
Galera Fleliz 2010 para todos

resolvi o problema dos erros postado anteriormente,

Mas agora está dando o seguinte erro quando tento compilar o java

Microsoft Windows XP [versão 5.1.2600]
© Copyright 1985-2001 Microsoft Corp.

C:\MyProjects\BeerV1>javac -classpatch C:\Tomcat\common\lib\servlet-api.jar:clas
ses:. -d classes src\com\example\web\BeerSelect.java
javac: invalid flag: -classpatch
Usage: javac
use -help for a list of possible options

Alguem sabe o que isso significa?

Att,


O problema é que tem um ‘c’ a mais: é classpath e não classpatch.

R

Percebi o erro tbm marco, agora voltei par ao mesmo problema que estava tendo

Quando mando compilar aparece os seguintes erros

C:\MyProjects\BeerV1>javac -classpath C:\Tomcat\common\lib\servlet-api.jar:class
es:. -d classes src\com\example\web\BeerSelect.java
src\com\example\web\BeerSelect.java:3: package javax.servlet does not exist
import javax.servlet.*;
^
src\com\example\web\BeerSelect.java:4: package javax.servlet.http does not exist

import javax.servlet.http.*;

^

src\com\example\web\BeerSelect.java:7: cannot find symbol

symbol: class HttpServlet

public class BeerSelect extends HttpServlet {

^

src\com\example\web\BeerSelect.java:9: cannot find symbol

symbol  : class HttpServletRequest

location: class com.example.web.BeerSelect

public void doPost(HttpServletRequest request,

^

src\com\example\web\BeerSelect.java:10: cannot find symbol

symbol  : class HttpServletResponse

location: class com.example.web.BeerSelect

HttpServletResponse response)

^

src\com\example\web\BeerSelect.java:12: cannot find symbol

symbol  : class ServletException

location: class com.example.web.BeerSelect

throws IOException, ServletException

^

6 errors

C:\MyProjects\BeerV1>

Saberia me dizer? quais as variaveis de ambiente que preciso configurar?

M

Espera um pouco… o separador de diretórios no Windows é o ‘ponto e vírgula’ o não o ‘dois pontos’. Tenta executar:

R

Consegui diminuir para apenas um erro:

Olha como ficou:

C:\MyProjectszBeerV1>javac -classpath c:\tomcat\common\lib\servlet-api.jar;classes;. -d classes src\com\example\web\beerselect.java

scr\com\example\web\beerselect.java:15: cannot find symbol

symbol : method getWrite()

location: interface javax.servlet.http.HttpServletResponse

PrintWriter out = response.getWrite();

^

1 Error

andrerios

riczanca89:
Consegui diminuir para apenas um erro:

Olha como ficou:

C:\MyProjectszBeerV1>javac -classpath c:\tomcat\common\lib\servlet-api.jar;classes;. -d classes src\com\example\web\beerselect.java

scr\com\example\web\beerselect.java:15: cannot find symbol

symbol : method getWrite()

location: interface javax.servlet.http.HttpServletResponse

PrintWriter out = response.getWrite();

^

1 Error

Cuidado com a sintaxe… o certo é:

PrintWriter out = response.getWriter();
L

Ja editou chegei atrasado rsrs

R

VLw a Todos pela Ajuda,
Consegui compilar…

Com certeza voltarei aki com mais problemas xDd~

Agradeço a todos.

Att,

Ricardo Zanca.

R

HTTP Status 404 - /SelectBeer.do

type Status report

message /SelectBeer.do

description The requested resource (/SelectBeer.do) is not available.
Apache Tomcat/5.5.28

olha o erro q esta dando agora.

Esse erro eh no XML? ou no action do Form?

andrerios

Mais uma vez erro na hora de copiar o exercicio… da uma olhada na sintaxe do livro e ve se bate com os seus arquivos…

esse erro é de digitação :wink:

faça os exercicios sem pressa, senao alguns erros desses passam desapercebidos…

andrerios

Mais uma vez erro na hora de copiar o exercicio… da uma olhada na sintaxe do livro e ve se bate com os seus arquivos…

esse erro é de digitação :wink:

faça os exercicios sem pressa, senao alguns erros desses passam desapercebidos…

R

Não era erro de codigo andre, esqueci de copiar o arquivo .class para o Tomcat.

Vlw Pela ajuda.

Assim que eu travar no livro novamente eu volto… ^^

R

Bom Dia Galera,

Travei novamente. ¬¬

Tenho que criar uma classe para chamar um modelo chamado BeerExpert.

O codigo do modelo eh esse:

package com.example.model;
import java.util.*;

public class BeerExpert
(
       public List getBrands(String color)
       {
              List brands = new Arraylist();
              if (color.equals("amber"))
              {
               brands.add("Jack Amber");
               brands.add("Red Moose");
              }
              else
              {
               brands.add("Jail Pale Ale");
               brands.add("Gout Stout");
              }
              returns(brands);
       }
}

Eu Devo criar a classe no DD certo? (que no meu caso se chama web.xml)
Eu modifiquei o arquivo e o mesmo ficou assim:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
	version="2.4">


`<servlet>
	`<servlet-name> Ch3 Beer </servlet-name>
	`<servlet-class>com.example.web.BeerSelect</servlet-class>
</servlet>


<servlet-mapping>
	<servlet-name>Ch3 Beer</servlet-name>
	`<url-pattern>/SelectBeer.do</url-pattern>
</servlet-mapping>

`<servlet>
	`<servlet-name> Ch4 Beer </servlet-name>
	`<servlet-class>com.example.model.BeerExpert</servlet-class>
</servlet>


<servlet-mapping>
	<servlet-name>Ch4 Beer</servlet-name>
	`<url-pattern>/SelectBeer.do</url-pattern>
</servlet-mapping>

</web-app>

O erro que aparece quando mando compilar o arquivo BeerExpert eh o seguinte:

C:\MyProjects\BeerV1>javac -classpath C:\Tomcat\common\lib\servlet-api.jar;class
es;. -d classes src\com\example\model\BeerExpert.java
src\com\example\model\BeerExpert.java:4: ‘{’ expected
public class BeerExpert
^
1 error

O que eu estou fazendo de errado?

Agradeço a ajuda.

M

Coloque seu código sempre entre as tags “code”. Assim:

seu código aqui
R

vlw marcos, não sabia que ficava desse jeito!!

Bem melhor de visualizar

R

Alguem pra ajudar hoje?

M

Olha, se não me engano é um detalhe ínfimo: você abriu parênteses ao invés de abrir chaves na definição da sua classe. Está assim:

public class BeerExpert [color=red]([/color]

Enquanto deveria ser assim:

public class BeerExpert {

R

Encontrei o erro do parenteses,

Agora quando eu Compilo aparece o seguinte erro:

C:\MyProjects\BeerV1>javac -classpath c:\tomcat\common\lib\servlet-api.jar;class
es;. -d classes src\com\example\model\beerexpert.java
src\com\example\model\beerexpert.java:9: cannot find symbol
symbol  : class Arraylist
location: class com.example.model.BeerExpert
              List brands = new Arraylist();
                                ^
src\com\example\model\beerexpert.java:20: cannot find symbol
symbol  : method returns(java.util.List)
location: class com.example.model.BeerExpert
              returns(brands);
              ^
Note: src\com\example\model\beerexpert.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.
2 errors

O que estou fazendo de errado?

M

Atenção pois o Java é case-sensitive: é ArrayList. E quando se retorna algo é return (e não return[color=red]s[/color]).

Além disso, procure respeitar o nome do arquivo e da classe (se a classe chama-se BeerExample, chame o arquivo de BeerExample.java, respeitando capitalização).

E compile com a opção -Xlint.

M

Só adicionando, o return não precisa ter o retorno entre parênteses (apesar de não ser proibido também). Prefira a versão sem parênteses para evitar que você confunda o return com um método. Por exemplo:

public static int getZero() {
    return 0; // sem parênteses
}
R

Obrigado mesmo pela Atenção Marcos,

Como pode ver, sou novo nessa linguagem…venho do PHP e estou apanhando muito pra aprender isso. Toda hora estou errando bobeiras…mas vou seguindo tentando…graças a ajuda de pesoas como você. Obrigado Mesmo.

Como eu faço para usar o xlint?

R

Mesmo sem Xlint o arquivo foi compilado.

Mas agora aparece o seguinte erro quando eu rodo a pagina:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Class com.example.model.BeerExpert is not a Servlet
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
	org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	java.lang.Thread.run(Unknown Source)

root cause

java.lang.ClassCastException: com.example.model.BeerExpert cannot be cast to javax.servlet.Servlet
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
	org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	java.lang.Thread.run(Unknown Source)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.28 logs.

O meu arquivo web.xml é o seguinte:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
	version="2.4">


`<servlet>
	`<servlet-name> Ch3 Beer </servlet-name>
	`<servlet-class>com.example.web.BeerSelect</servlet-class>
</servlet>


<servlet-mapping>
	<servlet-name>Ch3 Beer</servlet-name>
	`<url-pattern>/SelectBeer.do</url-pattern>


</servlet-mapping>


`<servlet>
	`<servlet-name>Ch4 Beer </servlet-name>
	`<servlet-class>com.example.model.BeerExpert</servlet-class>
</servlet>


<servlet-mapping>
	<servlet-name>Ch4 Beer</servlet-name>
	`<url-pattern>/SelectBeer.do</url-pattern>


</servlet-mapping>

</web-app>
R

é um erro de classe certo?

M

Para que sua classe seja um Servlet ela deve extender de HttpServlet, ou implementar de outra forma a interface Servlet (coisa que a classe BeerExpert não faz). Se esse é um exemplo do livro, verifique se não há mais nenhuma classe adicional, ou coisa parecida.

R

Consegui fazer rodar.

Mas pra falar a verdade eu não sei ao certo pq está rodando…eu retirei o caminho pro servlet do BeerExpert e pronto…rodou.

Segue abaixo as modificações que fiz:

web.xml

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
	version="2.4">


`<servlet>
	`<servlet-name> Ch3 Beer </servlet-name>
	`<servlet-class>com.example.web.BeerSelect</servlet-class>
</servlet>


<servlet-mapping>
	<servlet-name>Ch3 Beer</servlet-name>
	`<url-pattern>/SelectBeer.do</url-pattern>


</servlet-mapping>



</web-app>

BeerSelect

package com.example.web;

import com.example.model.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class BeerSelect extends HttpServlet
{

	public void doPost(HttpServletRequest request,
			HttpServletResponse response)
	
	throws IOException, ServletException
	{
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("Conselho sobre Escolha de Cerveja<br>");
		
		String c = request.getParameter("color");
               BeerExpert be = new BeerExpert();
               List result = be.getBrands(c);
               Iterator it = result.iterator();
               while (it.hasNext())
               {
                     out.print("<br>Tente: " + it.next());
               }
	}
}

e por ultimo o BeerExpert

package com.example.model;
import java.util.*;

public class BeerExpert
{

       public List getBrands(String color)
       {
              List brands = new ArrayList();
              if (color.equals("amber"))
              {
               brands.add("Jack Amber");
               brands.add("Red Moose");
              }
              else
              {
               brands.add("Jail Pale Ale");
               brands.add("Gout Stout");
              }
              return(brands);
       }
}

Segundo o livro eu deveria ter criado a classe Model do BeerExpert antes de criar o arquivo. (essa classe eles não iriam ensinar a criar)
Mas sem modificar nada e seguindo os proximos passos deu certo. alguem poderia me dizer onde foi que eu criei a classe para eu poder entender o que estou fazendo?
Estou apanhado bastante para conseguir entender esse livro de JSP do Use a Cabeça.

Att,

Criado 1 de dezembro de 2009
Ultima resposta 12 de jan. de 2010
Respostas 38
Participantes 8