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> <s:textfield theme="simple" label="Identificador proovedor" name="producto.idProovedor" id="idProovedor" size="15" maxlength="15"/> <s:label theme="simple">CIF</s:label> <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> <s:textfield theme="simple" label="nombre proovedor" name="proovedor.nombreProovedor" id="nombreProovedor" size="30" maxlength="100"/>
 <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> <s:textfield theme="simple" label="Identificador familia producto" name="producto.idFamiliaProducto" id="idFamiliaProovedor" size="10" maxlength="45"/>
<s:label theme="simple">des. familia</s:label> <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>
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>
Código PHP:
public class RegistroAction extends ActionSupport{
private ProductoDTO producto;
private ProovedorDTO proovedor;
private String destinoJSP;
private String mensaje;
private List<MetatablaDTO> medidas;
private List<ProovedorDTO> proovedores;
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<MetatablaDTO> med = (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){
i = 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(i == 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
}