How to develop an IPC(inter Portlet Comunication) with PRP (Public Render Parameter)
jhakyblue Apr 28, 2010 7:31 PMHow to develop an IPC (Inter Portlet Communication) with PRP (Public Render Parameter)
- 1. Generate Maven Project.
First one generate maven proyect with following archetype:
mvn archetype:generate
-DarchetypeGroupId=org.jboss.portletbridge.archetypes
-DarchetypeArtifactId=1.2-basic
-DarchetypeVersion=2.0.0.CR1
-DgroupId=com.intralot.portlet
-DartifactId=PltPruebaPRP
-DarchetypeRepository=http://repository.jboss.org/maven2/
- 2. Changes to realizing in the created template
After creating my template I did the following thing:
- In the pom.xml file
... <build> <defaultGoal>package</defaultGoal> <finalName>PltPruebaPRP</finalName> <sourceDirectory>src/main/java</sourceDirectory> .... </build> ... <deployer> <type>installed</type> <deployables> <deployable> <location>target/PltPruebaPRP.war</location> <pingURL>http://localhost:8080/simple-portal/</pingURL> </deployable> </deployables> </deployer>
- In faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bridge="http://myfaces.apache.org/portletbridge"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<application>
<view-handler>
org.jboss.portletbridge.application.PortletViewHandler
</view-handler>
<state-manager>
org.jboss.portletbridge.application.PortletStateManager
</state-manager>
</application>
<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>com.intralot.portlet.MyBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>myEventHandler</managed-bean-name>
<managed-bean-class>
com.intralot.portlet.controlador.managedbean.MyEventHandler
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>myPRPBean</managed-bean-name>
<managed-bean-class>
com.intralot.portlet.controlador.managedbean.MyPRPBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<application>
<application-extension>
<bridge:public-parameter-mappings>
<bridge:public-parameter-mapping>
<parameter>PltPruebaPRP1:idNot</parameter>
<model-el>#{myPRPBean.id}</model-el>
</bridge:public-parameter-mapping>
</bridge:public-parameter-mappings>
</application-extension>
</application>
<navigation-rule>
<navigation-case>
<from-outcome>actualizar</from-outcome>
<to-view-id>/home.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
- In portlet.xml
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"> <portlet> <portlet-name>PltPruebaPRP1</portlet-name> <portlet-class> javax.portlet.faces.GenericFacesPortlet </portlet-class> <init-param> <name>javax.portlet.faces.defaultViewId.view</name> <value>/portlet1/home.xhtml</value> </init-param> ... <supported-public-render-parameter>idNot </supported-public-render-parameter> <supported-publishing-event> <qname xmlns:jbp="urn:jboss:portal:samples:event">jbp:MyEvent</qname> </supported-publishing-event> </portlet> <portlet> <portlet-name>PltPruebaPRP2</portlet-name> <portlet-class> javax.portlet.faces.GenericFacesPortlet </portlet-class> <init-param> <name>javax.portlet.faces.defaultViewId.view</name> <value>/portlet2/home.xhtml</value> </init-param> ... <init-param> <name>javax.portlet.faces.preserveActionParams</name> <value>true</value> </init-param> <init-param> <name>javax.portlet.faces.bridgeEventHandler</name> <value>com.intralot.portlet.controlador.managedbean.MyEventHandler </value> </init-param> <init-param> <name>javax.portlet.faces.bridgePublicRenderParameterHandler</name> <value>com.intralot.portlet.controlador.managedbean.MyPRPHandler</value> </init-param> <supported-public-render-parameter>idNot </supported-public-render-parameter> <supported-publishing-event> <qname xmlns:jbp="urn:jboss:portal:samples:event">jbp:MyEvent</qname> </supported-publishing-event> </portlet> <event-definition> <qname xmlns:jbp="urn:jboss:portal:samples:event">jbp:MyEvent</qname> <value-type>com.intralot.portlet.controlador.managedbean.MyEvent </value-type> </event-definition> <public-render-parameter> <identifier>idNot</identifier> <qname xmlns:j="http://jboss.org/params">j:idNot</qname> </public-render-parameter> </portlet-app>
- 3. Project’s Structure
- File MyPRPBean.java
public class MyPRPBean {
int id;
//getters y setters
}
- File MyEventHandler.java
public class MyEventHandler
implements BridgeEventHandler {
public EventNavigationResult handleEvent(FacesContext context, Event event) {
System.out.println("Evento: "+event.getName());
return null;
}
}
- File MyPRPHandler.java
public class MyPRPHandler implements BridgePublicRenderParameterHandler{
public void processUpdates(FacesContext context){
ELContext elContext = context.getELContext();
MyPRPBean bean =
(MyPRPBean) elContext.getELResolver().getValue(elContext, null, "myPRPBean");
if(null != bean){
System.out.println("processUpdates from PRPHandler: " + bean.getId());
} else {
System.out.println("evento nulo** ");
}
}
}
- File MyBean.java
public class MyBean {
private String cadena="";
//getters y setters
public String accion() {
try {
Object response = FacesContext.getCurrentInstance().getExternalContext().getRequest();
if (response instanceof StateAwareResponse) {
StateAwareResponse stateResponse = (StateAwareResponse) response;
stateResponse.setRenderParameter("id",cadena);
}
} catch (Exception e) {
}
return "actualizar";
}
}
- File /portlet1/home.xhtml
- /portlet2/home.xhtml
<h1>Hola portlet 2</h1>
<p>Parametro ingresado: #{myPRPBean.id}</p>
- Generated the Project with Maven: # mvn package
- Then the deployment, portlets don’t produce nothing, I mean that don’t produce an event in any place neither interface or console
- My question is: ¿What part of code is wrong? ¿Is posible have both portlets in .war file for separate?
