Here are steps to create a struts portlet using Liferay plugins sdk:
1) Change portlet.xml which would have below content:
<portlet-class>com.liferay.portlet.StrutsPortlet</portlet-class>
<init-param>
<name>view-action</name>
<value>/struts/plugin/view</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
2) Change Web.xml which would have below content
(create new web.xml under WEB-INF dir, if it doesn't exists):
<web-app>
<listener>
<listener-class>com.liferay.portal.kernel.spring.context.PortletContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>PortletActionServlet</servlet-name>
<servlet-class>com.liferay.portal.struts.PortletActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>PortletActionServlet</servlet-name>
<url-pattern>/portlet_action/*</url-pattern>
</servlet-mapping>
</web-app>
3) Create a file tiles-defs.xml under WEB-INF which would have below content:
<init-param>
<name>view-action</name>
<value>/struts/plugin/view</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
2) Change Web.xml which would have below content
(create new web.xml under WEB-INF dir, if it doesn't exists):
<web-app>
<listener>
<listener-class>com.liferay.portal.kernel.spring.context.PortletContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>PortletActionServlet</servlet-name>
<servlet-class>com.liferay.portal.struts.PortletActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>PortletActionServlet</servlet-name>
<url-pattern>/portlet_action/*</url-pattern>
</servlet-mapping>
</web-app>
3) Create a file tiles-defs.xml under WEB-INF which would have below content:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name="portlet.xyz.struts.view" path="/struts/jsp/view.jsp"></definition>
</tiles-definitions>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name="portlet.xyz.struts.view" path="/struts/jsp/view.jsp"></definition>
</tiles-definitions>
4) Create a file struts-config.xml under WEB-INF having below content:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<action-mappings>
<action path="/struts/plugin/view" type="xyz.portal.ViewStrutsAction" >
<forward name="portlet.xyz.struts.view" path="portlet.xyz.struts.view" />
</action>
</action-mappings>
<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"></controller>
<message-resources parameter="content.test.Language"></message-resources>
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"></set-property>
<set-property property="moduleAware" value="true"></set-property>
<set-property property="definitions-parser-validate" value="true"></set-property>
</plug-in>
</struts-config>
5) check context.xml wheather its exist in META-INF which would have below content
(create META-INF dir parallel to WEB-INF dir, if it doesn't exists):
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<action-mappings>
<action path="/struts/plugin/view" type="xyz.portal.ViewStrutsAction" >
<forward name="portlet.xyz.struts.view" path="portlet.xyz.struts.view" />
</action>
</action-mappings>
<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"></controller>
<message-resources parameter="content.test.Language"></message-resources>
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"></set-property>
<set-property property="moduleAware" value="true"></set-property>
<set-property property="definitions-parser-validate" value="true"></set-property>
</plug-in>
</struts-config>
5) check context.xml wheather its exist in META-INF which would have below content
(create META-INF dir parallel to WEB-INF dir, if it doesn't exists):
<Context>
<Loader loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader" />
</Context>
6) Place your own view.jsp under docroot/html/struts/jsp dir
7) Create cignex/portal/ViewStrutsAction.java under src dir
(create src directory under WEB-INF, if it doesn't exist).
<Loader loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader" />
</Context>
6) Place your own view.jsp under docroot/html/struts/jsp dir
7) Create cignex/portal/ViewStrutsAction.java under src dir
(create src directory under WEB-INF, if it doesn't exist).
import javax.portlet.PortletConfig;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.liferay.portal.struts.PortletAction;
public class ViewStrutsAction extends PortletAction{
public ActionForward render(ActionMapping mapping, ActionForm form,
PortletConfig portletConfig, RenderRequest renderRequest,
RenderResponse renderResponse) throws Exception {
System.out.println("SampleStrutsAction render()..");
return mapping.findForward("portlet.xyz.struts.view");
}
}
8) Edit build-common.xml under plugins directory :
<path id="plugin.classpath">
<fileset dir="${app.server.lib.global.dir}" includes="*.jar" />
<fileset dir="${app.server.lib.portal.dir}" includes="annotations.jar,commons-logging.jar,log4j.jar,util-bridges.jar,util-java.jar,util-taglib.jar" />
<fileset dir="${project.dir}/lib" includes="*.jar" />
<path refid="plugin-lib.classpath" />
</path>
Note : If you are using liferay 6 , you might need to include below details :
Create a xml file with the name of your portlet(eg: cignex-portlet.xml) under your tomcat/conf/Catalina/localhost dir.
Add following lines to this file:
<Context>
<Loader delegate="true" loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader"/> </Context>
<portlet>
<portlet-name>cignex</portlet-name>
<icon>/icon.png</icon>
<struts-path>struts/plugin</struts-path>
<instanceable>true</instanceable>
<header-portlet-css>/css/main.css</header-portlet-css>
<footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
<css-class-wrapper>zyx</css-class-wrapper>
</portlet>
Restart your tomcat and build/deploy your portlet.
Note : If you are using liferay 6 , you might need to include below details :
Create a xml file with the name of your portlet(eg: cignex-portlet.xml) under your tomcat/conf/Catalina/localhost dir.
Add following lines to this file:
<Context>
<Loader delegate="true" loaderClass="com.liferay.support.tomcat.loader.PortalClassLoader"/> </Context>
Edit your liferay-portlet.xml to have:
<portlet>
<portlet-name>cignex</portlet-name>
<icon>/icon.png</icon>
<struts-path>struts/plugin</struts-path>
<instanceable>true</instanceable>
<header-portlet-css>/css/main.css</header-portlet-css>
<footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
<css-class-wrapper>zyx</css-class-wrapper>
</portlet>
Restart your tomcat and build/deploy your portlet.
Add necessary library like portal-impl.jar to your plugins/lib directory or you can also add into eclipse classpath to compile this portlet.