Struts

Seguinte galera…
eu configurei corretamente o struts-config.xml
porém quando eu carrego o formulário, após completar os dados de inserção e clico no botão de submeter e aparece tal erro:

“message Servlet action is not available”

o bean ta correto
o formbean ta correto
o jsp ta correto…

não sei qual é o problema…alguém ja viu isso?

E a sua Action, está correta?
O erro informa que sua Action não está disponível/acessível.

cara tá tudo certo eu acho…o erro continua o mesmo


type Status report

message Servlet action is not available

description The requested resource (Servlet action is not available) is not available.


vou colar aqui a Action…se tiver errado me da um toque


/*

  • Created on 08/07/2005
  • TODO To change the template for this generated file go to
  • Window - Preferences - Java - Code Style - Code Templates
    */
    package gastro.controller;

import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import gastro.form.ProdutoForm;
import gastro.beans.Produto;
import gastro.model.CadastroProduto;

/**

  • @author Diego Mendes

  • TODO To change the template for this generated type comment go to

  • Window - Preferences - Java - Code Style - Code Templates
    */
    public class ProdutoAction extends Action
    {

    public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse arg3)
    throws Exception {

     		if ("lista".equals(mapping.getParameter()))
     		    return doLista(mapping, request);
     		else if("insertProduto".equals(mapping.getParameter()))
     		    return doInsert(mapping,(ProdutoForm)form,request);
     		else
     			return mapping.findForward("erro");
     }
    

    private ActionForward doInsert(ActionMapping mapping, ProdutoForm form, HttpServletRequest request) throws SQLException
    {
    Produto p = new Produto();
    try
    {
    BeanUtils.copyProperties(p,form);
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    try
    {
    CadastroProduto.cadastraProduto§;
    }catch(Exception e){}
    return doLista(mapping,request);
    }

    private ActionForward doLista(ActionMapping mapping, HttpServletRequest request) throws SQLException
    {
    request.setAttribute(“headerNames”,new String[]{“nome”,“descricao”});
    request.setAttribute(“propertyNames”,new String[]{“nome”,“descricao”});
    request.setAttribute(“data”,CadastroProduto.getProdutos());
    return mapping.findForward(“table”);
    }

}

Coloque seus códigos entre as tags [ code] [/ code], ela ficará endentada e de melhor vizualização.
E coloque como está o mapeamento desta action no struts-config

Ta ai o mapeamento…

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
<!-- ======================================== Form Bean Definitions -->
    <form-beans>
    
    	<form-bean
    		name="clienteForm"
    		type="gastro.form.ClienteForm"/>
    		
     	<form-bean
    		name="produtoForm"
    		type="gastro.form.ProdutoForm"/>
    	    		
    </form-beans>
<!-- =================================== Action Mapping Definitions -->

    <action-mappings>
        
        
        <action 
            path="/CadastroProdutoAction"
            type="gastro.controller.ProdutoAction"
            scope="request"
            name="produtoForm"
            validate="true"
            input="/cadastro_produto.jsp"
            parameter="insertProduto">
        </action>
        
        
        
    </action-mappings>
    
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
       <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
                                              /WEB-INF/validation.xml"/>
    </plug-in>
</struts-config>

Num tá faltando o forward no seu struts-config?

eu tirei ele pra inserir aqui…mas tem sim…

mas teoricamente tá tudo certo…

não está…

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
<!-- ======================================== Form Bean Definitions -->
    <form-beans>
    
    	<form-bean
    		name="clienteForm"
    		type="gastro.form.ClienteForm"/>
    		
     	<form-bean
    		name="produtoForm"
    		type="gastro.form.ProdutoForm"/>
    	    		
    </form-beans>
<!-- =================================== Global Forward Definitions -->

    <global-forwards>
        <forward
            name="table"
            path="/Table.jsp"/>
            
        <forward
            name="ReservaOK"
            path="/ReservaOK.jsp"/>
        
    </global-forwards>


<!-- =================================== Action Mapping Definitions -->

    <action-mappings>
        
        
        <action 
            path="/CadastroProdutoAction"
            type="gastro.controller.ProdutoAction"
            scope="request"
            name="produtoForm"
            validate="true"
            input="/cadastro_produto.jsp"
            parameter="insertProduto">
        </action>
        
        
        
    </action-mappings>
    
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
       <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
                                              /WEB-INF/validation.xml"/>
    </plug-in>
</struts-config>

como vc está chamando sua action?

Hun, parece-me que está tudo correto, você mapeou o ActionServlet no web.xml?

Pois é…
eu to chamando dessa forma aqui, através do jsp

será q tá aqui o erro???


<%@ page import="org.apache.struts.action.ActionErrors" %>

<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>

<html>
<head>
<LINK REL=STYLESHEET TYPE="text/css" HREF="css1.css">
</head>

<html:errors property="<%=ActionErrors.GLOBAL_ERROR%>"/>

<html:form action="/CadastroProdutoAction">
<html:messages id="error" property="name">
<font color="red"><bean:write name="error"/></font>
</html:messages>
<p>Nome: <html:text property="nome"/>
<p>Descrição: <html:text property="descricao"/>
<html:submit/>
</html:form>
</html>

Cara nem toquei no web.xml…
eu não sabia que precisava configurar…
mas como configuro se a geração dos servlets é automático???
ta ai o meu web.xml abaixo

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">


<web-app>
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>application</param-name>
      <param-value>ApplicationResources</param-value>
    </init-param>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <!-- Action Servlet Mapping -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <!-- The Usual Welcome File List
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  -->


  <!-- Struts Tag Library Descriptors -->
  <taglib>
    <taglib-uri>/tags/struts-bean</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
  </taglib>

  <taglib>
    <taglib-uri>/tags/struts-html</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
  </taglib>

  <taglib>
    <taglib-uri>/tags/struts-logic</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
  </taglib>
  
  <taglib>
  	<taglib-uri>/tags/jstl/core</taglib-uri>
  	<taglib-location>/WEB-INF/c.tld</taglib-location>
  </taglib>
</web-app>

O mapeamento já está aí.
Hun, você colocou o struts.jar no CLASSPATH ou no lib da sua aplicação?

tem que setar no classpath variables é?
eu coloquei no lib da aplicação sim…

eu instalei hoje o tomcat 5 aqui…por acaso eu não tenho que setar algo no server.xml ou em algum arquivo de configuração pra rodar servlets??

mas eu acho que tá tudo certo…

Experimenta setar o struts.jar no CLASSPATH, porque ele não tá achando o seu ActionServlet.

mas qual variável eu seto?

Não tem uma variável chamada CLASSPATH já criada? Sò adiciona o struts.jar nela, caso não exista crie uma CLASSPATH com o valor sendo o caminho completo do struts.jar

[edit]Não esqueça de reiniciar o Tomcat depois.

ja ta setado…e o erro permanece!

[quote=diegom]Ta ai o mapeamento…

[code]

    <action 
        path="/CadastroProdutoAction"
        type="gastro.controller.ProdutoAction"
        scope="request"
        name="produtoForm"
        validate="true"
        input="/cadastro_produto.jsp"
        parameter="insertProduto">
    </action>

[/code][/quote]

Na sua action vc esta apontando o seu form para gastro.form.ProdutoForm esta classe existe?

olá,

pelo que está no seu web.xml acho que vc deveria chamar sua action usando a extensão .do

<html:form action="/CadastroProdutoAction.do">

mas pelo que sei não preciso configurar o web.xml…

é necessário???

respondendo a outra questão: sim! existe a classe!