【问题标题】:get values from inputtext in backed bean (jsf 2)从支持 bean 中的 inputtext 获取值(jsf 2)
【发布时间】:2013-01-30 13:48:17
【问题描述】:

我有一个包含一行的数据表,我需要编辑这一行的字段,所以我有一些带有值的 inputText,但是当我编辑它们并单击命令按钮时(调用方法“actualizarUsuario”值作为 null 传递。

这是我的 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>

【问题讨论】:

    标签: jsf-2 managed-bean


    【解决方案1】:

    您的具体问题是由于您使用了错误的参数名称而引起的。在生成的 HTML 输出和 HTTP 流量监视器中查找正确的参数名称。

    但是,您的实际问题更大:您的视图/模型方法完全错误。你根本不应该使用&lt;h:dataTable&gt;。它适用于像List&lt;User&gt; 这样的实体集合,而不是像User 这样的单个实体。你应该使用&lt;h:panelGrid&gt;。您根本不需要在控制器中分解/展平模型属性。您已经在模型本身中拥有这些属性。不需要手动遍历请求参数映射。 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>
    

    就是这样。另请参阅this JSF 2.0 tutorial。至于您通过 ID 获取用户的尝试,您应该使用&lt;f:viewParam&gt;,另请参阅What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?communication in JSF 2.0

    【讨论】:

    • 非常感谢!!!我在页面的源代码中看到了正确的名称,现在它正在工作!我还更改了面板网格的表格 :) .. 我认为 inputtext 的“id”可以工作 :S.. 现在我将尝试使用 !再次感谢!
    • 我想重复并强调您根本不需要遍历请求参数映射。您不必要地使事情复杂化并接管 JSF 作为 MVC 框架已经自动完成的事情。你基本上完全推翻了 JSF 并且没有利用它的权力。您可以通过这种方式使用普通的 JSP/Servlet。鉴于此构造,您需要以根本不需要获取FacesContext 的方式更改您的代码。你会看到你最终得到了更小更简单的代码。
    • 现在我删除了所有不必要的垃圾(参数图等),现在我的代码就像你告诉我的那样简单......我很高兴哈哈!我觉得自己做的愚蠢的事情就像土豆一样。唯一仍然存在的 facescontext 是“init”中的那个,我从另一个视图获取用户 ID。我将尝试使用 来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2011-04-11
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多