标签: portlet

Portlet、HttpSession 和线程安全

我们的 portlet 将状态保存在 HttpSession 中,它由同一会话的所有请求处理线程共享。

portlet 规范 (JSR-168) 写道:

PLT.5.2.4.3 请求处理期间的多线程问题

portlet 容器通过在不同线程上并发执行请求处理方法来处理对同一 portlet 的并发请求。Portlet 开发人员必须将他们的 Portlet 设计为在任何特定时间处理来自processActionrender方法内的多个线程的并发执行 。

我想知道我应该如何实现这一目标?当然,我可以在processAction和期间使用同步来实现互斥render,但我不知道如何从整体上强制执行请求处理的原子性。我特别担心以下情况:

  • 线程 1 执行processAction,将数据加载到会话中以供稍后呈现
  • 线程 2 执行processAction,从会话中丢弃该数据
  • 线程 1 执行render,从会话中读取要渲染的数据,并抛出 NullPointerException 因为准备好的数据不再存在......

通常如何防止这种情况?特别是,当使用 JBoss portlet 桥使 JSF 适应 Portlet 环境时?

java jsf multithreading portlet session-state

5
推荐指数
1
解决办法
1265
查看次数

在 Liferay 中,多个页面可以共享同一个 portlet 实例吗?

对于由 Liferay EE 6.0 SP1 提供支持的网站,在某些情况下,某些页面将需要“共享”某些 portlet 的相同实例,而其他页面将拥有自己的实例。

例如(人为设计的,但希望是说明性的),考虑一个具有更改 portlet 背景颜色的首选项的 portlet。

假设我们有以下页面(该页面上 portlet 的背景颜色遵循此列表中的页面名称):

家(绿色)
?? 关于(蓝色)
? ?? 联系人(蓝色)
?? 产品(橙色)
? ?? AXL-900(橙色)
? ?? VCC-218(橙色)
?? 支持(红色)
? ?? 贵宾(金)
?? 合法(绿色)

请注意,在多个页面上,portlet 具有相同的背景颜色首选项。到目前为止,这很容易;您只需向每个页面添加一个单独的 portlet 实例并适当地设置首选项。

然而,内容管理者不想在每页的基础上管理背景颜色;例如,他们希望将所有“关于”页面上的 portlet 的背景颜色同时更改为紫色(这是有道理的;它使原本需要手动操作的内容自动化[并且根据定义,容易出错] 过程)。

为此,例如,“关于”和“联系人”页面都必须使用相同的 portlet 实例……或者它们必须具有单独的实例,但两个实例将共享相同的首选项值。或者也许有不同的方法。

有没有办法使这项工作?

portlet liferay-6

5
推荐指数
1
解决办法
2730
查看次数

无法在liferay小孔上获得远程ip和位置

我正在使用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)

ip portlet geolocation liferay

5
推荐指数
1
解决办法
1725
查看次数

Portlet - setAttribute和setRenderParameter之间的差异

我是portlet的初学者,我不理解request.setAttribute和response.setRenderParameter之间的区别(对于一个动作).两者都将属性保存到请求中,并允许在之后访问它.我特别想到processAction和动作方法之后的渲染之间的传输.

我知道使用setRenderParameter我们不能"存储"一个复杂的对象,但如果我只想传输一个我应该使用的字符串?

在哪种情况下我们应该使用setRenderParameter方法或setAttribute方法?

portlet

5
推荐指数
1
解决办法
3650
查看次数

Liferay:Portlet内部的Portlet

是否可以在portlet中创建一些portlet?我的意思是一个多级portlet.

portlet liferay

4
推荐指数
1
解决办法
2472
查看次数

如何在Liferay中设置门户范围的全局变量?

我当前正在使用门户网站,并且需要使用Liferay作为门户网站服务器。

我的应用程序将具有一些全局设置,我需要在我的门户网站的所有portlet中进行访问。

加载此类配置settig的最佳实践是什么?我希望从配置文件/数据库中读取这些配置设置。但应在应用程序启动时仅读取一次。我不想为每个请求从数据库/文件中读取设置。

另外,我将对模板使用速度框架,我可以在速度模板中读取相同的全局变量吗?

我可以将这些全局变量放在我的portal-ext.properties文件中吗?如果可以,如何在其中加载默认值?

任何其他方法也有帮助,

提前致谢

java portal portlet liferay

4
推荐指数
1
解决办法
3169
查看次数

如何在liferay中部署第三方jar文件?

我在liferay门户网站中使用了一些第三方jar文件.这些jar文件将在我的门户网站中的多个portlet中使用.

我知道我可以把我的jar文件放在my-portlet/WEB-INF/lib中.但问题是它只能在该portlet中访问.我希望jar文件可用于门户网站中的所有portlet.我怎样才能做到这一点?有没有可以部署我的jar文件的全局库,可以从任何地方访问它?

另外,如何将此第三方jar文件部署到生产实例?

java portal portlet liferay

4
推荐指数
1
解决办法
3369
查看次数

doView覆盖的super.doView(...)和include(...)有什么区别?

我正在开发一个自定义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工作.

谢谢!

portlet liferay

4
推荐指数
1
解决办法
2263
查看次数

从Configuration.jsp调用Action-Class

我已经定义了一个配置动作类,用于根据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)

portlet liferay liferay-6 liferay-ide liferay-aui

4
推荐指数
1
解决办法
2004
查看次数

重定向后的Liferay portlet doView()

我有一个带有几个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)

jsp portlet liferay url-redirection

4
推荐指数
1
解决办法
6175
查看次数