2

昨日、ボタンを 2 回押さなければ機能しないという質問を投稿しました。stackoverflow の特徴である適切なサポートを受けましたが、問題はまだ存在します。コードを最小限に減らしましたが、問題はまだ存在します。BalusCの提案をよく読んで、フォーム内にフォームが見つかることを期待しています。確かに何も見えないので、追加の目で何かが見えることを期待してコードを投稿します。

ウェルカム (ログイン部分) から呼び出すテンプレートがあります。これは、コマンド ボタンを持つ userInfo に移動します。これは、不思議なことに 2 回押さなければならないコマンド ボタンです。コマンド ボタンを 2 回押すと、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>

ようこそ1.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>

最後になりましたが、2 回押す必要があるボタンを含む 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 と関係があるというのは正しいかもしれませんが、それもわかりません。

すべての助けをありがとう。宜蘭

userInfo ページに戻るボタンを userPhoto ページに追加しました。ログインボタンは、最初に押したときに機能する唯一のボタンです。コマンド ボタンを使用して 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>
4

1 に答える 1

7

非常に具体的な問題があります。通常の同期リクエストではなく ajax で完全にナビゲートしており、ビュー全体が新しいビューに置き換えられます。新しいビューのフォームには、 JSF issue 790に実際に関連するビュー ステートがなくなりました。フォームが同じビューに存在しないため、updateのフォームを参照することもできません。<p:commandButton>

結局のところ、完全に ajax でナビゲートすることはお勧めできません。これにより、ページがブックマークできなくなり、検索ボットのインデックスが作成できなくなります。すべての形式を置き換えることをお勧めします

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

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

これにより、通常の同期リクエストによってナビゲートされ、すべてのフォームがビューステートを持つ新しいビューが作成されます。<p:button>は を必要としないことに注意してください<h:form>。必要に応じて省略できます。


具体的な問題とは関係ありませんが、エンドユーザーがブラウザーのアドレスバーに URL を入力/推測して要求できないようmaster.xhtmlに、/WEB-INFフォルダーに配置することもお勧めします。/WEB-INF に配置する必要がある XHTML ファイルとそうでないファイルはどれですか?も参照してください。

于 2012-05-31T13:16:21.427 に答える