заголовок, содержащий h: link и h: commandLink, не будет работать? - PullRequest
0 голосов
/ 11 октября 2011

У меня странная ситуация.У меня есть приложение jsf 2.0, со страницами шаблонов.в заголовке у меня есть несколько ссылок с h: link, чтобы сохранить закладку url, и h: commandLink, который я использую для входа и выхода .. проблема в том, что когда я перехожу на определенную страницу через h: link, пусть URL становится bla.jsf? uName = dino, тогда, когда я нахожусь в bla.jsf? uName = dino, я нажимаю кнопку выхода, которая должна привести меня к signout.jsf, не будет работать.вместо этого я перехожу на страницу bla.jsf без? uName = dino.

У меня нет вложенной формы h: и мне все кажется нормальным.Есть ли какие-либо предположения, почему он ведет себя так?

Я уверен, что вы спрашиваете, есть ли у меня h: form на h: commandLink.да, у меня тоже есть. Вот мой код:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui" 
    xmlns:ui="http://java.sun.com/jsf/facelets">

<div class="floatRight">
<h:form id="firstFormHeader" prependId="false">
 <p:autoComplete id="searchInputId" size="40" style="z-index: 20;" value="#{autoComplete.text}" completeMethod="#{autoComplete.complete}"/>
 <h:commandButton  value="#{label.search}" action="#{autoComplete.getSearchedVideo}" />
 <p:watermark for="searchInputId" value="#{label.search}" />    
</h:form>
</div>

<div style="z-index: 1;" id="topsection">


<div style="position:relative; bottom:-51px;">
    <div id="menu" style="height:37px;" class="title ui-widget-header">
    <h:panelGrid border="0" columns="2" style="float: left;">
     <h:column>

         <h:panelGrid columns="2">
      <h:column>

    <h:form id="secondFormHeader" prependId="false" >
<h:selectOneMenu id="videoGenereHeaderId" value="#{homePageVideoLoader.videoCategory}"  required="true"  onchange="submit()" valueChangeListener="#{homePageVideoLoader.getSelectedCatagoryList}">
        <f:selectItem id="item0" itemLabel="#{select.category}" itemValue="" />
        <f:selectItem id="item1" itemLabel="#{select.animation}" itemValue="23" />
        <f:selectItem id="item2" itemLabel="#{select.autos}" itemValue="15" />
        <f:selectItem id="item3" itemLabel="#{select.comedy}" itemValue="10" />
        <f:selectItem id="item4" itemLabel="#{select.documentary}" itemValue="19" />
        <f:selectItem id="item5" itemLabel="#{select.drama}" itemValue="4" />
        <f:selectItem id="item6" itemLabel="#{select.education}" itemValue="16" />
        <f:selectItem id="item7" itemLabel="#{select.hiphop}" itemValue="5" />
        <f:selectItem id="item8" itemLabel="#{select.guragigna}" itemValue="12" />
        <f:selectItem id="item9" itemLabel="#{select.news}" itemValue="6" />
        <f:selectItem id="item10" itemLabel="#{select.oldies}" itemValue="7" />
        <f:selectItem id="item11" itemLabel="#{select.reggae}" itemValue="8" />
        <f:selectItem id="item12" itemLabel="#{select.harari}" itemValue="13" />
        <f:selectItem id="item13" itemLabel="#{select.oromigna}}" itemValue="14" />
    <!--    <f:selectItem id="item7" itemLabel="#{select.entertainment}" itemValue="ent" />
        <f:selectItem id="item8" itemLabel="#{select.gaming}" itemValue="gam" /> 
        <f:selectItem id="item9" itemLabel="#{select.health}" itemValue="hea" />
        <f:selectItem id="item10" itemLabel="#{select.howto}" itemValue="how" /> -->
        <f:selectItem id="item14" itemLabel="#{select.music}" itemValue="3" />
        <f:selectItem id="item15" itemLabel="#{select.politics}" itemValue="18" />
    <!--   <f:selectItem id="item13" itemLabel="#{select.nonprofit}" itemValue="non" />
        <f:selectItem id="item14" itemLabel="#{select.blog}" itemValue="blo" />
        <f:selectItem id="item15" itemLabel="#{select.animals}" itemValue="anm" />
        <f:selectItem id="item16" itemLabel="#{select.science}" itemValue="sci" />
        <f:selectItem id="item17" itemLabel="#{select.sport}" itemValue="spo" />
        <f:selectItem id="item18" itemLabel="#{select.travel}" itemValue="tra" /> -->

        </h:selectOneMenu>

</h:form>

</h:column>
<h:column>


    <h:outputText rendered="#{userAuthentication.userLogged and userAuthentication.user.usersValid}" value="#{label.hello} "/>
     <h:link rendered="#{userAuthentication.userLogged and userAuthentication.user.usersValid}" value="#{userAuthentication.user.usersFirst}" outcome="userhome?uName=#{userAuthentication.user.usersUname}">

         </h:link>


   </h:column>
</h:panelGrid>

     </h:column>
    </h:panelGrid>
    <h:panelGrid border="0" columns="2" styleClass="menuPostion">
     <h:column>

            <h:link outcome="home" value="#{label.home}" /> | 

        <h:link outcome="upload" value="#{label.upload}" /> | 
        <h:form id="thridFormHeader" prependId="false" >
        <h:commandLink rendered="#{userAuthentication.userLogged}" value="#{label.signout}" action="#{userAuthentication.doSignOut}" immediate="true"/> 
        </h:form>
        <h:link rendered="#{!userAuthentication.userLogged}" value="#{label.createAccount}" outcome="registration" /> 
        <h:outputText rendered="#{!userAuthentication.userLogged}" value=" | "/>    
        <h:link rendered="#{!userAuthentication.userLogged}" value="#{label.signin}" outcome="signin" />

      </h:column>    
      <h:column>
        <h:form prependId="false" id="languageForm">
         <h:selectOneMenu value="#{language.localeCode}" onchange="submit()"
                    valueChangeListener="#{language.countryLocaleCodeChanged}">
                    <f:selectItems value="#{language.countriesInMap}" /> 
                </h:selectOneMenu>
         </h:form>
       </h:column>   
    </h:panelGrid>
    </div>
</div>
</div>
</ui:composition>

Второй <h:form> - тот, который не работает.


Обновление : сорри не работает.он даже не собирается использовать метод doSignOut .. как только я попадаю на страницу bla.jsf? uName = dino и вижу исходный код ссылки выхода, он показывает мне

<form id="j_idt31" enctype="application/x-www-form-urlencoded" action="/myapp/content/bla.jsf" method="post" name="j_idt31" target="">

...

и, очевидно, bla.jsf выдает мне сообщение об ошибке, потому что оно ожидает, чтобы значение uName имело значение.почему так?это ошибка?

Кроме того, вы могли заметить, что у меня есть h: selectOneMenu, который отправляет данные в бин при изменении значения, но как только я нахожусь на bla.jsf? uName = dino и пытаюсьизмените значение h: selectOneMenu, оно не будет работать, потому что оно по какой-то причине не перенаправлено на bean-компонент, поэтому h: commandLink все же h: link (s) работают нормально .. как я могу решить это BalusC .. Большое спасибоза то, что нашли время и ответили кстати

Ответы [ 2 ]

1 голос
/ 11 октября 2011

<h:commandLink> вложено в <h:form>, чей HTML-сгенерированный URL <form action> по умолчанию соответствует текущему URL запроса. В основном это ссылка, которая использует JavaScript для отправки этой формы. Поскольку действие формы по умолчанию соответствует текущему URL-адресу запроса, вы не увидите изменений в URL-адресе запроса. Технически, это работает отлично отлично .

Если вы хотите изменить URL-адрес запроса после отправки, вам необходимо отправить перенаправление. Вы можете сделать это, добавив параметр faces-redirect=true к значению результата:

public String doSignOut() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "signout?faces-redirect=true";
}

Или, если вы все еще используете устаревший <navigation-case> в faces-config.xml, вам нужно добавить запись <redirect />.

0 голосов
/ 12 октября 2011

с помощью великого BalusC я смог найти свое решение.мой код не работал, потому что это была строка меню, поэтому каждый раз, когда страница меняет заголовок или строка меню остается неизменной, это означает, что форма не будет изменена.

Я не знаю почему, но вместо использования h: link я использовал h: commandLink с комбинацией f: setPropertyActionListener для отправки uName, затем на стороне сервера я сделал это

public String goToUserHomePage(){
     methodNM = CLASS_NAME+".goToUserHomePage()";
     log.info("in " + methodNM);
     System.out.println("in " + methodNM);

     System.out.println("in " + methodNM+"-------------------------"+user.getUsersUname());

     return "userhome?uName="+user.getUsersUname()+"&amp;faces-redirect=true";
}

при этом все ссылки, будь то с h: commandLink или h: link, работают нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...