我尝试使用"登录功能"开发一个简单的网络应用程序。为此,我创建了一个带有primefaces的对话框。 如果我点击登录,对话框打开,我可以登录并注销。但是如果我更改了网站,那么我就无法注销,因为对话框需要我输入必填字段
我在Glassfisch 4.0上运行Primefaces 5.2
这是一个完整的war文件,其中包含显示问题的所有代码。 (登录凭据为user:admin | password:admin) issueShowCase.war
的template.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<ui:insert name="head" />
</h:head>
<h:body>
<h:form id="mainForm">
<p:growl id="messages" showDetail="true" showSummary="false"/>
<h:messages />
<p:menubar>
<p:submenu label="Sites" icon="ui-icon-document">
<p:menuitem value="Recipes" outcome="page1.xhtml"/>
<p:separator />
<p:menuitem value="Categories" outcome="page2.xhtml"/>
</p:submenu>
<f:facet name="options">
<h:panelGroup id="loginLogout">
<p:commandButton rendered="#{not empty user}" value="Logout" title="Logout #{user}" icon="ui-icon-extlink" actionListener="#{loginController.logout}" update="loginLogout messages content" />
<p:commandButton rendered="#{empty user}" value="Login" icon="ui-icon-extlink" onclick="PF('loginDlg').show();" />
</h:panelGroup>
</f:facet>
</p:menubar>
<h:panelGroup id="content">
<ui:insert name="content"></ui:insert>
<ui:insert name="body"></ui:insert>
</h:panelGroup>
<p:dialog header="#{i18n['title.login']}" widgetVar="loginDlg" modal="true">
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="username" value="Username:" />
<p:inputText id="username" value="#{loginController.userName}" required="true" label="username" />
<h:outputLabel for="password" value="Password:" />
<p:password id="password" value="#{loginController.password}" required="true" label="password" />
<f:facet name="footer">
<p:commandButton value="Login" update="loginLogout messages content" actionListener="#{loginController.login}" oncomplete="handleLoginRequest(xhr, status, args)" />
</f:facet>
</h:panelGrid>
</p:dialog>
</h:form>
<script type="text/javascript">
function handleLoginRequest(xhr, status, args) {
if (args.validationFailed || !args.loggedIn) {
PF('loginDlg').jq.effect("shake", {
times : 3
}, 500);
} else {
PF('loginDlg').hide();
}
}
</script>
</h:body>
</html>
答案 0 :(得分:1)
感谢Kukeltje的帮助。考虑到我现在需要在每个按钮上使用process-attribute的问题,我找到了解决方案。
我将对话框放在一个自己的表单标签中,现在它就像一个魅力。
<h:panelGroup id="content">
<ui:insert name="content"></ui:insert>
<ui:insert name="body"></ui:insert>
</h:panelGroup>
</h:form>
<h:form id="dlgForm">
<p:dialog header="#{i18n['title.login']}" widgetVar="loginDlg" modal="true">
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="username" value="Username:" />
<p:inputText id="username" value="#{loginController.userName}" required="true" label="username" />
<h:outputLabel for="password" value="Password:" />
<p:password id="password" value="#{loginController.password}" required="true" label="password" />
<f:facet name="footer">
<p:commandButton value="Login" update=":mainForm:loginLogout :mainForm:messages :mainForm:content" actionListener="#{loginController.login}" oncomplete="handleLoginRequest(xhr, status, args)" />
</f:facet>
</h:panelGrid>
</p:dialog>
</h:form>
答案 1 :(得分:0)
在注销按钮上添加process
属性以仅处理命令按钮,因此请为其指定值'@this'
<p:commandButton process="@this" rendered="#{not empty user}" value="Logout" title="Logout #{user}" icon="ui-icon-extlink" actionListener="#{loginController.logout}" update="loginLogout messages content" />