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

时间:2014-09-15 12:16:32

标签: java jsp jboss liferay

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

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

@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();
            }
        }
    }

它适用于processAction(),但对于doView(),我收到此错误:

  

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

我期待着你的建议。

1 个答案:

答案 0 :(得分:1)

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

并不是说你无法让它发挥作用,但它是一个完全专有的解决方案,远离任何最佳实践。因此,我建议重新考虑您实际想要实现的目标(从业务角度来看),并提出一个适合您所选技术边界的架构。

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