Struts: como atrelar valores do back end ao JSP

Prezados,

Estou dando manutenção em um sistema que utiliza Struts 1 e queria atrelar valores do backend na Action ao JSP. Por exemplo:

<html:select styleId="comboTipoSolic" property="tipoSolicitacao">
	<html:option value="-1">Selecione</html:option>
	<html:optionsCollection property="tiposSolicitacao" value="tipo" label="descricao" />
	<html:option value="0">Todos</html:option>
</html:select>

Caso o usuário escolha uma das opções, na minha Action está se transforma em uma enumeração e o fluxo segue. O problema está nas opções “Selecione” e “Todos”. Estes valores estão escritos na mão desse jeito mesmo e na minha action eu comparo o valor do campo a eles escrevendo 0 ou 1 também.

Acontece que se aparece um desenvolvedor mais inexperiente que mude esse valor, quebra a minha lógica. Dessa maneira gostaria de saber se existe um jeito de amarrar esses valores por meio de constantes talvez. Algo que ao invés de utilizar menos um ou zero eu possa escrever “SELECIONE”, onde selecione seria uma constante do tipo int.

Em um projeto usando Servlets, por exemplo, eu criaria uma constante pública na Servlet e a referenciaria por meio de scriplet no valor, algo como abaixo:

E na minha Action ao invés de comparar usando

if(form.getTipoSolicitacao().equals("1")) eu faria if(Integer.parseInt(form.getTipoSolicitacao()) == NomeServlet.SELECIONE).

Com isso qualquer que fosse o valor de Selecione eu não teria problemas.

Em tempo, eu não criaria isso em uma servlet específica, talvez por se tratar de opções genéricas eu as criaria em uma classe utilitária ou em uma BaseServlet da vida que fosse pai de todas as Servlets. Enfim, gostaria de saber como fazer isso no Struts 1.

Eu colocaria na coleção que está preenchendo o html:optionsCollection

Prezadao drsmachado,

A coleção é uma enumeração que vem apenas com os valores necessários mesmo.

Além disso, você concorda que “Selecione” e “Todos” são valores que podem aparecer em N selects diferentes do sistema? Eu teria que repetir esse processo de adicionar a cada uma delas.

Tinha entendido que era apenas para esta situação.
Você provavelmente possui um FormBean para esta jsp, certo?
Este FormBean pode estender outro, certo?
O que vai aparecer na jsp, quando se usa o Struts 1 (que é o que você está utilizando) estará, obrigatoriamente, no FormBean ou será hardcoded.
Ou seja, se você criar um atributo (ou dois, neste caso) no FormBean ‘pai’, terá em todos os FormBeans estes atributos e, por consequência, poderá utilizar nas jsps.

Prezado drsmachado,

Você diz criar uma classe BaseForm que extenda de org.apache.struts.action.ActionForm como:[code]package controller.form;

import org.apache.struts.action.ActionForm;

import constantes.ValoresHTML;

public class BaseForm extends ActionForm {

private static final long serialVersionUID = 6371019556637434331L;

public int getValorHTMLSelectSelecione() {
    return ValoresHTML.SELECIONE;
}

public int getValorHTMLSelectTodos() {
    return ValoresHTML.TODOS;
}

}[/code]
E depois disso todas os meus forms passem a extender dessa classe? E quanto aos forms já existentes, manutenção à medida que forem surgindo a necessidade?

Daí no meu JSP eu chamo esses métodos para renderizar tais valores e nas actions os mesmos métodos? Essa a sua idéia?

Para o que você quer fazer, é o que me parece mais viável.
Diferente do JSF, onde você pode pegar os atributos de quaisquer ManagedBean, no Struts 1 você precisa que eles estejam no FormBean correspondente.

drsmachado,

Obrigado pela ajuda, fiz assim mesmo. Uma última dúvida:

está renderizando o HTML

Sabe me dizer o motivo do valor do método não estar indo para o JSP?

É que a variável valorHTMLSelectTodos não existe em nenhum escopo visível para EL.
Você está usando Struts 1, precisa definir o atributo name, com o nome do FormBean e o atributo value com o nome do atributo que ele representa, SEM EL.

Tem como você postar código, por favor?

Porque aqui na versão do Struts que eu tenho que é a 1.2.9 não tem atributo name.

Alguém???