Вопрос по ajax, jsf, primefaces – продолжение нажатия кнопки дважды

2

Вчера я опубликовал вопрос о необходимости дважды нажать кнопку, чтобы она заработала. Я получил хорошую помощь, которая является отличительной чертой 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 нажатия. Я покажу центр пользователя Photo

<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>
Я имел в виду, что вы оставляете только форму в master.xhtml Daniel
хорошо, попробуй заменить<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:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" template="master.xhtml"> Daniel
Привет, Даниэль. Это заставило бы это называть себя рекурсивно. Текст по умолчанию только для того, чтобы что-то появилось, если я не использую: define name = & Area = One & quot; & gt; Ilan Tal
Мне кажется, это слишком ограничивает. Я хочу быть в состоянии сделать что-нибудь внутри области один. Шаблон заполняет все общие элементы, и areaOne изменяется от одного xhtml к другому. Ilan Tal
скажи, что будет если заменить<ui:insert name="AreaOne">Default text</ui:insert> с<ui:include   как это<ui:include src="master.xhtml" /> (только для теста) не видели в витрине, что они использовали `` & lt; ui: insert` в макетах ... Daniel

Ваш Ответ

1   ответ
7

У вас очень специфическая проблема. Вы полностью перемещаетесь по ajax вместо обычного синхронного запроса, и весь вид заменяется новым. Формы в новом представлении больше не имеют состояния представления, которое действительно связано сВыпуск JSF 790, Также невозможно ссылаться на формы вupdate из<p:commandButton> поскольку формы не существуют в том же виде.

В конце концов, не рекомендуется полностью перемещаться по ajax. Это делает вашу страницу не закладкой и не поисковым ботином. Я предлагаю заменить все формы

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

от

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

Это будет перемещаться по обычным синхронным запросам и создаст новые представления, в которых все формы будут иметь свое состояние просмотра. Обратите внимание, что<p:button> не требует<h:form>Вы можете опустить его, если это необходимо.


Unrelated к конкретной проблеме я тоже предлагаю поставитьmaster.xhtml в/WEB-INF папку, так что конечные пользователи никогда не смогут запросить его, введя / угадав его URL в адресной строке браузера. Смотрите такжеКакие файлы XHTML мне нужно поместить в / WEB-INF, а какие нет?

@Balusc та же проблема здесь. Что делать, если мне нужно действие (обрабатывать вещи в компоненте поддержки), а не прямой результат. В этом случае я получаю два клика. Я решил это, программно выполнив перенаправление из метода действия вместо возврата строки (это не имитирует результат =?). Есть ли более простой способ сделать это? У меня есть страница / форма входа в систему, а также условно отображаемая форма выхода из системы в строке меню сайта (в пользовательском интерфейсе: include). Перед исправлением: Войти со страницы входа перенаправить на домашнюю страницу. Пользователь должен дважды щелкнуть, чтобы выйти. В этом нет необходимости, если они сначала переходят на другую страницу.
Добро пожаловать.
Спасибо. Я не знал, что commandButton перемещается по Ajax. Мне придется искать некоторую информацию о том, когда желательно перемещаться по ajax, а когда нет. Я заметил, что это не изменяло значение страницы в строке состояния, что кажется странным, но я не знал, что с этим делать. Кнопка - это ответ. Также было бы хорошо, если бы я не был вынужден иметь тег формы. Ilan Tal

Похожие вопросы