小编典典

连续两次按下按钮

ajax

昨天我发布了一个问题,关于必须按下两次按钮才能使其正常工作。我得到了很好的帮助,这是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>

阅读 240

收藏
2020-07-26

共1个答案

小编典典

您有一个非常具体的问题。您正在通过ajax进行全面导航,而不是通过常规同步请求进行导航,整个视图将替换为新视图。新视图中的表单不再具有视图状态,该状态确实与JSF问题790有关。它也不可能引用表格中update<p:commandButton>作为形式在同一视图不存在。

毕竟,建议不要通过ajax进行完全导航。它使您的页面不可书签,也不能被searchbotindexable。我建议替换所有形式的

<p:commandButton ... action="otherViewId" />

通过

<p:button ... outcome="otherViewId" />

这将通过正常的同步请求进行导航,并将创建新的视图,其中所有表单都将具有其视图状态。请注意,<p:button>不需要<h:form>,您可以根据需要将其忽略。


无关 的具体问题,我也建议把master.xhtml/WEB- INF文件夹,以便在最终用户不能输入/猜测它的URL在浏览器地址栏中提出要求。

2020-07-26