Campos dinâmicos em JavaEE usando JSF 2.2
Bom dia, estou tentando fazer campos dinâmicos usando JSF 2.2, estou com dificuldade, tenho que fazer uma class, que recebe os dados via ArrayList<String>,e dai criar os campos em xhtml dinamicamente, alguém tem alguma dica, qualquer ajuda é bem vinda.
Dhiego Silva
Curtidas 0
Melhor post
Josivan Laskoski
12/11/2013
Bom dia,
Não sei se é exatamente isso que voce quer fazer, usando dinamicamente a criação de componentes de tela de acordo com o que voce definir na sua classe.
Mas se for, crie uma classe implementando ComponentSystemEventListener após isso vai pedir para criar os metodos da sua implementação, feito isso voce pode trabalhar dessa maneira:
Agora a minha Classe de funções onde voce vai criar os componentes (assim foi a forma que eu estruturei)
E a chamada no seu xhtml
Dessa forma voce cria tudo por fora do seu xhtml, faz todo seu select e cria os componentes que quiser mostrar em sua tela na sua classe.
Mas acho que seria melhor voce usar no seu xhtml a tag <ui:repeat /> dentro de um <h:form /> e controlar tudo por dentro de seu xhtml, pois vai encontrar alguns problemas como renderização de tela, ajax entre outro se usar da forma dinamica pela classe.
Tenho esses dois exemplos no meu sistema, mas estou mudando aos poucos para trabalhar tudo diretamente com xhtml.
Espero ter ajudado!
Não sei se é exatamente isso que voce quer fazer, usando dinamicamente a criação de componentes de tela de acordo com o que voce definir na sua classe.
Mas se for, crie uma classe implementando ComponentSystemEventListener após isso vai pedir para criar os metodos da sua implementação, feito isso voce pode trabalhar dessa maneira:
@Override
public void processEvent(ComponentSystemEvent event) throws AbortProcessingException {
HtmlPanelGrid panel = new HtmlPanelGrid();
HtmlForm form = (HtmlForm) event.getComponent();
Funcoes func = new Funcoes();
//...seu sql
while (rs.next()) {
panel.getChildren().add(func.CriaLabel("Usuário:", "lusuario", true, false));
panel.getChildren().add(func.CriaLabel(rs.getString("usuario"), "usuario", false, false));
//..os tipos de componentes que voce desejar!
}
panel.setColumns(2);
List<UIComponent> children = form.getChildren();
children.add(panel);
Agora a minha Classe de funções onde voce vai criar os componentes (assim foi a forma que eu estruturei)
public UIComponent CriaLabel(String value, String nome, Boolean negrito, Boolean cor) {
FacesContext fctx = FacesContext.getCurrentInstance();
Application app = fctx.getApplication();
HtmlOutputLabel label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);
//label.setId(nome);
label.setValue(value);
if (negrito) {
label.setStyle("font-weight: bold;");
}
if (cor) {
label.setStyle(label.getStyle() + "color: #B22222");
}
return label;
}
E a chamada no seu xhtml
<h:form prependId="true" id="tste">
<f:event type="javax.faces.event.PostAddToViewEvent"
listener="#{visualizarPedidoHW.processEvent}" />
</h:form>
Dessa forma voce cria tudo por fora do seu xhtml, faz todo seu select e cria os componentes que quiser mostrar em sua tela na sua classe.
Mas acho que seria melhor voce usar no seu xhtml a tag <ui:repeat /> dentro de um <h:form /> e controlar tudo por dentro de seu xhtml, pois vai encontrar alguns problemas como renderização de tela, ajax entre outro se usar da forma dinamica pela classe.
Tenho esses dois exemplos no meu sistema, mas estou mudando aos poucos para trabalhar tudo diretamente com xhtml.
Espero ter ajudado!
GOSTEI 1
Mais Respostas
Eduardo Pessoa
08/11/2013
ja iniciou algo, tem codigo?
GOSTEI 0
Dhiego Silva
08/11/2013
Ainda não, já criei uma List<String> que recebe 3 string, com isso tenho que criar dinamicamente 3 HtmlOutputLabel e 3 HtmlOutputText e depois grava os dados digitado em outra List para inclusão em um Banco de Dados. mais não estou conseguindo criar o HtmlOutputLabel e o HtmlOutputText. Alguém poderia post um exemplo?
GOSTEI 0
Eduardo Pessoa
08/11/2013
a sua IDE ja está tudo OK?
GOSTEI 0
Luciano Martins
08/11/2013
use EL do JSF nos componentes ex: "#{meuManagedBena.aluno.nome}"
GOSTEI 0
Dhiego Silva
08/11/2013
sim esta tudo configurado é funcionando, to com dificuldade na logica no bean.
GOSTEI 0
Dhiego Silva
08/11/2013
Então mais eu não posso fazer o código html, tem que ser gerado na Bean... exemplo vem um dado do bd do campo nome, ele vai entra na List, ai eu tenho que gerar um label e um inputText dinamicamente na Bean é isso que eu to precisando... ta difícil de achar um exemplo.
GOSTEI 0
Dhiego Silva
08/11/2013
Valew isso vai ajuda e muito.
GOSTEI 0
Dhiego Silva
08/11/2013
Consegui fazer o código funciona mais estou com uma duvida, JOSIVAN LASKOSKI como faz um evento no HtmlCommandButton, já criei ele dinamicamente usando como exemplo seu código, queria fazer um evento quando ele foce apertado vai para outra dela. tem como ajudar?
GOSTEI 0
Josivan Laskoski
08/11/2013
Mais uma vez vou lhe alertar, não é uma boa pratica o desenvolvimento em Bean de componentes de tela, como lhe falei, estou mudando o pouco que tenho para trabalhar dentro da view.
O botão é melhor que voce crie ele dentro da view, vai evitar muitos problemas e estará fazendo uma boa pratica de desenvolvimento.
Mas segue um exemplo:
O botão é melhor que voce crie ele dentro da view, vai evitar muitos problemas e estará fazendo uma boa pratica de desenvolvimento.
Mas segue um exemplo:
botao.addActionListener(new ActionListener() {
@Override public void processAction(ActionEvent e) {
FacesContext fctx = FacesContext.getCurrentInstance();
ELContext elctx = fctx.getELContext();
ELResolver resolver = elctx.getELResolver();
MyBean mb = (MyBean) resolver.getValue(elctx, null, "");
mb.doSomething();
}
});
GOSTEI 0
Dhiego Silva
08/11/2013
tentei mais não esta funcionado, no lugar do Mybean eu coloquei o nome da minha bean, dai criei um função com retorno com o nome da pagina que eu quero mais não ta dando, segue o código.
#Código
# Classe Funcoes
# Classe VisualizarPedidoHW
#Código
# Classe Funcoes
//Gerando campo Button
public UIComponent CriaButton(String value, String nome) {
FacesContext fctx = FacesContext.getCurrentInstance();
Application app = fctx.getApplication();
HtmlCommandButton button = (HtmlCommandButton) app.createComponent(HtmlCommandButton.COMPONENT_TYPE);
button.setValue(value);
button.addActionListener(new ActionListener() {
@Override public void processAction(ActionEvent e) {
FacesContext fctx = FacesContext.getCurrentInstance();
ELContext elctx = fctx.getELContext();
ELResolver resolver = elctx.getELResolver();
VisualizarPedidoHW mb = (VisualizarPedidoHW) resolver.getValue(elctx, null, "{VisualizarPedidoHW.processar()}");
mb.processar();
}
});
return button;
}# Classe VisualizarPedidoHW
public String processar(){
return "novo";
}GOSTEI 0
Matheus Santos
08/11/2013
Gostaria de saber se alguém conseguiu resolver o problema e se possível mandar o código de exemplo
GOSTEI 0