1

1行のデータテーブルがあるので、この行のフィールドを編集する必要があるので、値を含むinputTextがいくつかありますが、編集してコマンドボタン(メソッド「actualizarUsuario」を呼び出す)をクリックすると、値は次のように渡されます。ヌル。

これは私のBeanコードです:

@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);
    }



}

これが私の見解です。

<?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>
4

1 に答える 1

5

間違ったパラメータ名を使用したために、具体的な問題が発生します。生成されたHTML出力とHTTPトラフィックモニターで正しいパラメーター名を確認します。

ただし、実際の問題はもっと大きくなります。ビュー/モデルのアプローチは完全に間違っています。を使用するべきではありません<h:dataTable>List<User>これは、のような単一のエンティティではなく、のようなエンティティのコレクションを対象としていUserます。を使用する必要があります<h:panelGrid>。コントローラのモデルプロパティを分解/フラット化する必要はまったくありません。これらのプロパティはすでにモデル自体にあります。リクエストパラメータマップを手動でトラバースする必要はありません。JSFはすでにあなたのためにすべての仕事をします。

この混乱を書き直すことはしませんが、次のキックオフの例に従う必要があります。

モデル:

public class User {

    private Long id;
    private String username;
    private String firstname;
    private String lastname;
    // ...

    // Autogenerate standard getters/setters.
}

コントローラ:

@ManagedBean
@ViewScoped
public class EditUser {

    private User user; // Initialize it in postconstruct or as viewparam.
    private UserService service; // Initialize it as @EJB or in postconstruct.

    public void save() {
        service.save(user); // That's all. Really.
    }

    public User getUser() {
        return user;
    }

    // No other getters/setters! They are all already in User class.
}

意見:

<h:panelGrid>
    <h:inputText value="#{editUser.user.username}" />
    <h:inputText value="#{editUser.user.firstname}" />
    <h:inputText value="#{editUser.user.lastname}" />
    <h:commandButton value="save" action="#{editUser.save}" />
</h:panelGrid>

それで全部です。特に、このJSF2.0チュートリアルも参照してください。IDでユーザーを取得する試みについては、むしろ使用する必要があります。<f:metadata>、<f:viewParam>、および<f:viewAction>は何に使用できますか?<f:viewParam>も参照してください。およびJSF2.0での通信

于 2013-01-30T14:05:51.063 に答える