liferay - 无法调用Portlet类的processAction

时间:2017-11-03 11:00:49

标签: java jsp liferay-6 portlet

下面是我的View.jsp代码

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<portlet:defineObjects />

<portlet:actionURL name="myAction" var="myAction"> 
</portlet:actionURL>
    <form action="${myAction}" method="POST">
        Name : <input type="text" name="name">
        <input type="button" value="SUBMIT">
    </form>

以下是我的Portlet类代码

package com.generic;

    import java.io.IOException;

    import javax.portlet.ActionRequest;
    import javax.portlet.ActionResponse;
    import javax.portlet.GenericPortlet;
    import javax.portlet.PortletException;
    import javax.portlet.PortletRequestDispatcher;
    import javax.portlet.RenderRequest;
    import javax.portlet.RenderResponse;

    import com.liferay.portal.kernel.log.Log;
    import com.liferay.portal.kernel.log.LogFactoryUtil;

    /**
     * Portlet implementation class FirstGenericDemo
     */
    public class FirstGenericDemo extends GenericPortlet {

        public void init() {
            viewTemplate = getInitParameter("view-template");
        }

        public void doView(RenderRequest renderRequest, RenderResponse renderResponse)throws IOException, PortletException {
            System.out.println("view");
            include(viewTemplate, renderRequest, renderResponse);
        }
        protected void include(String path, RenderRequest renderRequest,RenderResponse renderResponse)throws IOException, PortletException {
            PortletRequestDispatcher portletRequestDispatcher =
                getPortletContext().getRequestDispatcher(path);

            if (portletRequestDispatcher == null) {
                _log.error(path + " is not a valid include");
            }
            else {
                portletRequestDispatcher.include(renderRequest, renderResponse);
            }
        }

        protected String viewTemplate;

        private static Log _log = LogFactoryUtil.getLog(FirstGenericDemo.class);

        @Override
        public void processAction(ActionRequest request, ActionResponse response)
                throws PortletException, IOException {
            System.out.println("ok");
            String name=request.getParameter("name");
            System.out.println("name is : "+name);
            super.processAction(request, response);
        }

    }

当portlet被渲染时,view方法被调用但是当我点击提交按钮时,既没有调用processAction方法,也没有调用view方法。这些在stacktrace中也没有错误。我通过多次部署尝试过,但问题是一样的。任何人都可以请帮助。 ?

2 个答案:

答案 0 :(得分:2)

代码有几个问题。

Ajay建议的重命名将不起作用,因为您使用GenericPortlet作为父级。

要将jsp / html代码与portlet类正确绑定,您需要重命名类按照Ajay的建议对其进行注释。

@ProcessAction(name=myAction)
public void myAction(ActionRequest request, ActionResponse response)
            throws PortletException, IOException {
    //your code
}

另一个选择是将MVCPortlet作为基类。然后重命名就足够了(名称属性需要匹配方法名称)。

第二件不起作用的是参数。如果您不使用aui标记,则需要将命名空间添加到输入名称。在JAVA代码中,您只需通过名称(无名称空间)

来引用参数
Name : <input type="text" name="<portlet:namespace/>name">

我建议使用AUI标签。这更容易。

答案 1 :(得分:0)

正如Miroslav Ligas所说,有几个问题。要删除这些问题,您需要在view.jsp以及Portlet类中进行更改。

a)在 view.jsp 中,您需要使用以下代码段

<portlet:actionURL name="myAction" var="myAction"> 
</portlet:actionURL>
    <form action="${myAction}" method="POST">
        Name : <input type="text" name="name">
        <input type="submit" value="SUBMIT">
    </form>

如果您使用的是输入类型=“按钮”,那么在您使用 document.getElementById(“myForm”)。submit(); 之前它将无效你的javascript部分。

b)在 Portlet类

1)你需要删除 super.processAction(request,response); ,因为它会产生异常。

2)您需要在ProcessAction方法

中添加以下代码段
response.setRenderParameter("jspPage","/html/jsps/displayEmployees.jsp"); 

使用上面的代码片段,以便重定向到某个视图部分(jsp页面),其中/html/jsps/displayEmployees.jsp表示要将其用作视图部分的jsp的路径。

以及我之前建议的更改,例如使用注释 @ProcessAction(name = myAction)更改操作方法名称将不会被推荐,因为您正在扩展GenericPortlet类rahter然后MVCPortlet类。如果你扩展MVCPortlet类,那么必须使用它们。

更改,例如添加     像<portlet:namespace/>这样的html标记中的Name : <input type="text" name="<portlet:namespace/>name">在您的代码段中是可选的。