Erro 404 tomcat - formulário / servlet

OLÁ
Estou gerando gráficos com cewolf . Penso em fazer o seguinte: entrar com dois valores de uma equação através de um formulário e enviá-los para um servlet que esta dentro de uma classe que trata dos dados a serem exibidos no gráfico. No servlet os valores digitados pelo usuário são passados para variáveis globais e depois este redireciona para a página onde aparecerá o gráfico.
Meu código aparentemente está sem erros, no entanto quando compilo o projeto aparece a página com o formulário. Eu entro com os valores mas depois dá um erro 404 no tomcat.
Não entendo o motivo. Gostaria que vocês dessem uma olhada no meu código acredito que estou errando na configuração do XML , mas também não tenho certeza.

Abaixo a minha classe com o servlet:

[code]
//+codigo aqui

public class PageViewCountData implements DatasetProducer, CategoryToolTipGenerator, CategoryItemLinkGenerator, Serializable {

private static final Log log = LogFactory.getLog(PageViewCountData.class);

private float a;
private float b;

public class Servlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       // processRequest(request, response);
         a = Float.parseFloat(request.getParameter("a"));
         b = Float.parseFloat(request.getParameter("b"));
        response.sendRedirect("grafico.jsp");

    }
}

// +codigo aqui…
}[/code]


Este é o meu xml:

[code]

aServlet
Cewolf21.codigo.PageViewCountData.Servlet

 <servlet-mapping>
     <servlet-name>aServlet</servlet-name><!-- servlet-name é deve ser o mesmo nome privado da servlet -->
     <url-pattern>/Servlet</url-pattern> <!--url-pattern é o endereço público na web entrar na servlet-->
 </servlet-mapping>[/code]

Aqui meu formulário simples:


        
       <form action="Cewolf21.codigo.PageViewCountData.Servlet" method="post">

			<center <h1>Formulário</h1><br/><p>Entre com os seguintes valores da equação y=ax+b<p/><table>
			<tr>
				<td>a:</td>
				<td><input type="text" name="a" size="20"></td>
			</tr>
			<tr>
				<td>b:</td>
				<td><input type="text" name="b" size="20"  maxlength="20"></td>
			</tr>
                        <tr>
				<td></td>
				<td></td>
			</tr>
			<tr>
				<td><input type="submit" name="Enviar" value="Enviar"></td>
                                <td><input type="reset" name="reset" value="Limpar" /></td>

			</tr>
 			</table></center>
 

Estou errando ao chamar o servlet? Ou na configuração do XML? Me auxiliem por gentileza :cry:

Grata.

vc mapeou seu servlet como aServlet no form vc deve colocar esse nome.
ficando assim:

<form action="aServlet" method="post"> 

Studant,

Seu problema está aqui:<form action="Cewolf21.codigo.PageViewCountData.Servlet" method="post">Para funcionar:<form action="/Servlet" method="post">Você deve sempre referenciar:<url-pattern>/Servlet</url-pattern>Não coloque um nome tão genérico como /Servlet, no seu caso poderia ser algo como /pageViewCountDataServlet.

Abraço.

[b]gambazinho muito obrigada mesmo pela atenção!

Fiz oque vc sugeriu, no entanto o erro 404 persistiu :([/b]


HTTP Status 404 - /Cewolf21/aServlet

type Status report

message /Cewolf21/aServlet

description The requested resource (/Cewolf21/aServlet) is not available.
Apache Tomcat/5.5.27

[b]isaiaspf,
Também tentei como vc disse, mas deu o mesmo erro.
Não entendo oque estou fazendo errado …

Muito obrigada por me responder.[/b]

Eu ratiei, tenta sem a barra:<form action="Servlet" method="post">

[b]Eu tinha tentado assim antes… na verdade tinha tentado de tudo rs …
O tomcat nao está conseguindo encontrar o servlet (o caminho dele).

Fiz novamente …dá um erro 500 :frowning: como abaixo:
[/b]

[code]
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: Wrapper cannot find servlet class Cewolf21.codigo.PageViewCountData.Servlet or a class it depends on
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:875)
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.ClassNotFoundException: Cewolf21.codigo.PageViewCountData.Servlet
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1386)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1232)
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:875)
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.27 logs.
Apache Tomcat/5.5.27[/code]

Opa, acho que aí tem mais problemas…

Primeiro, você entendeu exatamente o que é o campo “action” do form? Esquece o java, estamos falando somente de HTML. O “action” vai dizer para o browser o seguinte: “para onde devo mandar a informação digitada na tela?”. Para o browser, não importa qual é a linguagem que você está usando no servidor.

No seu XML, você configurou que o servlet vai ficar escutando na pasta “/servlet”, certo? É o que está escrito no campo do seu XML, como o isaiaspf disse.

Só que, num sei não, acho que vai dar ainda outro problema mais embaixo: você fez uma classe dentro de outra classe no seu código, e está tentando acessar essa classe dentro da classe diretamente, sem que essa classe de dentro seja “static”. Quando você declara uma classe interna sem ser static, ela implicitamente depende da classe mãe.

Por exemplo: esse código dá pau

public class Teste {

	
	public class MeuTeste {
		
	}
	public static void main(String[] args) {
	 Teste.MeuTeste x = new Teste.MeuTeste();
	}
}

Porque MeuTeste depende da classe mãe Teste para ser instanciado.

A solução rápida seria

public class Teste {

	
	public [b]static[/b] class MeuTeste {
		
	}
	public static void main(String[] args) {
	 Teste.MeuTeste x = new Teste.MeuTeste();
	}
}

Abmpicoli,
Muito obrigada pela atenção.
Modifiquei a seguinte linha como vc sugeriu:

public static class Servlet extends HttpServlet {

mas as variáveis deixaram de ser globais. O servlet ficou assim:

public static class Servlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // processRequest(request, response); float a = Float.parseFloat(request.getParameter("a")); float b = Float.parseFloat(request.getParameter("b")); response.sendRedirect("grafico.jsp"); } }

Testei para ver se pelo menos o tomcat acha o servlet, mas infelizmente deu um erro 404:

[code]HTTP Status 404 - Servlet aServlet is not available


type Status report
message Servlet aServlet is not available
description The requested resource (Servlet aServlet is not available) is not available.


Apache Tomcat/5.5.27
[/code]

Eu fiz alguma coisa errada?..estou quase pulando de uma ponte ja. :(.

Porque você não faz isso aqui:[code]public class PageViewCountData extends HttpServlet implements DatasetProducer, CategoryToolTipGenerator, CategoryItemLinkGenerator, Serializable {
private static final Log log = LogFactory.getLog(PageViewCountData.class);

private float a;
private float b;

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// processRequest(request, response);
	a = Float.parseFloat(request.getParameter("a"));
	b = Float.parseFloat(request.getParameter("b"));
	response.sendRedirect("grafico.jsp");
}

...

}[/code][code]
pageViewCountDataServlet
Cewolf21.codigo.PageViewCountData

pageViewCountDataServlet /pageViewCountData [/code][code][/code]

[b]isaiaspf ,
Eu jurava que ia dar certo assim…
Obrigada por me ajudar…sério mesmo…

fiz oq vc disse… mas deu erro:[/b]

[code]HTTP Status 404 - Servlet pageViewCountDataServlet is not available

type Status report

message Servlet pageViewCountDataServlet is not available

description The requested resource (Servlet pageViewCountDataServlet is not available) is not available.
Apache Tomcat/5.5.27[/code]

Studant,

Pelo erro que você postou, acho que você tá tentando assim:<form action="pageViewCountDataServlet" method="post">Mas é:<form action="pageViewCountData" method="post">Senão anexa os fontes todos que eu dou uma olhada mais a fundo.

[b]isaiaspf ,

Na verdade fiz como você sugeriu, mesmo assim dá o erro acima.
Revi tudo várias vezes…e nada.
Segue os códigos:
[/b]

Servlet:

package codigo;


import java.io.Serializable;
import java.util.Date;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import de.laures.cewolf.DatasetProduceException;
import de.laures.cewolf.DatasetProducer;
import de.laures.cewolf.links.CategoryItemLinkGenerator;
import de.laures.cewolf.tooltips.CategoryToolTipGenerator;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class PageViewCountData extends HttpServlet implements DatasetProducer, CategoryToolTipGenerator, CategoryItemLinkGenerator, Serializable {

    private static final Log log = LogFactory.getLog(PageViewCountData.class);
    // These values would normally not be hard coded but produced by
    // some kind of data source like a database or a file
    private String[] categories = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    private String[] seriesNames = {"Equação Afim"};
    private float a;
    private float b;


    protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
           // processRequest(request, response);
             a = Float.parseFloat(request.getParameter("a"));
             b = Float.parseFloat(request.getParameter("b"));
            response.sendRedirect("grafico.jsp");

        }
  

    public Object produceDataset(Map params) throws DatasetProduceException {
        log.debug("producing data.");
        DefaultCategoryDataset dataset = new DefaultCategoryDataset() {

            /**
             * @see java.lang.Object#finalize()
             */
            protected void finalize() throws Throwable {
                super.finalize();
                log.debug(this + " finalized.");
            }
        };
        for (int series = 0; series < seriesNames.length; series++) {
            for (int i = 0; i < categories.length; i++) {//  i aqui equivale ao meu x da equação afim
                final int y = (int) ((a * i) + b);
                dataset.addValue(y, seriesNames[series], categories[i]);
            }
        }
        return dataset;
    }

    /**
     * This producer's data is invalidated after 5 seconds. By this method the
     * producer can influence Cewolf's caching behaviour the way it wants to.
     */
    public boolean hasExpired(Map params, Date since) {
        log.debug(getClass().getName() + "hasExpired()");
        return (System.currentTimeMillis() - since.getTime()) > 5000;
    }

    /**
     * Returns a unique ID for this DatasetProducer
     */
    public String getProducerId() {
        return "PageViewCountData DatasetProducer";
    }

    /**
     * Returns a link target for a special data item.
     */
    public String generateLink(Object data, int series, Object category) {
        return seriesNames[series];
    }

    /**
     * @see java.lang.Object#finalize()
     */
    protected void finalize() throws Throwable {
        super.finalize();
        log.debug(this + " finalized.");
    }

    /**
     * @see org.jfree.chart.tooltips.CategoryToolTipGenerator#generateToolTip(CategoryDataset, int, int)
     */
    public String generateToolTip(CategoryDataset arg0, int series, int arg2) {
        return seriesNames[series];
    }
}


Formulário:

<%-- 
    Document   : formulario
    Created on : 08/07/2011, 11:34:34
    Author     : studant
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>formulario</title>
    </head>
    <body>
        
       <form action="pageViewCountData" method="post">

			<center <h1>Formulário</h1><br/><p>Entre com os seguintes valores da equação y=ax+b<p/><table>
			<tr>
				<td>a:</td>
				<td><input type="text" name="a" size="20"></td>
			</tr>
			<tr>
				<td>b:</td>
				<td><input type="text" name="b" size="20"  maxlength="20"></td>
			</tr>
                        <tr>
				<td></td>
				<td></td>
			</tr>
			<tr>
				<td><input type="submit" name="Enviar" value="Enviar"></td>
                                <td><input type="reset" name="reset" value="Limpar" /></td>

			</tr>
 			</table></center>
    </body>
</html>

JSP que apresenta o gráfico:

<%-- 
    Document   : grafico
    Created on : 07/07/2011, 19:12:58
    Author     :studant
--%>

<%@page import="codigo.PageViewCountData"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri='/WEB-INF/cewolf.tld' prefix='cewolf' %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
  
        <h1>Teste com Gráfico de linha!</h1>
    <jsp:useBean id="pageViews" class="codigo.PageViewCountData"/>
    <cewolf:chart
        id="line"
        title="Equação Afim y=a*x+b"
        type="line"
        xaxislabel="x"
        yaxislabel="y">
        <cewolf:data>
            <cewolf:producer id="pageViews"/>
        </cewolf:data>
    </cewolf:chart>
    <p>
    <cewolf:img chartid="line" renderer="cewolf" width="400" height="300"/>
    </p>
    </body>
</html>

XML:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>CewolfServlet</servlet-name>
        <servlet-class>de.laures.cewolf.CewolfRenderer</servlet-class>
	<!-- sets storage implementation -->
        <init-param>
            <param-name>storage</param-name>
            <param-value>de.laures.cewolf.storage.TransientSessionStorage</param-value>
        </init-param>
	<!-- sets overlib.js location relative to webapp -->
        <init-param>
            <param-name>overliburl</param-name>
            <param-value>etc/overlib.js</param-value>
        </init-param>
	<!-- turn on or off debugging logging -->
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>CewolfServlet</servlet-name>
        <url-pattern>/cewolf/*</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

    <mime-mapping>
        <extension>css</extension>
        <mime-type>text/css</mime-type>
    </mime-mapping>

    <welcome-file-list>
        <welcome-file>
      index.jsp
        </welcome-file>
        <welcome-file>
      index.jsp
        </welcome-file>
    </welcome-file-list>
  
    <servlet>    
        <servlet-name>pageViewCountDataServlet</servlet-name>     
        <servlet-class>Cewolf21.codigo.PageViewCountData</servlet-class>      
    </servlet>    
      
    <servlet-mapping>    
        <servlet-name>pageViewCountDataServlet</servlet-name>  
        <url-pattern>/pageViewCountData</url-pattern>  
    </servlet-mapping>  

	<!-- resource-ref>
	  <description>
	    Resource reference to a factory for java.sql.Connection
	    instances that may be used for talking to a particular
	    database that is configured in the server.xml file.
	  </description>
	  <resource-ref-name>
	    jdbc/testdb
	  </resource-ref-name>
	  <res-type>
	    javax.sql.DataSource
	  </res-type>
	  <res-auth>
	    Container
	  </res-auth>
	</resource-ref -->

</web-app>

Obrigada mesmo.

Olhando por cima, acho que encontrei.<servlet-class>Cewolf21.codigo.PageViewCountData</servlet-class>Muda para:<servlet-class>codigo.PageViewCountData</servlet-class>

[b]Isaiaspf,
Deu certo! \o/
Mas em parte … rs
Fiquei super feliz por que o tomcat encontrou o caminho do servlet e o grafico é gerado.
No entanto, os valores das variáveis passadas no formulário não aparecem no gráfico.
A idéia era:
A partir do formulário, o servlet pegasse esses valores e passasse para as variáveis globais ‘a’ e ‘b’, como esta sendo feito , e depois redimensionasse para o jsp que exibe o gráfico. Nessa jsp ia ser chamada o PageViewCountData que já com os valores de ‘a’ e ‘b’ ia retornar o objeto gráfico em forma de imagem.

Isso é feito …porém parece que as variáveis ficam nulas nessa segunda etapa.
Estou tentando entender o motivo. daqui para meia noite eu chego la se Deus quizer.:slight_smile:

Mas nossa caminhei muito durante o dia …Muito obrigada … nem sei como lhe agradecer… é por pessoas como vc que esse forum tem a fama que tem! :P;)Obrigada a todos que me responderam.[/b]

Studant,

Fico feliz que você conseguiu resolver um dos problemas. Hahaha.
Então, eu não vou conseguir te ajudar muito porque desconheço esse Cewolf tag library.

Usando response.sendRedirect(“grafico.jsp”) você redireciona para uma outra página “abandonando” o atual request e response.
Para redirecionar e manter o mesmo request e response, utiliza-se:RequestDispatcher dispatcher = request.getRequestDispatcher("grafico.jsp"); dispatcher.forward(request, response);Assim você consegue recuperar, no grafico.jsp, os valores de a e b que estão no seu request.

Oi Isaiaspf =P obrigada pela paciencia …
O gráfico não apareceu com os valores q eu queria…e sim valores nulos.
Coloquei como você disse, veja:

[code]protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

         a = Float.parseFloat(request.getParameter("a"));
         b = Float.parseFloat(request.getParameter("b"));
         RequestDispatcher dispatcher = request.getRequestDispatcher("grafico.jsp");  
         dispatcher.forward(request, response);

    }[/code]

Ou seja, persiste o mesmo resultado.

isaiassp,

RequestDispatcher dispatcher = request.getRequestDispatcher("grafico.jsp"); dispatcher.forward(request, response);

[b]Pesquisando sobre os métodos utilizados nas linhas acima fiquei na dúvida quanto ao que exatamente eles fazem.
Me parece que o requestDispatcher é um objeto que recebe as solicitações do cliente e as envia para qualquer recurso (tal como um servlet, um arquivo HTML ou arquivo JSP) no servidor.

Esse getRequestDispatcher retorna um RequestDispatcher objeto que atua como um wrapper para o recurso localizados no caminho dado.

O forward ( ServletRequest request, ServletResponse response)
encaminha pedido de um servlet para outro recurso (servlet, arquivo JSP, HTML ou arquivo) no servidor.

Será que vc podia me explicar …estou confusa. Essas linhas não estão fazendo sentido para mim.[/b]

Opa, percebi que você está confusa mesmo :slight_smile:

Seguinte: primeiro, se você tá programando em java, e a aplicação é Web, as coisas estão acontecendo no servidor. Via de regra, é o servidor que tem o java rodando.

O RequestDispatcher, olha só, o nome diz em inglês, é um “Despachador de Requests”, ou seja, é como um 0800 da vida: o atendente fala pra você que não é com ele e redireciona para outro departamento.

Só que o objetivo de qualquer requisição (request) é obter uma resposta (response). O objeto request é justamente para ler a requisição. O objeto response é justamente para responder a requisição… Assim:

RequestDispatcher dispatcher = request.getRequestDispatcher("grafico.jsp");     

Na linha acima a sua página pediu “o ramal” da página “grafico.jsp”.

E o método forward é para passar toda a conversa para a página “grafico.jsp”. Ele precisa passar o request e o response junto para poder ver o que está acontecendo (request) e dar uma resposta (response).

Espero que tenha ajudado.

[b]Abmpicoli,
Muito obrigada \o/
Sua explicação me ajudou de mais.

Como o Isaiassp disse , com essas linhas eu consego recuperar, no grafico.jsp, os valores de ‘a’ e ‘b’ que estão no meu request. Porém pelo o que eu entedi não é bem isso que eu preciso fazer. Eu não preciso desses valores no gráfico.jsp e sim no meu servlet, pois é lá que vou utilizá-los para gerar os dados do gráfico. Depois disso o servlet me retorna um objeto gráfico que será exibido no jsp .

Eu preciso que essas variáveis permaneçam com os valores alterados, quando o meu jsp chamar novamente o servlet. Ou seja essa primeira etapa seria apenas para alterar as variáveis para serem usadas novamente com os mesmos valores na criação do gráfico. Será que tem como alterar os valores e esses permanecerem quando eu chamar o servlet novamente?
[/b]