Werte aus inputtext in gesicherten bean (jsf 2)
ich habe eine datatable mit einer Zeile , die ich Bearbeiten müssen die Felder dieser Zeile, so habe ich ein paar inputText mit den Werten, aber wenn ich Sie Bearbeiten und klicken Sie auf die Befehlsschaltfläche (, ruft die Methode "actualizarUsuario" werden die Werte als null übergeben.
dies ist mein bean-code:
@ManagedBean(name = "user")
@ViewScoped
public class userDetalles implements Serializable {
private Usuario u;
private usuarioController controlador;
Rol rol;
private long selection;
private long selectionrol;
Agrupacion agrupacion;
private Privilegio privilegio;
private RolController controladorRol;
private ControladorAgrupaciones controladorAgrup;
private String nombres;
private String apellidoP;
private String apellidoM;
private Boolean check;
@PostConstruct
public void init() {
rol= new Rol() ;
u=new Usuario();
agrupacion=new Agrupacion();
privilegio=new Privilegio();
controlador= new usuarioController();
controladorRol=new RolController();
controladorAgrup=new ControladorAgrupaciones();
Usuario u=new Usuario();
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
//Obtener parametros del request
Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
long iduser = Long.valueOf(parameterMap.get("id_usuario"));
this.u=controlador.getUser(iduser);
}
public Usuario getU() {
return u;
}
public void setU(Usuario u) {
this.u = u;
}
public long getSelection() {
System.out.println("selection value----------->"+selection);
return selection;
}
public void setSelection(long selection) {
this.selection = selection;
}
public long getSelectionrol() {
return selectionrol;
}
public void setSelectionrol(long selectionrol) {
this.selectionrol = selectionrol;
}
public String getNombres() {
return nombres;
}
public void setNombres(String nombres) {
this.nombres = nombres;
}
public String getApellidoP() {
return apellidoP;
}
public void setApellidoP(String apellidoP) {
this.apellidoP = apellidoP;
}
public String getApellidoM() {
return apellidoM;
}
public void setApellidoM(String apellidoM) {
this.apellidoM = apellidoM;
}
public Boolean getCheck() {
return check;
}
public void setCheck(Boolean check) {
this.check = check;
}
public void actualizarUsuario(){
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
nombres=parameterMap.get("nombres");
apellidoP=parameterMap.get("apellidoP");
apellidoM=parameterMap.get("apellidoM");
check=Boolean.parseBoolean(parameterMap.get("check"));
//test
System.out.println(nombres+" "+apellidoP+" "+apellidoM+" "+check);
u.setNombres(nombres);
u.setApellidoPaterno(apellidoP);
u.setApellidoMaterno(apellidoM);
u.setActive(check);
controlador.saveUsuario(u);
}
}
und das ist meiner Ansicht nach:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<div class="container">
<h:panelGroup id="Users">
<h:form id="Form">
<h2>Detalles Usuario</h2>
<h:dataTable id="users" value="#{user.u}" styleClass="table table-striped table-bordered" headerClass="sorting_asc"
rowClasses="odd,even">
<h:column>
<f:facet name="header">#</f:facet>
#{user.u.id}
</h:column>
<h:column>
<f:facet name="header">Identificador</f:facet>
<h:inputText id="identificador" value="#{user.u.identificador}" />
</h:column>
<h:column>
<f:facet name="header">Nombre</f:facet>
<h:inputText id="nombres" value="#{user.u.nombres}"/>
<h:inputText id="apellidoP" value="#{user.u.apellidoPaterno}"/>
<h:inputText id="apellidoM" value="#{user.u.apellidoMaterno}"/>
</h:column>
<h:column>
<f:facet name="header">Active</f:facet>
<h:selectBooleanCheckbox id="check" value="#{user.u.active}"></h:selectBooleanCheckbox>
</h:column>
</h:dataTable>
<h:commandButton value="Actualizar" type="submit" styleClass="btn-primary" actionListener="#{user.actualizarUsuario}">
</h:commandButton>
</h:form>
<script type="text/javascript" src="js/paging-bootstrap.js"></script>
<script type="text/javascript" src="js/contenidoc.datatable.init.js"></script>
</h:panelGroup>
</div>
</ui:composition>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre konkrete problem wird verursacht, weil Sie mit den falschen parameter-Namen. Schauen Sie in die generierten HTML-Ausgabe und der HTTP-traffic-monitor für das Recht, die Namen der parameter.
Jedoch, Ihre eigentliche problem ist größer: deine Ansicht/Modell-Ansatz ist komplett falsch. Sie sollten nicht mit einem
<h:dataTable>
überhaupt. Es ist intented für eine Sammlung von Entitäten wieList<User>
, nicht für eine einzelne Einheit wieUser
. Sie sollten mit<h:panelGrid>
. Sie brauchen nicht zu explodieren/flatten-Modell-Eigenschaften in der controller überhaupt. Sie haben jene Eigenschaften, die bereits im Modell selbst. Sie nicht brauchen, um manuell traverse request-parameter-map. JSF wird schon alles tun, die Arbeit für Sie.Werde ich nicht umschreiben, dieses Durcheinander für Sie, aber auf den Punkt sollten Sie die folgenden kickoff Beispiel:
Modell:
Controller:
Anzeigen:
Das ist alles. Siehe auch unter anderem diese JSF 2.0 tutorial. Wie um Ihre versucht, um die Benutzer-ID, sollte man eher verwenden
<f:viewParam>
finden Sie auch Was kann <f:metadata>, <f:viewParam> und <f:viewAction> eingesetzt werden? und Kommunikation in JSF 2.0.FacesContext
überhaupt. Sie werden sehen, dass Sie am Ende viel kleiner und einfacher code.