【发布时间】:2013-03-04 18:26:16
【问题描述】:
我有一个 JSF 页面,我打算用它来编辑用户的信息。编辑用户所需的所有组件都包含在同一个页面中,并且我正在使用 render 属性来确定应该呈现哪些组件。第一个面板组被渲染,当您输入用户登录名并单击按钮时,一切正常,第二个面板组显示,您可以在文本字段中更改用户信息。问题在于单击手风琴面板第一个选项卡中的按钮,它不起作用。我已经尝试过请求范围和视图范围,并且在使用任何一个时都遇到了同样的问题。
<f:view contentType="text/html">
<h:head>
<f:facet name="first">
<meta http-equiv="X-UA-Compatible" content="EmulateIE8" />
<meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/>
<title></title>
</f:facet>
</h:head>
<h:body styleClass="pageDefaultBGC">
<p:layout fullPage="true">
<f:facet name="last">
<h:outputStylesheet library="css" name="discovery.css"></h:outputStylesheet>
</f:facet>
<p:layoutUnit styleClass="headerDiv" position="north" size="100">
<h:graphicImage library="images" name="header.jpg"></h:graphicImage>
</p:layoutUnit>
<p:layoutUnit styleClass="navDiv" position="west" size="200">
<h:outputText value="Navigation Menu"></h:outputText>
<br/>
<hr/>
<h:outputLink styleClass="navLink" value="index.xhtml">Admin Home</h:outputLink>
<br/>
<h:outputLink styleClass="navLink" value="addNewUser.xhtml">Add New User</h:outputLink>
<br/>
<h:outputLink styleClass="navLink" value="edituser.xhtml">Edit User</h:outputLink>
<br/>
</p:layoutUnit>
<p:layoutUnit position="center" id="main">
<h:form id="editForm">
<h:panelGroup rendered="#{!adminManagedBean.editingUser}">
<h2>Edit User Account</h2>
<h:outputLabel for="useredit" value="Enter User's Name:"></h:outputLabel>
<h:inputText id="useredit" value="#{adminManagedBean.editUserLogin}" required="true"></h:inputText>
<br/><br/>
THIS BUTTON WORKS!---><h:commandButton value="Submit" action="#{adminManagedBean.startUserEdit()}"></h:commandButton>
</h:panelGroup>
<h:panelGroup rendered="#{adminManagedBean.editingUser}">
<h:outputText value="Editing User:"></h:outputText>
<p:dataTable value="#{adminManagedBean.editUser}" var="u">
<p:column styleClass="dataTableHeader" headerText="Full Name">#{u.firstName} #{u.lastName}</p:column>
<p:column styleClass="dataTableHeader" headerText="Username">#{u.login}</p:column>
<p:column styleClass="dataTableHeader" headerText="Phone">#{u.phone}</p:column>
<p:column styleClass="dataTableHeader" headerText="Email">#{u.email}</p:column>
<p:column styleClass="dataTableHeader" headerText="Agency ID">#{u.agencyId}</p:column>
</p:dataTable>
<br/>
<h:outputText value="User's Current Roles"></h:outputText>
<ul>
<ui:repeat value="#{adminManagedBean.editUsersRoles}" var="cr">
<li><h:outputText value="#{cr}"></h:outputText></li>
</ui:repeat>
</ul>
<br/>
<h:outputText value="Select an item to edit using the menu below"></h:outputText>
<br/>
<p:accordionPanel>
<p:tab title="Edit User's Name" titleStyleClass="accordianTitleStyle">
<h:panelGrid styleClass="panelGridStyle1" columns="2" cellpadding="10">
<h:outputText value="First Name:"></h:outputText>
<h:inputText value="#{adminManagedBean.editUser.firstName}"></h:inputText>
<h:outputText value="Last Name:"></h:outputText>
<h:inputText value="#{adminManagedBean.editUser.lastName}"></h:inputText>
THIS BUTTON DOESN'T WORK----><h:commandButton value="Save Changes" action="#{adminManagedBean.saveNameChange()}"></h:commandButton>
<h:commandButton value="Cancel Changes"></h:commandButton>
</h:panelGrid>
</p:tab>
值为“Save Changes”的命令按钮是有问题的按钮,因为从未调用过 bean 方法。
@ManagedBean
@ViewScoped
public class AdminManagedBean implements Serializable {
public String saveNameChange(){
log.info("save Name called");
this.editUser = ssb.updateUser(editUser);
return "edituser";
}
单击按钮时未调用方法“saveNameChange”。任何帮助将不胜感激。
【问题讨论】:
-
所有这些代码都是重现错误所必需的吗?
-
不,它还不够完整,无法运行和重现。为了实现这一点,您需要能够为底层数据库创建一个持久性单元。我将代码放在 xhtml 页面中,直到不调用应该调用的方法以及 bean 中的特定方法。
-
我看到了您的代码,但在所有不相关的 JSF 代码之间迷失了方向。至少在您的 JSF 代码中添加一个注释,显示 不起作用的按钮。
-
在有效的按钮上添加了“THIS BUTTON WORKS--->”,在无效的按钮上添加了“THIS BUTTON DOESN'T WORK----->”。
-
请学习如何隔离问题并创建SSCCE。例如,代码中的
<hr/>是否绝对有必要让我们通过将代码复制粘贴到空白的游乐场环境中来重现您的问题?如果不是,那么它只是纯粹的噪音。而你似乎有很多,导致我们没有立即看到森林中的树,因此不愿意花精力去寻找它。这同样适用于<p:layoutUnit>、<h:outputText>等一些JSF标签。