2017-07-25 85 views
-1

我正在使用Java EE,JPA,PrimeFaces,OmniFaces和PostreSQL处理应用程序。视图和bean的交互

为了更好地解释我的问题,我将从我的Bean和它管理的视图中复制代码,然后我将公开我的需要。

我有一个Bean下面的代码:

import java.io.InputStream; 
import java.io.Serializable; 
import java.util.List; 
import java.util.Properties; 

import javax.annotation.PostConstruct; 
import javax.faces.view.ViewScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

import org.omnifaces.util.Faces; 

import com.mitocode.model.Config; 
import com.mitocode.model.Contrato; 
import com.mitocode.model.Persona; 
import com.mitocode.model.Puesto; 
import com.mitocode.service.IConfigService; 
import com.mitocode.service.IContratoService; 
import com.mitocode.service.IPersonaService; 
import com.mitocode.service.IPuestoService; 
import com.mitocode.util.MensajeManager; 

@Named 
@ViewScoped 
public class ContratoFormBean implements Serializable{ 

@Inject 
private Contrato contrato; 
@Inject 
private Persona persona; 
@Inject 
private Puesto puesto; 
@Inject 
private IPuestoService puestoService; 
@Inject 
private IPersonaService personaService; 
@Inject 
private IContratoService contratoService; 
@Inject 
private IConfigService configService; 
private List<Persona> lstPersonas; 
private List<Puesto> lstPuestos; 
private double sueldo; 

@PostConstruct 
public void init() { 
    this.listarPersonas(); 
    this.listarPuestos();  
    Contrato cont = (Contrato)Faces.getFlashAttribute("contrato"); 
    if(cont != null){   
     this.leer(cont); 
    }else{ 
     this.leerSueldoMinimo(); 
     //this.obtenerSueldo(); 
    }   
} 

public void leer(Contrato cont){ 
    try { 
     contrato = contratoService.listarPorId(cont); 
     this.persona = contrato.getPersona(); 
     this.puesto = contrato.getPuesto(); 
    } catch (Exception e) { 
     MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR"); 
    }  
} 

public void leerSueldoMinimo(){ 
    try{ 
     InputStream inputStream = ContratoFormBean.class.getClassLoader().getResourceAsStream("/parametros.properties"); 
     Properties properties = new Properties(); 
     properties.load(inputStream); 

     String parametro = properties.getProperty("sueldo_minimo"); 
     Config conf = configService.leerParametro(parametro); 
     double salarioMinimo = conf.getValor() != null ? Double.parseDouble(conf.getValor()) : 0.0; 
     this.contrato.setSalario(salarioMinimo); 
    }catch(Exception e){ 
     MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR"); 
    } 
} 

public void listarPersonas() { 
    try { 
     lstPersonas = personaService.listar(); 
    } catch (Exception e) { 
     MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR"); 
    } 
} 

public void listarPuestos() { 
    try { 
     lstPuestos = puestoService.listar(); 
    } catch (Exception e) { 
     MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR"); 
    } 
} 

public void registrar() { 
    try { 
     contrato.setIdContrato(contratoService.getSiguientePK(persona)); 
     contrato.setPersona(persona); 
     contrato.setPuesto(puesto); 
     contratoService.registrar(contrato); 
    } catch (Exception e) { 
     MensajeManager.mostrarMensaje("Aviso", e.getMessage(), "ERROR"); 
    } 
} 

public void obtenerSueldo(){ 
    Puesto puesto = (Puesto)Faces.getFlashAttribute("puesto"); 
    System.out.println(puesto.getSalarioBase()); 
    if(puesto != null){ 
     this.contrato.setSalario(puesto.getSalarioBase()); 
    }else{ 
     this.contrato.setSalario(0.0); 
    } 
} 

public Contrato getContrato() { 
    return contrato; 
} 

public void setContrato(Contrato contrato) { 
    this.contrato = contrato; 
} 

public Persona getPersona() { 
    return persona; 
} 

public void setPersona(Persona persona) { 
    this.persona = persona; 
} 

public Puesto getPuesto() { 
    return puesto; 
} 

public void setPuesto(Puesto puesto) { 
    this.puesto = puesto; 
} 

public List<Persona> getLstPersonas() { 
    return lstPersonas; 
} 

public void setLstPersonas(List<Persona> lstPersonas) { 
    this.lstPersonas = lstPersonas; 
} 

public List<Puesto> getLstPuestos() { 
    return lstPuestos; 
} 

public void setLstPuestos(List<Puesto> lstPuestos) { 
    this.lstPuestos = lstPuestos; 
} 


} 

而对于将管理bean的观点如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui"> 

<h:head></h:head> 
<body> 
    <ui:composition template="/WEB-INF/templates/plantilla.xhtml"> 
     <ui:define name="content"> 
      <p:messages id="msj" showDetail="false" autoUpdate="true" 
       globalOnly="true" /> 
      <h:form> 
       <h:panelGrid columns="4"> 
        <p:outputLabel value="Persona" style="font-weight: bold;"/> 
        <p:selectOneMenu id="cboPersona" value="#{contratoFormBean.persona}" required="true" requiredMessage="Debe seleccionar una persona" 
        rendered="#{contratoFormBean.contrato.idContrato == 0}" 
        converter="omnifaces.SelectItemsConverter"> 
        <f:selectItem itemLabel="--Seleccione--" itemValue="#{null}" 
         noSelectionOption="true" /> 
        <f:selectItems value="#{contratoFormBean.lstPersonas}" var="per" 
         itemLabel="#{per.nombreCompleto}" itemValue="#{per}" /> 
       </p:selectOneMenu> 
       <p:outputLabel value="#{contratoFormBean.persona.nombreCompleto}" 
        rendered="#{contratoFormBean.contrato.idContrato != 0}" /> 
       <p:message for="cboPersona" /> 
       <p:tooltip for="cboPersona" value="Elija una persona para el contrato"/> 

       <p:outputLabel value="Puesto" style="font-weight: bold;" /> 
       <p:selectOneMenu id="cboPuesto" value="#{contratoFormBean.puesto}" 
        required="true" requiredMessage="Debe seleccionar un puesto de trabajo" 
        rendered="#{contratoFormBean.contrato.idContrato == 0}" 
        converter="omnifaces.SelectItemsConverter" oncomplete="#{contratoFormBean.obtenerSueldo()}"> 
        <f:selectItem itemLabel="--Seleccione--" itemValue="#{null}" 
         noSelectionOption="true" /> 
        <f:selectItems value="#{contratoFormBean.lstPuestos}" var="pue" 
         itemLabel="#{pue.nombre}" itemValue="#{pue}" /> 
       </p:selectOneMenu> 
       <p:outputLabel value="#{contratoFormBean.puesto.nombre}" 
        rendered="#{contratoFormBean.contrato.idContrato != 0}" /> 
       <p:message for="cboPuesto" /> 
       <p:tooltip for="cboPuesto" value="Elija una puesto para la persona"/> 

       <p:outputLabel value="Fecha Inicio" style="font-weight: bold;"/> 
       <p:calendar id="txtFecha" value="#{contratoFormBean.contrato.fechaInicio}" required="true" requiredMessage="Debe indicar una fecha de inicio de contrato" 
        rendered="#{contratoFormBean.contrato.idContrato == 0}" locale="es" pattern="dd/MM/yyyy" mask="99/99/9999"/> 
       <p:outputLabel value="#{contratoFormBean.contrato.fechaInicio}" 
        rendered="#{contratoFormBean.contrato.idContrato != 0}" > 
        <f:convertDateTime pattern="dd/MM/yyyy" /> 
       </p:outputLabel> 
       <p:message for="txtFecha" /> 
       <p:tooltip for="txtFecha" value="Elija una fecha de inicio para el contrato"/> 

       <p:outputLabel value="Fecha Fin" style="font-weight: bold;"/> 
       <p:calendar id="txtFechaFin" value="#{contratoFormBean.contrato.fechaFin}" required="true" requiredMessage="Debe indicar una fecha de fin de contrato" 
        rendered="#{contratoFormBean.contrato.idContrato == 0}" locale="es" pattern="dd/MM/yyyy" mask="99/99/9999"/> 
       <p:outputLabel value="#{contratoFormBean.contrato.fechaFin}" 
        rendered="#{contratoFormBean.contrato.idContrato != 0}"> 
        <f:convertDateTime pattern="dd/MM/yyyy" style="font-weight: bold;" /> 
       </p:outputLabel> 
       <p:message for="txtFechaFin" /> 
       <p:tooltip for="txtFechaFin" value="Elija una fecha de finalización para el contrato"/> 


       <p:outputLabel value="Salario" style="font-weight: bold;"/> 
       <p:spinner id="txtSalario" value="#{contratoFormBean.contrato.salario}" required="true" requiredMessage="El salario es obligatorio" 
        rendered="#{contratoFormBean.contrato.idContrato == 0}" min="#{contratoFormBean.contrato.salario}" validatorMessage="El monto debe ser mayor o igual al salario mínimo"/> 
       <p:outputLabel value="#{contratoFormBean.contrato.salario}" 
        rendered="#{contratoFormBean.contrato.idContrato != 0}"> 
        <f:convertNumber currencySymbol="$" maxFractionDigits="2" 
         maxIntegerDigits="6" type="currency" /> 
       </p:outputLabel> 
       <p:message for="txtSalario" /> 
       <p:tooltip for="txtSalario" value="Ingrese un salario"/> 

      </h:panelGrid> 

      <p:commandButton value="Aceptar" update="@form" 
       rendered="#{contratoFormBean.contrato.idContrato eq 0}" 
       actionListener="#{contratoFormBean.registrar()}" 
       action="contrato?faces-redirect=true" /> 
      <p:commandButton immediate="true" value="Cancelar" action="contrato?faces-redirect=true" 
       rendered="#{contratoFormBean.contrato.idContrato eq 0}"/> 
      <p:commandButton value="Aceptar" immediate="true" 
       action="contrato?faces-redirect=true" 
       rendered="#{contratoFormBean.contrato.idContrato != 0}" /> 


     </h:form> 

    </ui:define> 
</ui:composition> 

我需要的是,当您在组合框“cboPuesto”中选择了“Puesto”,并且可以找到与“puesto”对应的工资,并且它显示为ID为“ txtSalario”。

为此,我在Faces.getFlashAttribute(“puesto”)中支持,目的是获取所选对象,然后通过服务层找到相应的工资。但问题是它总是处于空白状态。

我也选择使用cboPuesto的“oncomplete”事件来执行名为“obtenerSueldo()”的方法,但我没有得到我所需要的。

我呼吁你,谁有更多的经验,看看有没有人可以给我一个解决方案。

感谢您的关注。

+0

TLDR;请创建您的代码的简化版本。而你的标签标签要广泛。视图和bean的交互是'jsf'而不是java或jpa或omnifaces(或primefaces) – Kukeltje

回答

1

假设你只是复制和粘贴的所有代码中都支持豆类和XHTML

<p:selectOneMenu id="cboPuesto" value="#{contratoFormBean.puesto}" 
.... oncomplete="#{contratoFormBean.obtenerSueldo()}"> 

这里给您分配选定值contratoFormBean.puesto ,但是在支持bean的方法

public void obtenerSueldo(){ 
Puesto puesto = (Puesto)Faces.getFlashAttribute("puesto"); 
System.out.println(puesto.getSalarioBase()); 
if(puesto != null){ 
    this.contrato.setSalario(puesto.getSalarioBase()); 
}else{ 
    this.contrato.setSalario(0.0); 
} 

您正在从Flash中获取您从未设置过的值Faces.getFlashAttribute("puesto")。 场puesto已经包含从下拉列表中选择的值下来,只是删除getflash和分配呼叫,这将工作

最后类应该是

​​

}

一般备注不要使用全局变量(字段)的相同名称创建本地变量。他们会很混乱。