嗨,我创建了一个小表单来创建和编辑我的应用程序的用户。我可以编辑他们没有问题,但我不能创建新的用户。
我有一个数据表显示数据库中的用户我有一个按钮名为Nuevo for New user
<p:commandButton id="nuevobtn" value="Nuevo"
oncomplete="usuarioPanel.show()"
actionListener="#{usuarioAdminController.nuevo}" />
每当我点击这个按钮控制器就会调用函数nuevo在控制器上看起来是这样的
public void nuevo() {
System.out.println("nuevo usuario ");
usuarioAdminDM.setUsuario(new Usuario());
}
这个想法是,当你点击按钮,一个对话框与用户表单显示,功能Nuevo创建空白用户,所以我可以只填写表单。
但是当我点击那个按钮时这个就会出现
<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error><error-name>class javax.el.PropertyNotFoundException</error-name><error-message><![CDATA[/pages/admin/usuario.xhtml @52,27 value="#{usuarioAdminDM.usuario.usuario}": Target Unreachable, 'usuario' returned null]]></error-message></error></partial-response>
看我的jboss服务器的日志,我没有看到system . out。Println ("nuevo usuario ");
所以usuario为null是有意义的,因为它没有调用我的"nuevo"方法。我是JSF的新手,所以我很确定这是我忽略的东西。
这是我的usuarioAdminDM类
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import ec.edu.puce.biologia.model.Usuario;
@ManagedBean(name="usuarioAdminDM")
@ViewScoped
public class UsuarioAdminDM implements Serializable{
private static final long serialVersionUID = 1L;
private List<Usuario> usuarios;
private Usuario usuario = new Usuario();
private Usuario usuarioBusqueda = new Usuario();
public List<Usuario> getUsuarios() {
return usuarios;
}
public void setUsuarios(List<Usuario> usuarios) {
this.usuarios = usuarios;
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(final Usuario usuario) {
this.usuario = usuario;
}
public Usuario getUsuarioBusqueda() {
return usuarioBusqueda;
}
public void setUsuarioBusqueda(final Usuario usuarioBusqueda) {
this.usuarioBusqueda = usuarioBusqueda;
}
}
这是我的表格
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition 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"
template="/WEB-INF/templates/biologiaTemplate.xhtml">
<ui:define name="title">Administración de Usuarios</ui:define>
<ui:define name="content">
<h:messages />
<h:form id="usuarioAdminForm">
<p:commandButton id="nuevobtn" value="Nuevo"
oncomplete="usuarioPanel.show()"
action="#{usuarioAdminController.nuevo}" />
<p:dataTable var="usuarios" rowKey="#{usuarios.id}"
value="#{usuarioAdminDM.usuarios}" id="tablaUsuario"
selection="#{usuarioAdminDM.usuario}" selectionMode="single">
<f:facet name="header">
Seleccionar el Boton EDITAR después de seleccionar el Usuario
</f:facet>
<p:column headerText="Usuario">
<h:outputText value="#{usuarios.usuario}" />
</p:column>
<p:column headerText="Nombre">
<h:outputText value="#{usuarios.nombre}" />
</p:column>
<p:column headerText="E-mail">
<h:outputText value="#{usuarios.email}" />
</p:column>
<p:column headerText="Tipo">
<h:outputText value="#{usuarios.tipo}" />
</p:column>
<p:column headerText="Activo">
<h:outputText value="Si" rendered="#{usuarios.activo}" />
<h:outputText value="No" rendered="#{!usuarios.activo}" />
</p:column>
<f:facet name="footer">
<p:commandButton id="viewButton" value="Editar"
process="@this,tablaUsuario" icon="ui-icon-search"
update=":usuarioAdminForm:formUsuario"
oncomplete="usuarioPanel.show()" />
</f:facet>
</p:dataTable>
<p:dialog id="usuarioModal" header="Usuario" widgetVar="usuarioPanel"
modal="true">
<p:messages id="messages" showDetail="true" autoUpdate="true" />
<h:panelGrid columns="2" id="formUsuario">
<h:outputLabel value="Nombre" for="nombreInput" />
<h:inputText value="#{usuarioAdminDM.usuario.nombre}"
id="nombreInput" />
<h:outputLabel value="Usuario" for="usuarioInput" />
<h:inputText value="#{usuarioAdminDM.usuario.usuario}"
id="usuarioInput" />
<h:outputLabel for="passwordInput1" value="Contraseña: " />
<p:password id="passwordInput1"
value="#{usuarioAdminDM.usuario.password}" match="passwordInput2"
label="Password 1" />
<h:outputLabel for="passwordInput2" value="Validación: " />
<p:password id="passwordInput2"
value="#{usuarioAdminDM.usuario.password}" label="Password 2" />
<h:outputLabel value="E-mail" for="emailInput" />
<h:inputText value="#{usuarioAdminDM.usuario.email}"
id="emailInput" />
<h:outputLabel value="Tipo" for="tipoInput" />
<h:selectOneMenu id="tipoInput"
value="${usuarioAdminDM.usuario.tipo}">
<f:selectItem itemValue="ADMINISTRADOR" itemLabel="Administrador" />
<f:selectItem itemValue="EDITOR" itemLabel="Editor" />
<f:selectItem itemValue="VISITANTE" itemLabel="Visitante" />
</h:selectOneMenu>
<h:outputLabel value="Activo" for="activoInput" />
<p:selectOneRadio id="activoInput"
value="#{usuarioAdminDM.usuario.activo}">
<f:selectItem itemLabel="Sí" itemValue="True" />
<f:selectItem itemLabel="No" itemValue="False" />
</p:selectOneRadio>
</h:panelGrid>
<p:commandButton value="Guardar" update="tablaUsuario,messages"
id="guardarBtn" actionListener="#{usuarioAdminController.guardar}" />
</p:dialog>
<p:remoteCommand name="inicializar" process="@this"
actionListener="#{usuarioAdminController.init()}"
update="tablaUsuario" />
</h:form>
<script type="text/javascript">
inicializar();
</script>
</ui:define>
</ui:composition>
这里是完整的控制器类
@ManagedBean(name="usuarioAdminController")
@ViewScoped
public class UsuarioAdminController {
@ManagedProperty(value="#{usuarioAdminDM}")
private UsuarioAdminDM usuarioAdminDM;
@EJB
private SeguridadService servicio;
@PostConstruct
public void init() {
System.out.println("Inicializando!");
obtenerUsuarios();
}
public void nuevo(ActionEvent event) {
System.out.println("nuevo usuario ");
usuarioAdminDM.setUsuario(new Usuario());
}
public void guardar() {
//try {
System.out.println("Grabar o guardar usuario");
if (usuarioAdminDM.getUsuario() != null) {
if (usuarioAdminDM.getUsuario().getId() == null) {
System.out.println("Nuevo usuario");
servicio.guardar(usuarioAdminDM.getUsuario());
} else {
System.out.println("Actualizando");
servicio.actualizar(usuarioAdminDM.getUsuario());
}
}
obtenerusuarios();
/*} catch (EntidadNoGrabadaException e) {
e.printStackTrace();
}*/
}
public UsuarioAdminDM getUsuarioAdminDM() {
return usuarioAdminDM;
}
public void obtenerusuarios() {
usuarioAdminDM.setUsuarios(servicio.obtenerTodos());
}
public void setUsuarioAdminDM(UsuarioAdminDM usuarioAdminDM) {
this.usuarioAdminDM = usuarioAdminDM;
}
public void obtenerUsuarios(){
usuarioAdminDM.setUsuarios(servicio.obtenerTodos()) ;
}
}
我认为有必要让de p:commandButton
这样处理自己
<p:commandButton id="nuevobtn" value="Nuevo"
oncomplete="usuarioPanel.show()"
action="#{usuarioAdminController.nuevo}" process="@this"/>