Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java processAction之后的Liferay portlet重新加载初始化页面_Java_Jsp_Liferay_Portlet - Fatal编程技术网

Java processAction之后的Liferay portlet重新加载初始化页面

Java processAction之后的Liferay portlet重新加载初始化页面,java,jsp,liferay,portlet,Java,Jsp,Liferay,Portlet,我正在使用Portlet,并在liferay的wiki上查看示例: 在处理表单后,portlet重定向回initjsp时遇到了一些问题。我的Java类是: import java.io.IOException; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.PortletException; import javax.portlet.PortletPref

我正在使用Portlet,并在liferay的wiki上查看示例:

在处理表单后,portlet重定向回initjsp时遇到了一些问题。我的Java类是:

import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletPreferences;
import com.liferay.util.bridges.mvc.MVCPortlet;

public class Directory extends MVCPortlet {

    @Override
    public void processAction(
        ActionRequest actionRequest, ActionResponse actionResponse)
        throws IOException, PortletException {
        PortletPreferences prefs = actionRequest.getPreferences();
        String greeting = actionRequest.getParameter("greeting");

        if (greeting != null) {
            prefs.setValue("greeting", greeting);
            prefs.store();
        }

        super.processAction(actionRequest, actionResponse);
    }
}
我有两个JSP。view.jsp:

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

<portlet:defineObjects />

<%
PortletPreferences prefs = renderRequest.getPreferences();
String greeting = (String)prefs.getValue(
"greeting", "Hello! Welcome to our portal.");
%>

<p><%= greeting %></p>

<portlet:renderURL var="editGreetingURL">
   <portlet:param name="mvcPath" value="/edit.jsp" />
</portlet:renderURL>

<p><a href="<%= editGreetingURL %>">Edit greeting</a></p>

和edit.jsp:

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

<%@ page import="com.liferay.portal.kernel.util.ParamUtil" %>
<%@ page import="com.liferay.portal.kernel.util.Validator" %>
<%@ page import="javax.portlet.PortletPreferences" %>

<portlet:defineObjects />

<%
    PortletPreferences prefs = renderRequest.getPreferences();
    String greeting = (String)prefs.getValue(
    "greeting", "Hello! Welcome to our portal.");
%>

<portlet:actionURL var="editGreetingURL">
 <portlet:param name="mvcPath" value="/edit.jsp" />
</portlet:actionURL>

<aui:form action="<%= editGreetingURL %>" method="post">
    <aui:input label="greeting" name="greeting" type="text 
       value="<%=greeting%>
    <aui:button type="submit" />
</aui:form>

<portlet:renderURL var="viewGreetingURL">
    <portlet:param name="mvcPath" value="/view.jsp" />
</portlet:renderURL>

<p><a href="<%= viewGreetingURL %>">&larr; Back</a></p>

在edit.jsp的表单submit上,应该重新呈现该页面。当我只使用portlet:renderUrl而不是portlet:actionUrl时,它可以正确地执行此操作,但actionUrl不会重新呈现。教程说它应该再次呈现edit.jsp,所以我不确定我遗漏了什么。注意:它正确保存了我的所有参数

根据(又名Portlet规范2.0)PLT.11.1.1.2:

portlet容器不能传播在 对portlet的后续呈现请求执行操作或事件请求

这是用户单击浏览器页面上的“提交”按钮时发生的情况:

  • 浏览器向Liferay发送操作请求,其中包含“name”和“mvcPath”作为其参数
  • portlet现在处于操作阶段,因此它执行
    processAction
    方法
  • processAction
    方法在没有错误的情况下终止时,Liferay仍在响应操作请求,浏览器仍在等待响应,响应将是当前页面的HTML
  • 因为Liferay现在必须用页面的HTML响应浏览器,所以它为页面中的每个portlet调用
    render
    方法。也就是说,if向这些portlet发出呈现请求
  • 对于您的portlet,它是一个
    MVCPortlet
    render
    方法读取“mvcPath”参数,以找出它必须呈现的JSP页面
  • 但是现在,JSR 286说在动作和呈现阶段之间没有传递参数,因此作为动作请求一部分的
    mvcPath
    ,不会被Liferay复制到Liferay向portlet发出的呈现请求中

    现在,解决方案:

    • 正如您所建议的,在
      processAction
      方法的末尾(但通常您不会更改
      processAction
      方法,而是为不同的操作创建不同的方法,它们会在教程中告诉您如何做……请看一看),您可以设置
      actionResponse.setRenderParameter(“mvcPath”、“/edit.jsp”)
      。这是完全正常的
    • 如果希望始终将动作参数复制到Liferay对portlet发出的后续呈现请求中,可以将
      copy request parameters
      init参数设置为
      true
      (查看)
    • 但是您会看到,通常Liferay Portlet在执行“编辑”操作(在操作请求中传递“重定向”参数)后返回到视图,因此这取决于您

    对不起,关于这个话题有很多话要说,希望我写的东西能对你有用

    您使用的是Liferay 6.1还是Liferay 6.2?如果不呈现edit.jsp,会发生什么?它返回到view.jsp,对吗?我们使用的是Liferay 6.1.2。是的,它返回view.jsp。我在java类中添加了代码actionResponse.setRenderParameter(“mvcPath”,“/edit.jsp”),它正确地引导了它,但这似乎仍然不是正确的方法。xml中我的init参数是view.jsp,所以它几乎就像是在初始化整个portlet。非常有用。我需要一点时间来思考这些阶段发生了什么。谢谢