我想在从另一个方法调用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]
我期待着你的建议。
答案 0 :(得分:1)
您可以在操作阶段中更改portlet的状态,这通常由processAction
方法处理(或者,对于许多框架,是等效方法)。如果你只是从不同的阶段(或者从整个生命周期的外部)任意调用该方法,那么 - 根据定义 - 你不在行动阶段。因此,你无法改变状态。这就是错误信息的内容。
并不是说你无法让它发挥作用,但它是一个完全专有的解决方案,远离任何最佳实践。因此,我建议重新考虑您实际想要实现的目标(从业务角度来看),并提出一个适合您所选技术边界的架构。
请注意,没有浏览器会因为后台发生变化而重新显示您的portlet。您必须自己触发重新加载 - 通过单个portlet的ajax或整页重新加载。你怎么知道这是否到期?好吧,无论如何,您都会进行轮询,并且您可以轻松地使用该轮询阶段来检查后端/业务逻辑中是否有更改。将portlet视为业务逻辑的UI(将会发生变化)。但是不要弄乱UI的生命周期。