视图和Bean的交互

时间:2017-07-25 01:43:24

标签: jsf primefaces

我正在使用Java EE,JPA,PrimeFaces,OmniFaces和PostreSQL开发应用程序。

为了更好地解释我的问题,我将从我的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>

我需要的是当你选择一个&#34; Puesto&#34;在组合框&#34; cboPuesto&#34;中,可以找到与该&#34; puesto&#34;相对应的工资,并且它显示为id&#34; txtSalario&#34的微调器的默认值;

我支持Faces.getFlashAttribute(&#34; puesto&#34;),目的是选择所选对象,然后通过服务层找到相应的薪水。但问题是它总是无效。

我也选择使用&#34; oncomplete&#34; cboPuesto执行名为&#34; obtenerSueldo()&#34;的方法的事件,但我得不到我需要的东西。

我呼吁你们,他们有更多的经验,看看是否有人能给我一个解决方案。

感谢您的关注。

1 个答案:

答案 0 :(得分:1)

假设您刚刚复制并粘贴了支持bean和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并分配调用即可使用

最后一堂课应该是

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

}

  

一般注释不要创建具有相同全局变量(字段)名称的局部变量。他们会很混乱。