我绝对是LifeRay Portlet开发的新手,在创建"Hello World"测试portlet到我正在处理的项目中时遇到了一些问题。
在这个项目中,它使用结构 2 来执行调度。
所以我做了以下操作:
1( 我在这个文件夹中创建了 TestPortlet1Action 类:/Web/src/main/java/mypackage/actions/,其中我定义了 startTestPortlet1(( 方法,它是我的 protlet 的启动方法(我认为这是 portlet 入口点(:
package egp.prc.km.actions.testPortlet1;
import egp.prc.km.actions.KMAction;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller("TestPortlet1")
@Scope("prototype")
public class TestPortlet1Action extends KMAction {
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
private String message;
public String startTestPortlet1() {
this.setMessage("Hello World !!!");
return SUCCESS;
}
}
其中 KMAction 向我提供了这个操作界面:
Package com.opensymphony.xwork2;
public interface Action {
java.lang.String SUCCESS = "success";
java.lang.String NONE = "none";
java.lang.String ERROR = "error";
java.lang.String INPUT = "input";
java.lang.String LOGIN = "login";
java.lang.String execute() throws java.lang.Exception;
}
因此,返回 SUCCESS 语句返回成功字符串。
2(然后我为这个名为testPortlet1.jsp的portlet创建了一个JSP视图(到这个文件夹中:/Web/src/main/webapp/testPortlet1/testPortlet1.jsp(:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sj" uri="/struts-jquery-tags" %>
<style>
.portlet-topper#portlet_SliderNewsPortlet_WAR_KMPortlets, .portlet-title#portlet_SliderNewsPortlet_WAR_KMPortlets {
display: none
}
.portlet#portlet_SliderNewsPortlet_WAR_KMPortlets, .portlet-content#portlet_SliderNewsPortlet_WAR_KMPortlets {
border: 0;
margin: 0;
padding: 0;
background: 0;
}
</style>
<hr style="height:1px;border:none;color:#1d8843;background-color:#1d8843;width: 98%" size="4px">
<table width="100%">
<tr>
<td>
<table class="homePortletTitle">
<tr>
<td style="padding-bottom: 0px;"><img src="/km-theme/images/km-icons/section_icon_focus.png"></td>
<th style="">TestPortlet1</th>
<td style="">Hello World Portlet</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<p>Hello World !!!</p>
</td>
</tr>
</table>
3(所以现在我知道我必须更新包含以下内容的struts.xml文件(它已放入Web/main/resources文件夹中(:
<struts>
<constant name="struts.objectFactory" value="spring"/>
<constant name="struts.devMode" value="false"/>
<constant name="struts.locale" value="en_US"/>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<constant name="struts.custom.i18n.resources" value="km_international"/>
<package name="kmAjaxPackage" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="liferayAjax" class="liferayAjaxInterceptor"/>
<interceptor-stack name="kmAjaxStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="liferayAjax"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="kmAjaxStack"/>
</package>
<include file="chat-struts.xml"/>
..................................
..................................
..................................
<include file="TestPortlet1-struts.xml"/>
</struts>
如您所见,我已经包含了与我的hello world portlet相关的struts配置文件,这个:
<include file="TestPortlet1-struts.xml"/>
4(所以现在我已经配置了TestPortlet1-struts.xml文件,这样:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="TestPortlet1Package" extends="struts-portlet-default" namespace="/testPortlet1">
<action name="startFocusAction" class="FocusAction" method="startFocus">
<result name="success">/testPortlet1/testPortlet1.jsp</result>
</action>
</package>
</struts>
5(现在我的问题是了解如何正确配置web.xml文件(我已将其放入文件夹**\Web\src\main\webapp\WEB-INF**(。根据我在这个文件中的理解,我有与 Struts 2 servlet 的映射(或者我错了?
所以我有这样的东西(对于另一个工作的servlet(:
<servlet>
<servlet-name>calendar</servlet-name>
<servlet-class>com.liferay.portal.kernel.servlet.PortletServlet</servlet-class>
<init-param>
<param-name>portlet-class</param-name>
<param-value>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>calendar</servlet-name>
<url-pattern>/calendar/*</url-pattern>
</servlet-mapping>
因此,第一部分定义了 servlet,第二部分定义了映射到此 servlet 处理的 URL 模式。是真的还是我错过了什么?
那么我该怎么做才能配置我以前的"Hello World test"servlet呢?可以吗?
<servlet>
<servlet-name>testPortlet1</servlet-name>
<servlet-class>com.liferay.portal.kernel.servlet.PortletServlet</servlet-class>
<init-param>
<param-name>portlet-class</param-name>
<param-value>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>testPortlet1</servlet-name>
<url-pattern>/testPortlet1/*</url-pattern>
</servlet-mapping>
这是可以的还是我错过了什么?
6(然后我必须将portlet.xml文件配置到文件夹**\Web\src\main\webapp\WEB-INF**中,并添加:
<portlet>
<portlet-name>testPortlet1</portlet-name>
<display-name>testPortlet1</display-name>
<portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>
<init-param>
<name>viewNamespace</name>
<value>/testPortlet1</value>
</init-param>
<init-param>
<name>defaultViewAction</name>
<!--<value>savePhoto</value>-->
<value>startTestPortlet1</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>VIEW</portlet-mode>
</supports>
<portlet-info>
<title>testPortlet1</title>
</portlet-info>
</portlet>
其中 startTestPortlet1 表示在我的操作类中定义的方法 startTestPortlet1((。
7(然后我把这个语句添加到liferay-portlet.xml配置文件中:
<portlet>
<portlet-name>testpPortlet1</portlet-name>
<instanceable>false</instanceable>
</portlet>
8(最后我配置了文件liferay-display.cml来设置我的portlet的类别,如下所示:
<?xml version="1.0"?>
<!DOCTYPE display PUBLIC
"-//Liferay//DTD Display 6.0.0//EN"
"http://www.liferay.com/dtd/liferay-display_6_0_0.dtd">
<display>
<category name="First category">
<category name="Second inner category">
<category name="Third inner category">
<category name="chat">
<portlet id="ChatNavigatorUser"/>
<portlet id="ChatNavigator"/>
</category>
<category name="testcategory">
<portlet id="TestPortlet1"/>
<portlet id="testPortlet1"/>
</category>
</category>
</category>
</category>
</display>
问题是,当我尝试在门户的主页上添加我的 portlet 时,我获得了这个 contet 而不是预期的 Hello World 输出:
testPortlet1 暂时不可用。
配置Web.xml如下所示:
<web-app id="WebApp_ID" version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>com.liferay.portal.kernel.spring.context.PortletContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>struts2servlet</servlet-name>
<servlet-class>org.apache.struts2.dispatcher.ng.servlet.StrutsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>struts2servlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>struts2Resources</servlet-name>
<servlet-class>org.apache.struts2.dispatcher.ng.servlet.StrutsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>struts2Resources</servlet-name>
<url-pattern>/struts/*</url-pattern>
</servlet-mapping>
</web-app>
从 http://www.roytuts.com/integrate-struts-2-in-liferay-portlet/那里得到的