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>
응답 해 주셔서 감사합니다! 이 두 가지 변화를 시도한 후에도 변화가 없었습니다. 아직 RESTORE_VIEW 및 RENDER_RESPONSE 단계 만 진행 중이며 다른 단계는 진행되지 않습니다. 힌트를 바탕으로 필자는
을 시도해 보았지만 여전히 그 두 단계 만 남았습니다. 다른 아이디어? – Pixelstix[해당 포럼 게시물] (https://www.liferay.com/community/forums/-message_boards/view_message/45935981) –
향후 검색 결과 - Neil은 위에 링크 된 포럼 게시물에서 문제를 해결했습니다. 닐의 대답에 – Pixelstix