Jsf 2 回发期间请求参数为null

Jsf 2 回发期间请求参数为null,jsf-2,Jsf 2,我有一个显示用户列表的视图,从这个视图我可以转到任何选定用户的“详细信息”的另一个视图。在details视图中,我需要从2个select列表中选择一些值,然后在backedbean中获取这些值,并将它们添加到一个用户,最终将用户存储(更新)到数据库中。这些是我在“用户Bean”中的方法 使用此方法,我从“用户列表视图”中获取用户id,并从数据库中检索用户,以便在详细信息视图中显示其信息 public void getParam(){ FacesContext facesContext

我有一个显示用户列表的视图,从这个视图我可以转到任何选定用户的“详细信息”的另一个视图。在details视图中,我需要从2个select列表中选择一些值,然后在backedbean中获取这些值,并将它们添加到一个用户,最终将用户存储(更新)到数据库中。这些是我在“用户Bean”中的方法

使用此方法,我从“用户列表视图”中获取用户id,并从数据库中检索用户,以便在详细信息视图中显示其信息

public void getParam(){

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();

    //Obtener parametros del request
    Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
    Long param = Long.valueOf(parameterMap.get("id_usuario"));
    System.out.println(param);
    this.setU(controlador.getUser(param));


}
我的看法是:

<?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="Usuarios">
            <h:form id="FormUsuarios">
                <h2>Detalles Usuario</h2>

                <h:dataTable id="users" value="#{usuario.u}"  styleClass="table table-striped table-bordered" headerClass="sorting_asc"
                             rowClasses="odd,even">
                    <h:column>
                        <f:facet name="header">#</f:facet>
                        #{usuario.u.id}
                    </h:column>
                    <h:column>
                        <f:facet name="header">Identificador</f:facet>
                        <h:inputText id="identificador" value="#{usuario.u.identificador}" />
                    </h:column>
                    <h:column>
                        <f:facet name="header">Nombre</f:facet>
                        <h:inputText id="nombres" value=" #{usuario.u.nombres}"/>   <h:inputText id="apellidoP" value=" #{usuario.u.apellidoPaterno}"/> <h:inputText id="apellidoM" value=" #{usuario.u.apellidoMaterno}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">Active</f:facet>
                        <h:selectBooleanCheckbox id="check" value="#{usuario.u.active}"></h:selectBooleanCheckbox>
                    </h:column>

                </h:dataTable>

                <h3>Asignar Privilegios</h3>

                <h:selectOneMenu id="agrup" value="#{usuario.selected}" converter="omnifaces.SelectItemsConverter">
                    <f:selectItems value="#{agrupacion.agrupacion}" var="entity" itemLabel="#{entity.nombre}" itemValue="#{entity.id}"/>
                </h:selectOneMenu>

                <h:selectOneMenu id="rols" value="#{rol.selected}" converter="omnifaces.SelectItemsConverter">
                    <f:selectItems value="#{rol.roles}" var="rol" itemLabel="#{rol.nombre}" itemValue="#{rol.id}"/>
                </h:selectOneMenu>

                <h:commandButton  value="Asignar"  styleClass="btn-primary" actionListener="#{usuario.setPrivilegio}">
                </h:commandButton>


                <h3>Privilegios Asignados:</h3>

                <h:dataTable id="privilegios" value="#{usuario.u.privilegios}" var="p" styleClass="table table-striped table-bordered" headerClass="sorting_asc"
                             rowClasses="odd,even">
                    <h:column>
                        <f:facet name="header">#</f:facet>
                        #{p.id}
                    </h:column>
                    <h:column>
                        <f:facet name="header">Roles</f:facet>
                        #{p.rol.nombre}
                    </h:column>
                    <h:column>
                        <f:facet name="header">Grupos</f:facet>
                        #{p.agrupacion.nombre}
                    </h:column>
                    <h:column>
                        <f:facet name="header">Active</f:facet>
                        <h:selectBooleanCheckbox id="checkbox" value="#{p.active}"></h:selectBooleanCheckbox>
                    </h:column>

                </h:dataTable>






            </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>
视图中的表显示了所有信息,但当我想调用将所选项目添加到用户并将其保存在数据库中的方法(
setPrivilegio
)时,我会遇到此错误

这是如何造成的,我如何解决

这是我的完整“用户bean”:

@ManagedBean(name=“usuario”)
@视域
公共类UsuarioBean{
私人用益控制人;
私有Usuario u=新Usuario();
private Privilegio Selected=新Privilegio();
私有布尔活动;
专用长id_用户;
@施工后
公共void init(){
controlador=新的usuarioController();
}
公共长getId_用户(){
返回id\u用户;
}
公共无效设置id_用户(长id_用户){
this.id\u user=id\u user;
}
公共特权{
返回选中的;
}
已选择公共部门(已选择Privilegio){
选中=选中;
}
公共布尔getActive(){
主动返回;
}
public void setActive(布尔激活){
这个.active=active;
}
公共Usuario getU(){
getParam();
返回u;
}
公共无效setU(Usuario u){
这个。u=u;
}
私人名单usuario;
公共列表getUsuario(){
usuario=UsuarioDAO.getAll();
返回usuario;
}
public Usuario getById(长id_Usuario){
返回u;
}
公共无效setUsuario(列表usuario){
this.usuario=usuario;
}
公共无效saveUsuario(Usuario u){
萨维乌萨里奥控制中心(u);
}
public void getParam(){
FacesContext FacesContext=FacesContext.getCurrentInstance();
ExternalContext=facesContext.getExternalContext();
//获取参数删除请求
Map parameterMap=(Map)externalContext.getRequestParameterMap();
Long param=Long.valueOf(parameterMap.get(“id_usuario”);
系统输出打印项次(参数);
this.setU(controlador.getUser(param));
}
公共无效setPrivilegio(){
系统输出打印号(“hola”);
Privilegio pri=新Privilegio();
FacesContext FacesContext=FacesContext.getCurrentInstance();
ExternalContext=facesContext.getExternalContext();
//获取参数删除请求
Map parameterMap=externalContext.getRequestParameterMap();
Agrupacion Agrupacion=(Agrupacion)参数map.get(“agrup”);
System.out.println(agrupacion.getNombre());
Rol Rol=(Rol)参数映射获取(“rols”);
System.out.println(rol.getNombre());
System.out.println(“+rol.getNombre()+”+agrupacion.getNombre());
首席执行官(rol);
优先设定权(agrupacion);
pri.setActive(真);
this.getU().addPrivilegio(pri);
controlador.saveUsuario(this.getU());
}
}
这是第一个视图(用户列表,我从中转到用户详细信息)


乌萨里奥斯酒店
#
#{o.id}
识别器
#{o.identificador}
名义
#{o.nombres}{o.apellidoMaterno}{o.apellidoMaterno}
活跃的
德塔莱斯
德塔勒

此错误的原因是
参数map.get(“id\u usuario”)
为空。您应该研究如何将此参数从UI传递到支持bean。

糟糕的getter

    public Usuario getU() {
    getParam();
    return u;
    }
上面的getter是一个非常糟糕的主意。您自己也说过,该变量会进入
usuario
支持bean(我对此表示怀疑)。这很明显是因为不一致性(就像您正在经历的)以及在请求过程中多次调用getter的事实。有

private Usuario u=new Usuario()也是个坏主意。既然你已经有了,为什么这是必要的

      this.setU(controlador.getUser(param));
所有这些都应该发生在您的
@PostConstructor

    @PostConstruct
    public void init() {


    controlador=new usuarioController();
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();

    //Obtener parametros del request
    Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
    Long param = Long.valueOf(parameterMap.get("id_usuario"));
    System.out.println(param);
    this.setU(controlador.getUser(param));

    }

您的参数
id\u usuario
来自哪里?我在xhtml页面的任何地方都看不到它。很明显,它是空的。它来自另一个视图(用户列表视图):我在backed bean中使用它,它可以工作,因为我可以看到所选用户的“详细信息”,但在调用方法“setPrivilegio()”时失败。不要在getter中执行业务逻辑。谢谢你的回答。。我一开始是这样做的,但当我将该代码放入init()中时,我得到了以下错误:严重:错误呈现视图[/main.xhtml]com.sun.faces.mgbean.ManagedBeanCreationException:在com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:229)对托管bean usuario执行资源注入时出错在此行中:Long param=Long.valueOf(parameterMap.get(“id_usuario”);但是它说:在com.sun.faces.mgbean.BeanBuilder.InvokePostConstructuc上对托管bean usuario执行资源注入时出错
<?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="Usuarios">
            <h:form id="FormUsuarios">
                <h2>Listado de Usuarios</h2>
                <h:graphicImage url="http://a.dryicons.com/images/icon_sets/simplistica/png/128x128/add.png" width="30" height="30"/>

                <h:dataTable id="users" value="#{usuario.usuario}" var="o" styleClass="table table-striped table-bordered" headerClass="sorting_asc"
                             rowClasses="odd,even">
                    <h:column>
                        <f:facet name="header">#</f:facet>
                        #{o.id}
                    </h:column>
                    <h:column>
                        <f:facet name="header">Identificador</f:facet>
                        #{o.identificador}
                    </h:column>
                    <h:column>
                        <f:facet name="header">Nombre</f:facet>
                        #{o.nombres}  #{o.apellidoMaterno} #{o.apellidoPaterno}
                    </h:column>
                    <h:column>
                        <f:facet name="header">Active</f:facet>
                        <h:selectBooleanCheckbox id="check" value="#{o.active}"></h:selectBooleanCheckbox>
                    </h:column>
                    <h:column>
                        <f:facet name="header">Detalles</f:facet>


                        <h:outputLink  value="contenido/detalleUsuario.xhtml">
                            Detalle
                            <f:param name="id_usuario" value="#{o.id}"  />
                        </h:outputLink>
                    </h:column>
                </h:dataTable>
            </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>
    public Usuario getU() {
    getParam();
    return u;
    }
      this.setU(controlador.getUser(param));
    @PostConstruct
    public void init() {


    controlador=new usuarioController();
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();

    //Obtener parametros del request
    Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
    Long param = Long.valueOf(parameterMap.get("id_usuario"));
    System.out.println(param);
    this.setU(controlador.getUser(param));

    }
public Usuario getU() {
    return u;
}