Java MVCPortlet:使用其他方法中的doView方法

Java MVCPortlet:使用其他方法中的doView方法,java,jsp,jboss,liferay,Java,Jsp,Jboss,Liferay,我想在从另一个方法调用processAction()方法之后呈现JSP。 我正在使用Liferay 6.2和JBoss 7.1.1 这就是必须调用processAction()和doView()方法的方法: 对于processAction(),它可以正常工作,但对于doView(),我得到以下错误: [org.apache.jasper.runtime.JspFactoryImpl](线程-108)异常 初始化页面上下文:java.lang.IllegalStateException:页面需要

我想在从另一个方法调用processAction()方法之后呈现JSP。 我正在使用Liferay 6.2和JBoss 7.1.1

这就是必须调用processAction()和doView()方法的方法:

对于processAction(),它可以正常工作,但对于doView(),我得到以下错误:

[org.apache.jasper.runtime.JspFactoryImpl](线程-108)异常 初始化页面上下文:java.lang.IllegalStateException:页面需要 在上有一个会话,但没有可用的会话 org.apache.jasper.runtime.PageContextImpl.\u初始化(PageContextImpl.java:148) [jbossweb-7.0.13.Final.jar:] org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:124) [jbossweb-7.0.13.Final.jar:] org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryImpl.java:106) [jbossweb-7.0.13.Final.jar:] org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:62) [jbossweb-7.0.13.Final.jar:] org.apache.jsp.views.measurement\u jsp.\u jsp服务(measurement\u jsp.java:52) 位于org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [jbossweb-7.0.13.Final.jar:] javaservlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) [jbossweb-7.0.13.Final.jar:] org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [jbossweb-7.0.13.Final.jar:] org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253) [jbossweb-7.0.13.Final.jar:] javaservlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) [portal service.jar:] com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:96) [portal service.jar:] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:] org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:840) [jbossweb-7.0.13.Final.jar:] org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:720) [jbossweb-7.0.13.Final.jar:] org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:657) [jbossweb-7.0.13.Final.jar:] com.liferay.portlet.PortletRequestDispatcherImpl.dispatch(PortletRequestDispatcherImpl.java:331) 在 PortletRequestDispatcherImpl.include(PortletRequestDispatcherImpl.java:112) 在 com.liferay.util.bridges.mvc.MVCPortlet.include(MVCPortlet.java:371) [util bridges.jar:] com.liferay.util.bridges.mvc.MVCPortlet.include(MVCPortlet.java:387) [util bridges.jar:] de.pax.qm.measurement.Controller.doView(Controller.java:74)[类:] 位于de.pax.qm.measurement.Controller.update(Controller.java:83) [课程:] notifyObservators(Observable.java:142) [rt.jar:1.6.0_45]


我期待着您的建议。

您可以在操作阶段更改portlet的状态,该状态通常由
processAction
方法处理(或者,对于许多框架,是等效的方法)。如果您只是从不同的阶段(或者从整个生命周期之外)任意调用该方法,那么根据定义,您不在操作阶段。因此,您无法更改状态。这就是这个错误消息的内容

这并不是说你不能让它工作,但它将是一个完全专有的解决方案,远离任何最佳实践。因此,我建议您重新思考您实际想要实现的目标(从业务角度),并提出一个适当的体系结构,该体系结构位于您选择的技术范围内


请注意,没有浏览器会仅仅因为后台发生了更改而重新显示您的portlet。您必须自己触发重新加载—对于单个portlet,可以通过ajax,也可以作为整个页面的重新加载。你怎么知道这是否到期?无论如何,您都将进行轮询,并且您可以轻松地使用该轮询阶段来检查后端/业务逻辑中是否有更改。将portlet视为业务逻辑的UI(这将发生变化)。但是不要弄乱UI的生命周期。

为什么要像这样使用
processAction
doView
方法?这些是生命周期方法,不打算以这种方式使用。在正常情况下,按钮或其他东西呈现页面或调用processAction方法。但在这里,我需要从另一个角度来做:页面必须立即显示信息,这是一个未定义的时间。因此,当MVCPortlet类接收到数据时,我需要呈现页面。
@Override
    public void update(Observable arg0, Object arg1) {
        if(actualSite.equals("/views/measurement.jsp")) {
            this.x = (String) arg1;
            try {
                this.processAction(aRequest, aResponse); //works
                this.doView(rRequest, rResponse); //doesn't work
            } catch (IOException e) {
                e.printStackTrace();
            } catch (PortletException e) {
                e.printStackTrace();
            }
        }
    }