2015-08-21 3 views
0

В моем приложении JSF есть управляемый компонент @ConversationScoped CDI управляемый компонент, используя Primefaces 5.2, работающий на Wildfly 8.2.1. Неявная навигация просто работает один раз в моем приложении. Во-первых, у меня есть мой index.xhtml, который имеет кнопку, которая вызывает мой управляемый компонент, CiudadManagedBean:Неявная навигация не работает

<!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:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui"> 

<ui:composition template="/plantilla/template.xhtml"> 

    <ui:define name="contenido"> 
    <h:form> 
     <p:commandButton action="#{ciudadMB.cargarCiudades()}" 
     value="Mostrar ciudades" /> 
    </h:form> 
    </ui:define> 
</ui:composition> 
</html> 

Далее, здесь CiudadesManagedBean. Как вы можете видеть, я начать разговор о методе @PostConstruct и загружает список, когда я называю cargarCiudades из index.xhtml, и, наконец, он загружает ciudades/lista.xhtml:

package com.saplic.fut.beans; 

import java.io.Serializable; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.enterprise.context.Conversation; 
import javax.enterprise.context.ConversationScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

import com.saplic.fut.daos.CiudadDAO; 
import com.saplic.fut.entity.Ciudad; 

@Named(value="ciudadMB") 
@ConversationScoped 
public class CiudadManagedBean implements Serializable { 

    private static final long serialVersionUID = 7339176875158769385L; 

    private Ciudad instance; 
    private List<Ciudad> cities; 
    private Integer idCity; 

    @Inject 
    private CiudadDAO ciudadDAO; 

    @Inject 
    private Conversation conversation; 

    @PostConstruct 
    public void inicializarConversacion() { 
     if(conversation.isTransient()) 
      conversation.begin(); 
    } 

    public Ciudad getInstance() { 
     return instance; 
    } 

    public String cargarCiudades() { 
     setCities(ciudadDAO.cargarCiudades()); 
     return "ciudades/lista"; 
    } 

    public String cargar() { 
     Ciudad flt = new Ciudad(); 
     flt.setId(getIdCity()); 
     setInstance(ciudadDAO.cargarDetalle(flt)); 
     if(getInstance() == null) 
      setInstance(new Ciudad()); 
     return "ciudades/detalle"; 
    } 

    public String guardar() { 
     ciudadDAO.guardar(getInstance()); 
     setCities(ciudadDAO.cargarCiudades()); 
     return "ciudades/lista"; 
    } 

    public String actualizar() { 
     ciudadDAO.actualizar(getInstance()); 
     setCities(ciudadDAO.cargarCiudades()); 
     return "ciudades/lista"; 
    } 

    public String eliminar() { 
     ciudadDAO.guardar(getInstance()); 
     setCities(ciudadDAO.cargarCiudades()); 
     return "ciudades/lista"; 
    } 

    public void setInstance(Ciudad instance) { 
     this.instance = instance; 
    } 

    public List<Ciudad> getCities() { 
     return cities; 
    } 

    public void setCities(List<Ciudad> cities) { 
     this.cities = cities; 
    } 

    public Integer getIdCity() { 
     return idCity; 
    } 

    public void setIdCity(Integer idCity) { 
     this.idCity = idCity; 
    } 

} 

Наконец, в XHTML, где я вызовите мой метод cargar(). Я хочу вызвать этот метод, а затем загрузить ciudades/detalle.xhtml, потому что вот моя форма.

<!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:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui"> 

<ui:composition template="/plantilla/template.xhtml"> 

    <ui:define name="contenido"> 
    <h:form id="frm1"> 

     <p:dataTable id="tablita" resizableColumns="true" rowIndexVar="rowIdx" 
     paginator="true" rows="10" paginatorPosition="bottom" value="#{ciudadMB.cities}" 
     var="ciu" > 
      <p:column headerText="Código pais"> 
       <p:outputLabel value="#{ciu.codigoPais}" /> 
      </p:column> 
      <p:column headerText="Distrito"> 
       <p:outputLabel value="#{ciu.distrito}" /> 
      </p:column> 
      <p:column headerText="Nombre"> 
       <p:outputLabel value="#{ciu.nombre}" /> 
      </p:column> 
      <p:column headerText="Población"> 
       <p:outputLabel value="#{ciu.poblacion}" /> 
      </p:column> 
      <p:column headerText="Accion"> 
       <p:commandLink action="#{ciudadMB.cargar()}" ajax="false" value="Ver" process="@form"> 
        <f:setPropertyActionListener value="#{ciu.id}" target="#{ciudadMB.idCity}" /> 
       </p:commandLink> 
      </p:column> 
     </p:dataTable> 
    </h:form> 
    </ui:define> 
</ui:composition> 
</html> 

Когда я нажимаю на ссылку внутри моей DataTable, он вызывает ciudadMB.cargar() и выполняет код внутри него, но он игнорирует возвращение «ciudades/detalle». Таким образом, неявная навигация работает в первый раз (когда я нахожусь в index.xhtml, и я нажимаю кнопки, она принимает меня в lista.xhtml), но когда я нажимаю ссылку, чтобы перейти в detalle.xhtml, она игнорирует ее. Он просто обновляет lista.xhtml. Кроме того, я попытался с @SessionScoped и @RequestScoped (всегда используя аннотации javax.enterprise.context вместо аннотаций JSF и удаление объекта беседы и инициализации).

С @SessionScoped он имеет такое же поведение. Pagination работает без проблем, но когда я нажимаю на commandLink внутри datatable, он вызывает метод действия, но игнорирует возврат строки.

С помощью @RequestScoped, если я нажму кнопку commandLink, он обновит страницу, но не вызывает метод действия. Если я помещаю фиктивный commandLink за пределы datatable, он вызывает метод действия, но опять же, он игнорирует возврат строки.

Почему неявная навигация не работает? Есть ли проблема с CDI? С уважением.

EDIT: Я также изменил аннотации на import javax.faces.bean.ManagedBean; импорт javax.faces.bean.SessionScoped; , чтобы проверить, было ли это об аннотации CDI, но это тоже не сработало, поэтому это не проблема CDI. Нужно ли мне активировать что-то в моей конфигурации, чтобы заставить его работать? Это Eclipse Dynamic Web Project 3.1, JPA 2.1 и JSF 2.2, работающие на Wildfly 8.2.1. Вот мой конфигурационный файл web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
    <display-name>SistemaFutJsf</display-name> 
    <welcome-file-list> 
    <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/</url-pattern> 
    <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <context-param> 
    <param-name>primefaces.THEME</param-name> 
    <param-value>cupertino</param-value> 
    </context-param> 
</web-app> 

лица-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" 
    version="2.2"> 

</faces-config> 

И КДИ beans.xml файл:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     version="1.1" bean-discovery-mode="annotated"> 

</beans> 
+0

Вы намекаете, что она отлично работает с JSF управляемого компонента. Но вы никоим образом не подтвердили это в своем вопросе. Просьба уточнить. Кроме того, ваш bean-компонент на самом деле является областью сеанса, а не чатом. Это смущает. – BalusC

+0

Извините, вы правы. Я перешел на @ SessionScoped, чтобы проверить, была ли это проблемой, специфичной для @ ConversationScopes, но она тоже не работала. Я исправлю свой вопрос. –

+0

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

ответ

2

Вы используете относительной навигации.Попробуйте с

return "detalle";

вместо

return "ciudades/detalle";

Или использовать абсолютную навигацию вместо:

return "/ciudades/detalle";

+0

Но это означает, что я не мог классифицировать свой xhtml в папках, например, что произойдет, если у меня есть/ciudades/detalle и/paises/detalle? –

+0

@BalusC Вы могли бы просить посредника в этом вопросе? Оскар Кальдерон, я дал вам решение вашего вопроса. Вы отклоняете его на основе дополнительного реквизита, так или иначе, я рассмотрел этот реквизит в последней строке «Или используйте абсолютную навигацию вместо этого». – lametaweb

+0

Извините @lametaweb, я не понял этого, когда вы говорили о «абсолютной навигации», вы говорили о добавлении косой черты. –

0

Наконец, я пытался что-то: я не установлен параметр JSF «PROJECT_STAGE» в моем файле web.xml, поэтому я установил его в режиме разработки:

<context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
</context-param> 

После этого я попробовал еще раз, и я получил эту ошибку:

09:58:58,487 WARNING [javax.enterprise.resource.webcontainer.jsf.application] (default task-21) JSF1064: Unable to find or serve resource, /ciudades/ciudades/detalle.xhtml. 

Проблема заключается в том, что я использую относительный путь. В первый раз, перейдя с index.xhtml на ciudades/lista.xhtml, он работал без проблем, потому что я был в корневом пути (http: localhost: 8094/SistemaFutJsf), но после этого, когда я пытался пойти в ciudades/detalle.xhtml, контекст приложения был (http: localhost: 8094/SistemaFutJsf/ciudades), и из-за этого он не смог найти /ciudades/ciudades/detalle.xhtml.

Таким образом, решение было добавить косую черту (/), чтобы сделать пути абсолютна, как это:

public String cargarCiudades() { 
     setCities(ciudadDAO.cargarCiudades()); 
     return "/ciudades/lista"; 
    } 

    public String cargar() { 
     Ciudad flt = new Ciudad(); 
     flt.setId(getIdCity()); 
     setInstance(ciudadDAO.cargarDetalle(flt)); 
     if(getInstance() == null) 
      setInstance(new Ciudad()); 
     return "/ciudades/detalle"; 
    } 
Смежные вопросы