Struts FormTag com problemas no uso de scriptlet

Buenas pessoal,

Tenho uma tag onde não consigo utilizar EL, alguém pode me ajudar nisso.

Minha tag no jsp

<c:set var="acao" value="${clienteForm.acao}"></c:set>

<bhaiyh:form action="${acao}" validateMethod="validateClienteForm(this);" hiddens="metodo,chave">

O problema esta que ao utilizar o scriptlet no atributo action da erro ao doStatr da tag. O valor da action fica ${acao} ao inves do valor da acao no form “/cliente/ClienteManter”.

Minha FormTag

package br.com.bhaiyh.framework.controle.base.tag;

import java.util.StringTokenizer;

import javax.servlet.jsp.JspException;

import org.apache.struts.taglib.TagUtils;
import org.apache.struts.taglib.html.HiddenTag;
import org.apache.struts.taglib.html.JavascriptValidatorTag;
import org.apache.strutsel.taglib.html.ELFormTag;

import br.com.bhaiyh.framework.modelo.base.util.StringUtil;

/**
 * @jsp.tag name="form" body-content="JSP"
 */
public class FormTag extends ELFormTag {

	private String hiddens;

	private String validateMethod;

	private String enctype;

	public int doStartTag() throws JspException {
		if (!StringUtil.isNulaOuVazia(getValidateMethod())) {
			this.setOnsubmit("return " + getValidateMethod());
		}

               System.out.print(this.getAction()); // Isso imprime ${acao}

               // O erro ocorre já no doStart
		int r = super.doStartTag();

		if (!StringUtil.isNulaOuVazia(getHiddens())) {

			StringTokenizer t = new StringTokenizer(this.getHiddens(), ",");

			while (t.hasMoreTokens()) {
				String temp = t.nextToken().trim();
				HiddenTag tag = new HiddenTag();
				tag.setPageContext(pageContext);
				tag.setProperty(temp);
				tag.setStyleId(temp);
				tag.doStartTag();
				tag.doEndTag();
			}
		}

		TagUtils.getInstance().write(pageContext, "<div class=\"moldura\">");

		return r;
	}

	public int doEndTag() throws JspException {
		TagUtils.getInstance().write(pageContext, "</div>");

		int r = super.doEndTag();

		if (!StringUtil.isNulaOuVazia(getValidateMethod())) {
			JavascriptValidatorTag tag = new JavascriptValidatorTag();
			tag.setPageContext(pageContext);
			tag.setFormName(this.getAction());
			tag.doStartTag();
			tag.doEndTag();
		}

		return r;
	}

	public void release() {
		super.release();

		this.validateMethod = null;
		this.hiddens = null;
		this.enctype = null;
	}

	/**
	 * @jsp.attribute required="false" rtexprvalue="true"
	 */
	public void setAction(String arg0) {
		super.setAction(arg0);
	}

	public String getHiddens() {
		return hiddens;
	}

	/**
	 * @jsp.attribute required="false" rtexprvalue="true"
	 */
	public void setHiddens(String hiddens) {
		this.hiddens = hiddens;
	}

	public String getValidateMethod() {
		return validateMethod;
	}

	/**
	 * @jsp.attribute required="false" rtexprvalue="true"
	 */
	public void setValidateMethod(String validateMethod) {
		this.validateMethod = validateMethod;
	}

	public String getEnctype() {
		return enctype;
	}

	/**
	 * @jsp.attribute required="false" rtexprvalue="true"
	 */
	public void setEnctype(String enctype) {
		this.enctype = enctype;
	}
}

Isso ${acao} não é scriptlet, é Expression Language!

Qual é a versão de Servlet que está usando, versões antigas da expecificação não tem suporte a Expression Language.

flw!

Obrigado Gilmar pelo retorno,

Então eu consigo utilizar Expression Language em outros pontos e funciona corretamente.

Exemplo:

<bhaiyh:text property="nome" size="60" maxlength="30" disabled="${consultar}" required="true" labelKey="cliente.nome" labelBundle="${sistema}" />

O problema ele da quando eu uso o EL no atrituto action. Nos demais não ocorre erro.

Sabe o que pode ser?

Att,

Qual versão do struts você está usando?

Você precisa localizar o arquivo tld da sua tag, localizar sua tag form, e dentro da tag attribute mudar o rtexprvalue para true.

mais ou menos assim:

// outros atributos da tag
<attribute>
<name>action</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue> // <-- aqui vc deixa como true para ele aceitar EL e Scrptlets
</attribute>

Espero ter ajudado!

flw!

Gilmar,

Olha só como esta o meu tld

<name>form</name>
      <tag-class>br.com.bhaiyh.framework.controle.base.tag.FormTag</tag-class>
      <body-content>JSP</body-content>

      <attribute>
         <name>action</name>
         <required>false</required>

           <rtexprvalue>true</rtexprvalue>

      </attribute>

Não estou com o projeto atual aqui no momento, mais a tarde eu falo quais as versões estou utilizando. É struts 1, agora não lembro se fiquei com a 1.3.x ou 1.2.x

Att,

[quote=ivan.silva]Gilmar,

Olha só como esta o meu tld

<name>form</name>
      <tag-class>br.com.bhaiyh.framework.controle.base.tag.FormTag</tag-class>
      <body-content>JSP</body-content>

      <attribute>
         <name>action</name>
         <required>false</required>

           <rtexprvalue>true</rtexprvalue>

      </attribute>

Não estou com o projeto atual aqui no momento, mais a tarde eu falo quais as versões estou utilizando. É struts 1, agora não lembro se fiquei com a 1.3.x ou 1.2.x

Att,[/quote]

Pelo menos vc está melhor q eu (kkkkkk), aqui to usando Struts 1.0 (taglib muito pobre)
Dentro do jar do Struts na pasta META-INF tem os arquivos tld também, acho q se alterar os que estão na WEB-INF vão ter prioridade.

Posta depois ai o resultado.

flw!

A versão do meu struts é 1.3.9, só que apartir do 1.3 não tem mais os tlds do struts pra incluir no projeto é tudo no jar.

E agora o que será que pode ser?

Att,

A príncipo tive que resolver da maneira mais feia. Setando no request o valor.

<bhaiyh:form action="<%=(String) request.getAttribute(\"acao\") %>"  validateMethod="validateClienteForm(this);"  hiddens="metodo,chave">

Como estou utilizando agora Tomcat 6, Java 6, Servlet 2.5, JSP 2.1, Jstl 1.2 e eu gero meus struts-config.xml, web.xml, validations.xml, etc… através do XDoclet 1.2.3 fico restringido a deixar as versoes anteriores, pois, existe um bug no Xdoclet que não posso atualizar as versão recentes para gerar.

https://xdoclet.onjira.com/browse/XDT-1654?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Caso alguem tenha conseguido resolver esse problema favor postar aqui pra comunidade.

Att,