我们的 portlet 将状态保存在 HttpSession 中,它由同一会话的所有请求处理线程共享。
portlet 规范 (JSR-168) 写道:
PLT.5.2.4.3 请求处理期间的多线程问题
portlet 容器通过在不同线程上并发执行请求处理方法来处理对同一 portlet 的并发请求。Portlet 开发人员必须将他们的 Portlet 设计为在任何特定时间处理来自
processAction和render方法内的多个线程的并发执行 。
我想知道我应该如何实现这一目标?当然,我可以在processAction和期间使用同步来实现互斥render,但我不知道如何从整体上强制执行请求处理的原子性。我特别担心以下情况:
processAction,将数据加载到会话中以供稍后呈现processAction,从会话中丢弃该数据render,从会话中读取要渲染的数据,并抛出 NullPointerException 因为准备好的数据不再存在......通常如何防止这种情况?特别是,当使用 JBoss portlet 桥使 JSF 适应 Portlet 环境时?
对于由 Liferay EE 6.0 SP1 提供支持的网站,在某些情况下,某些页面将需要“共享”某些 portlet 的相同实例,而其他页面将拥有自己的实例。
例如(人为设计的,但希望是说明性的),考虑一个具有更改 portlet 背景颜色的首选项的 portlet。
假设我们有以下页面(该页面上 portlet 的背景颜色遵循此列表中的页面名称):
家(绿色) ?? 关于(蓝色) ? ?? 联系人(蓝色) ?? 产品(橙色) ? ?? AXL-900(橙色) ? ?? VCC-218(橙色) ?? 支持(红色) ? ?? 贵宾(金) ?? 合法(绿色)
请注意,在多个页面上,portlet 具有相同的背景颜色首选项。到目前为止,这很容易;您只需向每个页面添加一个单独的 portlet 实例并适当地设置首选项。
然而,内容管理者不想在每页的基础上管理背景颜色;例如,他们希望将所有“关于”页面上的 portlet 的背景颜色同时更改为紫色(这是有道理的;它使原本需要手动操作的内容自动化[并且根据定义,容易出错] 过程)。
为此,例如,“关于”和“联系人”页面都必须使用相同的 portlet 实例……或者它们必须具有单独的实例,但两个实例将共享相同的首选项值。或者也许有不同的方法。
有没有办法使这项工作?
我正在使用ubuntu 12.04,liferay版本6.0.1,在我的系统上打开jdk 6.我试图在java中获取远程ip和位置.为此我找到了Host Ip服务,通过它我可以使用apache http get方法获取位置.我已在本地系统上成功执行了此操作.但是在实际的服务器上,liferay portlet没有运行,并且很难找到错误,因为多个实例同时运行.服务器是基于Window的.我在MVC Portlet的doView()中使用此方法来获取ip
com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr()
Run Code Online (Sandbox Code Playgroud) 我是portlet的初学者,我不理解request.setAttribute和response.setRenderParameter之间的区别(对于一个动作).两者都将属性保存到请求中,并允许在之后访问它.我特别想到processAction和动作方法之后的渲染之间的传输.
我知道使用setRenderParameter我们不能"存储"一个复杂的对象,但如果我只想传输一个我应该使用的字符串?
在哪种情况下我们应该使用setRenderParameter方法或setAttribute方法?
是否可以在portlet中创建一些portlet?我的意思是一个多级portlet.
我当前正在使用门户网站,并且需要使用Liferay作为门户网站服务器。
我的应用程序将具有一些全局设置,我需要在我的门户网站的所有portlet中进行访问。
加载此类配置settig的最佳实践是什么?我希望从配置文件/数据库中读取这些配置设置。但应在应用程序启动时仅读取一次。我不想为每个请求从数据库/文件中读取设置。
另外,我将对模板使用速度框架,我可以在速度模板中读取相同的全局变量吗?
我可以将这些全局变量放在我的portal-ext.properties文件中吗?如果可以,如何在其中加载默认值?
任何其他方法也有帮助,
提前致谢
我在liferay门户网站中使用了一些第三方jar文件.这些jar文件将在我的门户网站中的多个portlet中使用.
我知道我可以把我的jar文件放在my-portlet/WEB-INF/lib中.但问题是它只能在该portlet中访问.我希望jar文件可用于门户网站中的所有portlet.我怎样才能做到这一点?有没有可以部署我的jar文件的全局库,可以从任何地方访问它?
另外,如何将此第三方jar文件部署到生产实例?
我正在开发一个自定义portlet(编辑:我正在扩展MVCPortlet),并查看几个示例和教程,我发现当覆盖doView(RenderRequest,RenderResponse)方法时,在它的末尾总是至少有这个线:
super.doView(renderRequest, renderResponse);
Run Code Online (Sandbox Code Playgroud)
或这个:
include(viewJSP, renderRequest, renderResponse);
Run Code Online (Sandbox Code Playgroud)
如果我没有放置其中任何一个,我的portlet不会呈现任何内容,但是其中任何一个都可以解决问题.
我想知道我应该使用哪一个,为什么我需要添加它们以使我的portlet工作.
谢谢!
我已经定义了一个配置动作类,用于根据drools(liferay-portlet.xml)加载现有portlet的配置:
<configuration-action-class>com.liferay.drools.action.ConfigurationActionImpl</configuration-action-class>
Run Code Online (Sandbox Code Playgroud)
这个类是processAction类:
public class ConfigurationActionImpl extends DefaultConfigurationAction {
@Override
public void processAction(
Run Code Online (Sandbox Code Playgroud)
现在,我想添加另一个带行的表单(在同一个config.jsp页面内).我想从所有这些行调用一个不同的类(对SelectRules.java类的调用):
<%
ResultRow row = (ResultRow)request.getAttribute(WebKeys.SEARCH_CONTAINER_RESULT_ROW);
IRRule myRule = (IRRule)row.getObject();
String name = IRRule.class.getName();
String primKey = String.valueOf(myRule.getPrimaryKey());
%>
<liferay-ui:icon-menu>
<portlet:actionURL name="selectRule" var="selectURL">
<portlet:param name="resourcePrimKey" value="<%=primKey %>" />
</portlet:actionURL>
<liferay-ui:icon image="checked" message="SelectRule" url="<%=selectURL.toString() %>" />
</liferay-ui:icon-menu>
Run Code Online (Sandbox Code Playgroud)
在my portlet.xml我定义了以下portlet类:
<portlet-class>com.myown.oriol.selectrules.portlet.SelectRules</portlet-class>
Run Code Online (Sandbox Code Playgroud)
如您所见,主要问题是actionURL正在寻找配置动作类,但我真正想要的是调用名为selectRules的portlet类(SelectRules.java)函数.
我想要调用的已定义的类selectRules以这种方式启动:
public class SelectRuleClass extends MVCPortlet {
public void selectRule(
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse)
Run Code Online (Sandbox Code Playgroud)
你知道我需要解决这个问题吗?考虑到configurationActionImpl.java已经由另一个人定义,我不知道如何将这两个类合并为两个不同的扩展.
在简历中..我需要在选择要使用的规则时从configuration.jsp调用函数selectRule.但是配置动作类是加载此现有portlet所需的另一个类.在选择规则时,我收到此错误...
86 does not have any …Run Code Online (Sandbox Code Playgroud) 我有一个带有几个jsp页面的portlet,每个页面都包含一个带有提交按钮的表单.当用户在第一个jsp上提交表单时,我将数据保存在db中并调用actionResponse.sendRedirect()以将用户转发到下一个jsp页面.我必须使用重定向,以防止用户通过按F5意外重新提交下一页上的相同数据.一切正常,在重定向到第二页后,doView()方法不会被执行,我需要在渲染页面之前加载一些数据.这是正常行为还是我做错了什么?在渲染第二个jsp之前,我在哪里可以加载这些数据?
第一个jsp
<%-- ... --%>
<portlet:actionURL name="createNewMyCustomObj" var="createNewMyCustomObjURL" />
<aui:form action="<%= createNewMyCustomObjURL.toString() %> method="post">
<%-- form fields --%>
<aui:button type="submit" value="Create" />
</aui:form>
Run Code Online (Sandbox Code Playgroud)
第二个jsp
<%
MyCustomObj obj = (MyCustomObj) renderRequest.getAttribute("myCustomObj");
%>
<portlet:actionURL name="updateMyCustomObj" var="updateMyCustomObjURL" />
<aui:form action="<%= updateMyCustomObjURL.toString() %> method="post">
<%-- fields with values from myCustomObj --%>
<aui:button type="submit" value="Update" />
</aui:form>
Run Code Online (Sandbox Code Playgroud)
MyMVCPortlet.java
public class MyMVCPortlet extends MVCPortlet {
public createNewMyCustomObj(ActionRequest actionRequest,
ActionResponse actionResponse) throws IOException, PortlalException, SystemException {
PortletURL redirectURL = null;
try {
// …Run Code Online (Sandbox Code Playgroud) portlet ×10
liferay ×7
java ×3
liferay-6 ×2
portal ×2
geolocation ×1
ip ×1
jsf ×1
jsp ×1
liferay-aui ×1
liferay-ide ×1