Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/10/2010, 02:29
sheltrinec
 
Fecha de Ingreso: octubre-2010
Ubicación: Madrid
Mensajes: 3
Antigüedad: 14 años, 3 meses
Puntos: 0
Struts 2: problema con <s:a y pasar un formulario

Buenas a todos,
Tengo un problema con Struts 2 espero que me podáis ayudar porque me estoy volviendo loco con ello. Estoy haciendo una aplicación web con Struts 2, java 6 y tomcat 5.5.
El caso es que estoy teniendo problemas a la hora de que un Action coja los parámetros de un formulario, si lo hago con el tag submit de struts me lo manda bien, pero una llamada al action tengo que hacerla con un link de imagen (<s:a) y aquí es cuando llega el problema. La llamada es al mismo action, usan el mismo formulario y solo quiero añadir un parámetro mas, pero cuando hago la llamada el action no recibe ningun parametro. Os pongo el código a continuación para que podáis echarle un vistazo.

JSP
Esta es la url que quiero usar para la llamada. No me cabe mucho de la jsp asi que cortare cachos.

<s:url action="buscarProovedoresRegistro" id="buscarProovedor" >
<s:param name="destinoJSP" value="">filtroAltaProducto</s:param>
</s:url>


Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ 
taglib prefix="s" uri="/struts-tags" %>
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Inicio</title>
<
script type="text/javascript" src="<s:url value="/js/prototype.js"/>"></script>
<script type="text/javascript" src="<s:url value="/js/scriptaculous.js"/>"></script> 
<script type="text/javascript" src="<s:url value="/js/gesfinca.js"/>"></script> 
   <script type="text/javascript">
           function ini(){
               <s:if test="%{proovedores == null}">
                   desvelarPagina();
               </s:if>
               //Eliminando el salto de linea del combo "medida"
               eliminarSaltoLinea('medida');
                  var spans = $$('span[class="actionMessage"]');
                  if(spans != undefined && spans[0] != undefined){
                         var mensaje = spans[0].outerText;
                         mostrarMensaje(mensaje,"contentFrame",true);
                  }
                  
                  if($('medida') != undefined){
                      $('medida').style.display='none';
                  }             

               //mostrarMensaje('resolucion');
           }
.
.//Aqui va mas codigo
.
   </script>
</head>

<body onload="ini()">
<div>
   <s:form action="Registro" theme="simple" id="productoForm"> 
   <%-- URL's de pagina --%>
    <s:url action="buscarProovedoresRegistro" id="buscarProovedor"  >
        <s:param name="destinoJSP" value="">filtroAltaProducto</s:param>
    </s:url>
    <%-- FIN URL's de pagina --%>  
   <table width="90%" border="2">
           <tr>
               <td rowspan="2" align="left"><h2>Datos proovedor</h2></td>
               <td align="left"><s:label  theme="simple">Identificador</s:label>&nbsp;<s:textfield theme="simple" label="Identificador proovedor" name="producto.idProovedor" id="idProovedor" size="15" maxlength="15"/>&nbsp;<s:label theme="simple">CIF</s:label>&nbsp;<s:textfield theme="simple" label="CIF" name="proovedor.cifProovedor" id="cifProovedor" size="10" maxlength="10"/>
               </td>
           </tr>
           <tr>
               <td align="left" ><s:label theme="simple">Nombre</s:label>&nbsp;<s:textfield theme="simple" label="nombre proovedor" name="proovedor.nombreProovedor" id="nombreProovedor" size="30" maxlength="100"/>
                   &nbsp<s:a theme="simple" href="%{buscarProovedor}" formId="productoForm"  cssStyle="border:0px" onclick="velarPagina()"><img src="<s:url value="/img/lupa.gif"/>" width="20" height="20"/></s:a></td>
           </tr>
           <tr>
               <td rowspan="3" align="left"><h2>Datos producto</h2></td>
               <td align="left">
                   <s:label theme="simple">Id. familia</s:label>&nbsp;<s:textfield theme="simple" label="Identificador familia producto" name="producto.idFamiliaProducto" id="idFamiliaProovedor" size="10" maxlength="45"/>
                  &nbsp;<s:label theme="simple">des. familia</s:label>&nbsp;<s:textfield theme="simple" label="familia producto" name="producto.deFamiliaProducto" id="deFamiliaProducto" size="20" maxlength="80" onblur="javascript:rellenarProducto(this);"/>
               </td>
           </tr>
   </table>
    <s:submit align="right" value="grabar" action="altaProductoRegistro" formId="productoForm" onclick="velarPagina()"/><s:reset align="right" value="Borrar"/>    
    <div id="resolucion" style="display:none;" ><s:actionmessage id="mensajeValor"/></div>
   </s:form>
  </div>
</body>
</html> 
Struts.xml el action es "RegistroAction"
Código PHP:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    
    <package name="administracion" extends="struts-default" >
        <interceptors>
              <interceptor name="authenticationInterceptor"
                        class="ges.finca.web.interceptores.AuthenticationInterceptor"/>                
             <interceptor-stack name="all-default">
             <interceptor-ref name="authenticationInterceptor" />
             <interceptor-ref name="defaultStack"/>
          </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="all-default" />
        <global-results>
              <result name="login">/jsp/login.jsp</result>
        </global-results>
           
          <action name="escritorio" >
              <result>/jsp/inicio.jsp</result>
          </action>             
          
          <action name="*Registro" method="{1}" class="ges.finca.web.action.RegistroAction">
              <result name="altaFactura">/jsp/registro/altaFactura.jsp</result>
              <result name="altaAlbaran">/jsp/registro/altaAlbaran.jsp</result>
              <result name="altaProovedor">/jsp/registro/altaProovedor.jsp</result>
              <result name="filtroAltaProducto">/jsp/registro/altaProducto.jsp</result>
              <result name="altaBanco">/jsp/registro/altaBanco.jsp</result>
                 <result>/jsp/estructura.jsp</result>
           </action>
    </package>
        
    <include file="login.xml"/>
    <!-- include file="registro.xml"/-->


    <!-- Add packages here -->
    
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />


</struts>
Action

Código PHP:


public class RegistroAction extends ActionSupport{


      private 
ProductoDTO producto;
      private 
ProovedorDTO proovedor;
      private 
String destinoJSP;

      private 
String mensaje;
      
      private List<
MetatablaDTOmedidas;
      private List<
ProovedorDTOproovedores;
      
      private static 
Logger log Logger.getLogger(LoginAction.class);
      private static 
Log logConsole LogFactory.getLog("ges.finca.web.action.RegistroAction");

      public 
String execute () {

            
String destino INPUT;

            return 
destino;

      }
      
      public 
String filtroAltaProducto(){
          try{
                  
ConsultasBO con getConsultasBO();
                  List<
MetatablaDTOmed = (List<MetatablaDTO>) con.getAttribute("medidas");
                  if(
med == null){                        
                          
MetatablaDTO filtroMt = new MetatablaDTO();
                          
filtroMt.setIdTipo("MEDIDA");
                          
medidas con.buscarDatosMetatabla(filtroMt);
                          
con.setAttribute("medidas",medidas);
                  }else{
                      
medidas med;
                  }
          }catch(
PersistenceException p){
               
System.out.println("Error buscando en Base de datos");
               
p.printStackTrace();  
              }
          return 
"filtroAltaProducto";
      }

      public 
String altaProducto(){
            
ConsultasBO con getConsultasBO();
            
            
ProductoDTO filtro getProducto();               
                  
ProductoDAO pDao = new ProductoDAO(con.getSessionFactory());
                  
int i 0;
                  
StringBuffer sb = new StringBuffer();
                  
                 try{
                     
//comprobamos que el proovedor existe
                  
ProovedorDTO filtroProovedor = new ProovedorDTO();
                  
filtroProovedor.setIdProovedor(producto.getIdProovedor());
                  if(
con.buscarProovedorByPrimaryKey(filtroProovedor) != null){
                      
pDao.grabarProducto(filtro);
                  }else{
                      
sb.append("El proovedor no existe /n");
                  }
                  
             }catch(
PersistenceException p){
               
log.error("Error insertando producto",p);
               
logConsole.error("error insertando producto",p);
             
p.printStackTrace();  
           }
                  if(
== 1){
                  
log.info("El producto ha sido dado de alta");
                   
logConsole.info("El producto ha sido dado de alta");
                   
sb.append("El producto ha sido dado de alta");
                  }else{
                       
sb.append("El producto no ha sido dado de alta");
                  }
                  if(
sb.length() != 0){
                      
addActionMessage(sb.toString());
                  }
              
medidas = (List<MetatablaDTO>)con.getAttribute("medidas");
              return 
"filtroAltaProducto";
      }

      
      
/**
       * Metodo que busca una lista de proovedores pasado por filtro
       * si el idProovedor no llega relleno puede ser porque no se ha facilitado
       * o porque la petición viene de otra pagina que el formulario requiera ese dato      
       * @return String
       */
      
public String buscarProovedores(){
          
ConsultasBO con getConsultasBO();
          if(
proovedor != null && proovedor.getIdProovedor() == null){
              if(
producto != null){
                  
proovedor.setIdProovedor(producto.getIdProovedor());
              }
          }       
          
proovedores con.buscarProovedores(proovedor);

          return 
"filtroAltaProducto";
      }

  
//Los get y los set estan todos

Espero que me podais ayudar, gracias de antemano.