2014-11-28 1 views
0

Liferay Faces와 함께 JSF 구성 요소를 사용하여 액션 이벤트를 실행하는 데 문제가 있습니다.Liferay Faces가 JSF 포틀릿 액션 이벤트를 처리하지 않는 이유는 무엇입니까?

Liferay의 Developing JSF Portlets 지침 페이지의 첫 번째 부분을 넘어서서 Internationalize JSF Portlets 섹션까지 성공했습니다. 몇 가지 다른 JSF 구성 요소를 추가하여 성공을 거두었지만 이벤트가 작동하지 않습니다.

이 예제의 목표는 사용자가 "World"의 기본 텍스트를 변경할 수있는 텍스트 상자를 갖게하고 모든 키 입력에서 AJAX를 사용하여 "Hello, XXX"로 텍스트 영역을 업데이트하는 것입니다 (XXX는 상자의 텍스트). 예, 별도의 JSF 프로젝트에서 view.xhtml과 TestBean.java를 시험해 보았습니다.

Liferay 포털에서 포틀릿이 표시되고 입력하면 서버에 다시 게시됩니다. DebugPhaseListener는 BEFORE/AFTER RESTORE_VIEW 1과 BEFORE/AFTER RENDER_RESPONSE 6 만 발생합니다. 중간에 단계가 없으므로 문제가 있음을 나타냅니다. (참고 : Liferay Faces 포틀릿 브리지는 포틀릿 라이프 사이클 이벤트를 연결하고 JSF 라이프 사이클을 에뮬레이션합니다.)

Liferay의 최신 Tomcat 번들과 Eclipse Luna 및 Liferay 업데이트 사이트의 최신 Eclipse 플러그인에서 실행되는 Liferay 6.2를 사용하고 있습니다. 자바 1.7.0_71.

여기에 무슨 일이 일어나는지 알아내는 데 관련된 모든 자산과 코드가 있습니다. 당신이 줄 수있는 도움은 크게 감사 할 것입니다.

view.xhtml :

<?xml version="1.0"?> 

<f:view 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" 
> 
    <h:head /> 
    <h:body> 
     <h:form id="someForm"> 
      <p:calendar id="myCal" mode="inline" value="#{testBean.myDate}" actionListener="#{testBean.updateDate}"> 
       <p:ajax actionListener="#{testBean.updateDate}" update="myMsgs"/> 
      </p:calendar> 
      <br/> 
      <p:commandButton value="Hi there" actionListener="#{testBean.updateDate}" update="myMsgs"/> 
      <br/> 
      <p:messages id="myMsgs"/> 
      <br/> 
      Test String=#{testBean.testString} 
      <br/> 
      Output Text test string = <h:outputText value="#{testBean.testString}"/> 


      <h:outputLabel value="Name" for="nameInput" /> 
      <h:inputText id="nameInput" value="#{testBean.name}"> 
       <f:ajax render="output" event="keyup" /> 
      </h:inputText> 
      <br/> 

      <p> 
       <h:panelGroup id="output"> 
        <strong> <h:outputText value="Hello, #{testBean.name}" /> 
        </strong> 
       </h:panelGroup> 
      </p> 

      <h:commandButton id="reset" value="Reset" 
       actionListener="#{testBean.reset}"> 
       <f:ajax render="@form" /> 
      </h:commandButton> - Reset The Form to "World" 
      <br/> 

      <h:messages /> 

     </h:form> 
    </h:body> 
</f:view> 

TestBean.java

import java.io.Serializable; 
import java.util.Date; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.event.ActionEvent; 


@ManagedBean(name="testBean") 
@SessionScoped 
public class TestBean 
    implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    public String getTestString() 
    { 
     return "Test String"; 
    } 

    private Date myDate = new Date(); 
    public Date getMyDate() { return myDate; } 
    public void setMyDate(Date value) { System.out.println("setMyDate value="+value); myDate = value; } 

    public void updateDate() 
    { 
     System.out.println("updateDate - myDate="+myDate); 
    } 

    /** 
    * Stores the name which will be used to greet the application user. 
    */ 
    private String name; 

    /** 
    * Initializes {@link #name} with the value {@code "World"}. 
    */ 
    @PostConstruct 
    public void postContruct() 
    { 
     this.name = "World"; 
    } 

    /** 
    * Returns {@link #name}. 
    * 
    * @return {@link #name} 
    */ 
    public String getName() 
    { 
     return name; 
    } 

    /** 
    * Set {@link #name}. 
    * 
    * @param value 
    */ 
    public void setName(String value) 
    { 
     System.out.println("Setting name to " + value); 
     name = value; 
    } 

    /** 
    * Resets {@link #name} to the default value {@code "World"}. 
    * 
    * @param ae 
    * ignored 
    */ 
    public void reset(ActionEvent ae) 
    { 
     setName("World"); 
    } 
} 

portlet.xml의

<?xml version="1.0"?> 

<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0"> 

    <portlet> 
     <portlet-name>my-calendar-portlet</portlet-name> 
     <display-name>My Calendar Portlet</display-name> 
     <portlet-class> 
      javax.portlet.faces.GenericFacesPortlet 
     </portlet-class> 
     <init-param> 
      <name>javax.portlet.faces.defaultViewId.view</name> 
      <value>/views/my-calendar-portlet/view.xhtml</value> 
     </init-param> 
     <init-param> 
      <name>javax.portlet.faces.defaultViewId.edit</name> 
      <value>/views/my-calendar-portlet/edit.xhtml</value> 
     </init-param> 
     <expiration-cache>0</expiration-cache> 
     <supports> 
      <mime-type>text/html</mime-type> 
      <portlet-mode>view</portlet-mode> 
      <portlet-mode>edit</portlet-mode> 
     </supports> 
     <portlet-info> 
      <title>My Calendar Portlet</title> 
      <short-title>My Calendar Portlet</short-title> 
      <keywords></keywords> 
     </portlet-info> 
     <security-role-ref> 
      <role-name>administrator</role-name> 
     </security-role-ref> 
     <security-role-ref> 
      <role-name>guest</role-name> 
     </security-role-ref> 
     <security-role-ref> 
      <role-name>power-user</role-name> 
     </security-role-ref> 
     <security-role-ref> 
      <role-name>user</role-name> 
     </security-role-ref> 
    </portlet> 
</portlet-app> 

을 Liferay-portlet.xml의

<?xml version="1.0"?> 
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_2_0.dtd"> 

<liferay-portlet-app> 

    <portlet> 
     <portlet-name>my-calendar-portlet</portlet-name> 
     <icon>/icon.png</icon> 
     <header-portlet-css>/css/main.css</header-portlet-css> 
     <footer-portlet-javascript> 
      /js/main.js 
     </footer-portlet-javascript> 
     <css-class-wrapper> 
      my-calendar-portlet-portlet 
     </css-class-wrapper> 
    </portlet> 
    <role-mapper> 
     <role-name>administrator</role-name> 
     <role-link>Administrator</role-link> 
    </role-mapper> 
    <role-mapper> 
     <role-name>guest</role-name> 
     <role-link>Guest</role-link> 
    </role-mapper> 
    <role-mapper> 
     <role-name>power-user</role-name> 
     <role-link>Power User</role-link> 
    </role-mapper> 
    <role-mapper> 
     <role-name>user</role-name> 
     <role-link>User</role-link> 
    </role-mapper> 
</liferay-portlet-app> 
,745,151 각 키에서 5,

디버그 출력을 누르면 :

22:18:22,328 DEBUG [DebugPhaseListener:64] BEFORE phaseId=[RESTORE_VIEW 1] viewId=[null] 
22:18:22,328 DEBUG [DebugPhaseListener:48] AFTER phaseId=[RESTORE_VIEW 1] viewId=[/views/my-calendar-portlet/view.xhtml] 
22:18:22,328 DEBUG [DebugPhaseListener:64] BEFORE phaseId=[RENDER_RESPONSE 6] viewId=[/views/my-calendar-portlet/view.xhtml] 
22:18:22,338 DEBUG [DebugPhaseListener:48] AFTER phaseId=[RENDER_RESPONSE 6] viewId=[/views/my-calendar-portlet/view.xhtml] 

해결 방법 참고 : 닐은 다른 포럼에 문제를 해결했다.

<instanceable>true</instanceable> 
    <remoteable>true</remoteable> 
    <requires-namespaced-parameters>false</requires-namespaced-parameters> 
    <ajaxable>false</ajaxable> 

답변

0

내가 확실하지 오전하지만 FACES-1993에 의해 발생 될 수 있습니다 나는 그의 글을 편집 할 수 없습니다, 그래서 여기 <icon>liferay-portlet.xml에 추가했다 라인입니다.

<f:ajax render=":someForm:output" event="keyup" /> 
+0

응답 해 주셔서 감사합니다! 이 두 가지 변화를 시도한 후에도 변화가 없었습니다. 아직 RESTORE_VIEW 및 RENDER_RESPONSE 단계 만 진행 중이며 다른 단계는 진행되지 않습니다. 힌트를 바탕으로 필자는

을 시도해 보았지만 여전히 그 두 단계 만 남았습니다. 다른 아이디어? – Pixelstix

+0

[해당 포럼 게시물] (https://www.liferay.com/community/forums/-message_boards/view_message/45935981) –

+0

향후 검색 결과 - Neil은 위에 링크 된 포럼 게시물에서 문제를 해결했습니다. 닐의 대답에 – Pixelstix

0

<requires-namespaced-parameters> 
       false 
    </requires-namespaced-parameters> 

퍼팅 후 시도하십시오 :이 다음 시도

<p>...</p> 

그리고 : panelGroup 구성 요소 태그 : 지금, 나는 당신이 시간을 둘러싸는 단락을 제거하려고하는 것이 좋습니다 liferay-portlet에서.WEB-INF 폴더 아래 xml 설명자

+0

, 당신이 추적하는 그가 포함하는 "대응 포럼 게시물"링크에있다 : 거짓 진정한 사실 <- 네임 스페이스가 필요합니다-매개 변수를> 거짓 Pixelstix