Foros del Web » Programación para mayores de 30 ;) » Java »

Struts 2: problema con <s:a y pasar un formulario

Estas en el tema de Struts 2: problema con <s:a y pasar un formulario en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 01/10/2010, 02:29
 
Fecha de Ingreso: octubre-2010
Ubicación: Madrid
Mensajes: 3
Antigüedad: 13 años, 7 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.
  #2 (permalink)  
Antiguo 01/10/2010, 02:44
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Struts 2: problema con <s:a y pasar un formulario

La mejor solución sería que al pulsar sobre la imagen llames a una función javascript y en ella añadas el parámetro y envíes el formulario.
  #3 (permalink)  
Antiguo 01/10/2010, 02:48
 
Fecha de Ingreso: octubre-2010
Ubicación: Madrid
Mensajes: 3
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Struts 2: problema con <s:a y pasar un formulario

Gracias por la respuesta.

Lo había pensado, pero en Struts 2 no estoy seguro de como se tiene que hacer la llamada por javascript, si me pudieses iluminar te lo agradeceria.
  #4 (permalink)  
Antiguo 01/10/2010, 03:11
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Struts 2: problema con <s:a y pasar un formulario

function() {

/*
Añadir el parámetro extra
*/

document.forms["productoForm"].submit();
}
  #5 (permalink)  
Antiguo 01/10/2010, 03:18
 
Fecha de Ingreso: octubre-2010
Ubicación: Madrid
Mensajes: 3
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Struts 2: problema con <s:a y pasar un formulario

Esa forma de hacerlo no me llevaría a ningún lado del action, si te das cuenta el form no trae el método al que debe ir, ese se le da en el botón submit al añadirle delante de "Registro" el método que quieres que se ejecute del action.
  #6 (permalink)  
Antiguo 01/10/2010, 04:30
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Struts 2: problema con <s:a y pasar un formulario

Cita:
<s:form action="Registro"
Pones una acción en el form y otra distinta en el submit, eso no tiene mucho sentido

Cita:
<s:submit align="right" value="grabar" action="altaProductoRegistro"
Deberías usar sólo uno, y en este caso te conviene el del form, de todas formas si quieres, también podrías cambiar el action del form en el mismo javascript, antes de hacer el submit.

Etiquetas: pasar, struts, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:28.