昨天我发布了一个问题,关于必须按下两次按钮才能使其正常工作。我得到了很好的帮助,这是stackoverflow的标志,但是问题仍然存在。我将代码缩减到最低限度,问题仍然存在。我仔细阅读了BalusC的建议,希望能在表单内找到表单。我当然看不到任何东西,所以我将发布我的代码,以希望更多的眼睛看到一些东西。
我有一个模板,可以从“欢迎”(登录部分)中调用。这将转到具有命令按钮的userInfo。这是命令按钮,我神秘地不得不按两次。在第二次按下命令按钮将带我到userPhoto。一切都缩小到最小,以便我可以发布。
master.xthml:
<?xml version="1.0" encoding="UTF-8"?> <!-- To change this template, choose Tools | Templates and open the template in the editor. --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head> <title>Master template</title> </h:head> <h:body> <p:layout fullPage="true" > <p:layoutUnit position="north" size="254"> Top </p:layoutUnit> <p:layoutUnit position="east" size="50" resizable="true"> Hello </p:layoutUnit> <p:layoutUnit position="south" size="30"> south </p:layoutUnit> <p:layoutUnit position="center"> <ui:insert name="AreaOne">Default text</ui:insert> </p:layoutUnit> </p:layout> </h:body> </html>
welcome1.xhtml:
<?xml version="1.0" encoding="UTF-8"?> <!-- To change this template, choose Tools | Templates and open the template in the editor. --> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> <ui:composition template="master.xhtml"> <ui:define name="AreaOne"> <h:form id="form1"> <p:commandButton type="submit" value="Login" action="userInfo" /> </h:form> <p:messages /> </ui:define> </ui:composition> </html>
最后但并非最不重要的一点是userInfo.xhtml,其中需要按下两次按钮:
<?xml version="1.0" encoding="UTF-8"?> <!-- To change this template, choose Tools | Templates and open the template in the editor. --> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> <ui:composition template="master.xhtml"> <ui:define name="AreaOne"> <h:form id="formP"> <p:commandButton type="submit" value="photos" action="userPhoto" /> </h:form> <p:messages /> </ui:define> </ui:composition> </html>
我看不到任何嵌套在任何其他表单中的表单,但是某些地方是错误的,我无法弄清楚是什么。也许BalusC与ajax有关,这是正确的,但我也没有看到。
感谢您的所有帮助。宜兰
我在userPhoto页面上添加了一个按钮,该按钮可返回到userInfo页面。“登录”按钮是唯一在第一次按下时起作用的按钮。当我使用命令按钮在userInfo和userPhoto之间来回切换时,总是需要2次按下。我将展示userPhoto的中心
<ui:composition template="master.xhtml"> <ui:define name="AreaOne"> <h:form id="form3"> <p:commandButton type="submit" value="home page" action="userInfo" /> </h:form> <p:messages /> </ui:define> </ui:composition>
您有一个非常具体的问题。您正在通过ajax进行全面导航,而不是通过常规同步请求进行导航,整个视图将替换为新视图。新视图中的表单不再具有视图状态,该状态确实与JSF问题790有关。它也不可能引用表格中update的<p:commandButton>作为形式在同一视图不存在。
update
<p:commandButton>
毕竟,建议不要通过ajax进行完全导航。它使您的页面不可书签,也不能被searchbotindexable。我建议替换所有形式的
<p:commandButton ... action="otherViewId" />
通过
<p:button ... outcome="otherViewId" />
这将通过正常的同步请求进行导航,并将创建新的视图,其中所有表单都将具有其视图状态。请注意,<p:button>不需要<h:form>,您可以根据需要将其忽略。
<p:button>
<h:form>
无关 的具体问题,我也建议把master.xhtml中/WEB- INF文件夹,以便在最终用户不能输入/猜测它的URL在浏览器地址栏中提出要求。
master.xhtml
/WEB- INF