Liferay Portal额外研究(一):初步在新Tomcat下部署
来源:互联网 发布:dns使用的端口号 编辑:程序博客网 时间:2024/05/21 10:37
<Context docBase="D:/Tomcat5028/ liferay" path="" reloadable="true">
Liferay额外研究(二):http://blog.csdn.net/james999/archive/2006/07/27/986386.aspx
Liferay额外研究(三):IFrame Portlet的session丢失问题解决
Liferay提供了一种非常的简单web应用整合和单点登陆的方式:Iframe Portlet。利用Iframe Portlet可以很容易将一个已经存在的web应用纳入,并且支持利用form的post或get方式,实现用户的登陆。
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
Liferay额外研究(二):http://blog.csdn.net/james999/archive/2006/07/27/986386.aspx
Liferay额外研究(三):http://blog.csdn.net/james999/archive/2006/08/08/1037326.aspx
Liferay在用户第一次登陆后,都会为其产生一个默认的私有首页Layout。 在Liferay早期版本,可以在系统管理员管理界面中,配置默认的group layout。但是在4.1版本中已经没有这个功能,所以默认情况下,新注册的用户,在登陆后,首先看到的其私有place都是一样的内容,而这些内容都是liferay提供的。
private static Log _log = LogFactory.getLog(LayoutCopy.class);
private User user;
private String ownerId;
private Group userGroup;
public LayoutCopy(User user) ...{
super();
this.user = user;
this.ownerId = getOwnerId(user.getGroup().getGroupId(), false);
this.userGroup = user.getGroup();
}
public void copyDefaultUserLayout(HttpServletRequest httpReq)
throws SystemException, PortalException ...{
// set in the portal-ext.properties:
// default.user.layout.group=Default User
// and create then group/community "Default User"
// CWPPropsUtil.DEFUALT_USER_LAYOUT_GROUP = "default.user.layout.group"
Group group = GroupLocalServiceUtil.getGroup(user.getCompanyId(),
PropsUtil.get("default.user.layout.group"));
try ...{
String groupOwnerId = getOwnerId(group.getGroupId(), true);
List privateLayouts = LayoutLocalServiceUtil
.getLayouts(groupOwnerId);
for (Iterator itr = privateLayouts.iterator(); itr.hasNext();) ...{
Layout layout = (Layout) itr.next();
Layout newLayout = copyLayout(layout);
copyPreferences(httpReq, newLayout, layout);
}
} catch (PortalException e) ...{
_log.error("Cannot copy private layouts", e);
} catch (Exception e) ...{
_log.error("Cannot copy public layouts", e);
}
try ...{
String groupOwnerId = getOwnerId(group.getGroupId(), false);
List publicLayouts = LayoutLocalServiceUtil
.getLayouts(groupOwnerId);
for (Iterator itr = publicLayouts.iterator(); itr.hasNext();) ...{
Layout layout = (Layout) itr.next();
Layout newLayout = copyLayout(layout);
copyPreferences(httpReq, newLayout, layout);
}
} catch (PortalException e) ...{
_log.error("Cannot copy public layouts", e);
} catch (Exception e) ...{
_log.error("Cannot copy public layouts", e);
}
}
public void resetLayout(HttpServletRequest httpReq) throws SystemException, PortalException ...{
String ownerId = getOwnerId(user.getGroup().getGroupId(), false);
LayoutLocalServiceUtil.deleteLayouts(ownerId);
PortletPreferencesLocalServiceUtil.deletePortletPreferences(ownerId);
ownerId = getOwnerId(user.getGroup().getGroupId(), true);
LayoutLocalServiceUtil.deleteLayouts(ownerId);
PortletPreferencesLocalServiceUtil.deletePortletPreferences(ownerId);
copyDefaultUserLayout(httpReq);
}
public Layout copyLayout(Layout groupDefaultLayout) throws SystemException,
PortalException ...{
Layout layout = LayoutLocalServiceUtil.addLayout(
userGroup.getGroupId(), user.getUserId(), groupDefaultLayout
.isPrivateLayout(), groupDefaultLayout
.getParentLayoutId(), groupDefaultLayout.getName(user
.getLocale()), groupDefaultLayout.getType(),
groupDefaultLayout.isHidden(), null);
LayoutLocalServiceUtil.updateLayout(layout.getLayoutId(), layout
.getOwnerId(), groupDefaultLayout.getTypeSettings());
layout = LayoutLocalServiceUtil.updateLookAndFeel(layout.getLayoutId(),
layout.getOwnerId(), groupDefaultLayout.getThemeId(),
groupDefaultLayout.getColorSchemeId());
// layoutMapping.put(groupDefaultLayout.getPrimaryKey(),
// layout.getPrimaryKey());
return layout;
}
protected void copyPreferences(HttpServletRequest httpReq, Layout layout,
Layout copyLayout) throws Exception ...{
String companyId = layout.getCompanyId();
LayoutTypePortlet copyLayoutTypePortlet = (LayoutTypePortlet) copyLayout
.getLayoutType();
List copyPortletIds = copyLayoutTypePortlet.getPortletIds();
for (int i = 0; i < copyPortletIds.size(); i++) ...{
String copyPortletId = (String) copyPortletIds.get(i);
// Copy preference
PortletPreferencesPK prefsPK = PortletPreferencesFactory
.getPortletPreferencesPK(httpReq, copyPortletId, layout
.getPlid());
PortletPreferencesLocalServiceUtil.getPreferences(companyId,
prefsPK);
PortletPreferencesPK copyPrefsPK = PortletPreferencesFactory
.getPortletPreferencesPK(httpReq, copyPortletId, copyLayout
.getPlid());
PortletPreferencesImpl copyPrefsImpl = (PortletPreferencesImpl) PortletPreferencesLocalServiceUtil
.getPreferences(companyId, copyPrefsPK);
PortletPreferencesLocalServiceUtil.updatePreferences(prefsPK,
copyPrefsImpl);
// Copy portlet setup
prefsPK = new PortletPreferencesPK(copyPortletId, layout
.getLayoutId(), layout.getOwnerId());
PortletPreferencesLocalServiceUtil.getPreferences(companyId,
prefsPK);
copyPrefsPK = new PortletPreferencesPK(copyPortletId, copyLayout
.getLayoutId(), copyLayout.getOwnerId());
copyPrefsImpl = (PortletPreferencesImpl) PortletPreferencesLocalServiceUtil
.getPreferences(companyId, copyPrefsPK);
PortletPreferencesLocalServiceUtil.updatePreferences(prefsPK,
copyPrefsImpl);
}
}
private String getOwnerId(String groupId, boolean privateLayout) ...{
if (privateLayout) ...{
return Layout.PRIVATE + groupId;
} else ...{
return Layout.PUBLIC + groupId;
}
}
}
时间:2006年9月3日晚
Liferay默认提供的基于Struts Action扩展的PortletAction是不支持多分发命令的,也就是我们一般常用的DispatchAction。但在我们日常基于Struts处理的操作中,已经大量的沿用了DispatchAction处理方式,采用“cmd=queryall”诸如此类的方式。
<init-param>
<name>view-action</name>
<value>/ext/reports/view_reports</value>
</init-param>
protected ActionForward dispatchMethod(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response, String name) throws Exception ...{
PortletConfig portletConfig = (PortletConfig) request
.getAttribute(WebKeys.JAVAX_PORTLET_CONFIG);
RenderRequest renderRequest = (RenderRequest) request
.getAttribute(WebKeys.JAVAX_PORTLET_REQUEST);
RenderResponse renderResponse = (RenderResponse) request
.getAttribute(WebKeys.JAVAX_PORTLET_RESPONSE);
if (name == null) ...{
return this.unspecified(mapping, form, portletConfig,
renderRequest, renderResponse);
}
Method method = null;
try ...{
method = getMethod(name);
} catch (NoSuchMethodException e) ...{
String message = messages.getMessage("dispatch.method",
mapping.getPath(), name);
log.error(message, e);
String userMsg = messages.getMessage("dispatch.method.user",
mapping.getPath());
throw new NoSuchMethodException(userMsg);
}
ActionForward forward = null;
try ...{
Object args[] = ...{ mapping, form, portletConfig, renderRequest,
renderResponse };
forward = (ActionForward) method.invoke(this, args);
} catch (ClassCastException e) ...{
String message = messages.getMessage("dispatch.return",
mapping.getPath(), name);
log.error(message, e);
throw e;
} catch (IllegalAccessException e) ...{
String message = messages.getMessage("dispatch.error",
mapping.getPath(), name);
log.error(message, e);
throw e;
} catch (InvocationTargetException e) ...{
Throwable t = e.getTargetException();
if (t instanceof Exception) ...{
throw ((Exception) t);
} else ...{
String message = messages.getMessage("dispatch.error",
mapping.getPath(), name);
log.error(message, e);
throw new ServletException(t);
}
}
return (forward);
}
protected String getMethodName(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response,
String parameter) throws Exception ...{
String methodName = request.getParameter(parameter);
if (methodName == null || methodName.length() == 0) ...{
methodName = (String) request.getAttribute(parameter);
}
return methodName;
}
public ActionForward unspecified(ActionMapping mapping, ActionForm form,
PortletConfig config, RenderRequest req, RenderResponse res)
throws Exception ...{
return null;
}
private static Log log = LogFactory.getLog(DispatchPortletAction.class);
protected Class[] types = ...{ ActionMapping.class, ActionForm.class,
PortletConfig.class, RenderRequest.class, RenderResponse.class };
}
这样后续多分发Action在书写的时候,只需要定义不同的方法即可,但是方法的参数需要依照如下规范,如下一个queryAll的方法:
PortletConfig config, RenderRequest req, RenderResponse res)
throws Exception {
//业务处理
//返回ActionForward即可
}
在那些portlet配置文件的view-action属性中,是不能够增加参数的,比如你不能够采用 /ext/reports/view_reports?cmd=queryAll这种方式。所以我们需要在扩展的Portlet中做一些拦截。
public class DispachStrutsPortlet extends StrutsPortlet {
public void doView(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
//注意我的命令参数是cmdx,而不是通常的cmd。
String cmd = req.getParameter("cmdx");
if(cmd==null || cmd.length()==0){
if (req.getWindowState().equals(WindowState. MAXIMIZED)) {
req.setAttribute("cmdx","queryAll");
}
super.doView(req, res);
}
}
时间:2006年9月5日晚
(contentType.startsWith("multipart/form-data"))) {
req = new UploadServletRequest(req);
}
在UploadServletRequest类中,则将所有当前请求参数进行了提取,并对上传的文件做了临时存储。实际上内部是采用Apache Commons Upload进行的封装。
这样在PortletAction的procesAction处理中,可以对上传附件进行业务处理和存储。 当然,你可以通过ActionRequest来强制自己获取原始的UploadServletRequest对象,可以如下操作:
public void processAction(
ActionMapping mapping, ActionForm form, PortletConfig config,
ActionRequest req, ActionResponse res)
throws Exception {
//注意这里面是获取UploadPortletRequest对象
UploadPortletRequest urequest = PortalUtil.getUploadPortletRequest(req);
File f = urequest.getFile("file1");
}
ActionRequestImpl reqImpl = (ActionRequestImpl)req;
HttpServletRequest httpReq = reqImpl.getHttpServletRequest();
UploadServletRequest urequest = (UploadServletRequest)httpReq;
置于在Action处理阶段,获取到UploadServletRequest对象后存储附件、过滤附件类型等操作就很容易实现了,此处不再累赘叙述。
不过在附件上传中都会涉及到一个问题:控制附件上传的大小和类型。对于类型的控制,liferay没有提供任何控制和扩展实现机制,这个只能开发人员在外围自己实现。
PortletURL portletURL = renderResponse.createActionURL();
portletURL.setWindowState(WindowState.MAXIMIZED);
portletURL.setParameter("struts_action", "/venus/template/fileupload/FileUpoadAction");
portletURL.setParameter("cmdx", "uploadfile");
portletURL.setParameter("cmd", "add");
%>
<form name="testForm" method="post"
action="<%= portletURL.toString() %>"
enctype="multipart/form-data">
</form>
在第四篇《Liferay Portal额外研究(4):修改用户登录后的默认布局和内容》中,我讲了修改用户登录首页布局的方案,此篇再给提供一种更简洁的处理方案。
在第四篇的方案,其实有些违背Liferay的扩展本意,Liferay提供了在外围配置的方式,来统一设置用户的第一次默认登陆首页。
在portal_ext.properties中通过修改相应参数来控制:
default.user.layout.name=Home
# Set the layout template id that matches an existing TPL.
default.user.layout.template.id=2_columns_ii
# Set the layout ids for the column specified in the layout template.
default.user.layout.column-1=82,23,61,65,
default.user.layout.column-2=8,11,36,33,
default.user.layout.column-3=
default.user.layout.column-4=
# Enter either "800x600" or "1024x768" to set the layout resolution.
default.user.layout.resolution=800x600
可以通过修改“default.user.layout.template.id”属性来控制页面的布局格式;通过修改“default.user.layout.column-X”的属性来控制不同列防止的portlet。
但如果为了更加符合一些商业性的需求,比如同一个Location的下的user默认布局相同,等等,这些则需要重载ServicePreAction类,重载 addDefaultLayouts 方法来实现,然后再在portal_ext.properties修改相应属性即可。
- Liferay Portal额外研究(一):初步在新Tomcat下部署
- Liferay Portal额外研究(一):初步在新Tomcat下部署
- Liferay Portal额外研究(一):初步在新Tomcat下部署
- Liferay Portal额外研究(一):初步在新Tomcat下部署
- Liferay Portal额外研究(一):初步在新Tomcat下部署
- Liferay研究(一):初步在新Tomcat下部署
- Liferay Portal额外研究(二):对Liferay进行瘦身
- Liferay Portal额外研究(二):对Liferay进行瘦身
- Liferay Portal额外研究(五):对多分发命令Action的支持(方案一)
- Liferay Portal额外研究(五):对多分发命令Action的支持(方案一)
- Liferay Portal额外研究-银狐999
- liferay portal在JBoss+Tomcat下的安装(翻译)
- Liferay Portal额外研究(三):IFrame Portlet的session丢失问题解决
- Liferay Portal额外研究(四):修改用户登录后的默认布局和内容
- Liferay Portal额外研究(六):Portlet附件上传处理的点滴
- Liferay Portal额外研究(三):IFrame Portlet的session丢失问题解决
- Liferay Portal额外研究(四):修改用户登录后的默认布局和内容
- Liferay Portal额外研究(三):IFrame Portlet地session丢失疑难处理
- chmod 用法
- 主动服务--一种新的Web服务定制方式
- 小弱
- PHP文件上传
- 线程生成者与消费者实例
- Liferay Portal额外研究(一):初步在新Tomcat下部署
- 关于java的hashCode方法
- 一段把文件转为Base64编码和还原的代码
- W3C Semantic Web Frequently Asked Questions
- 学习javascript:第一课
- W3C Semantic Web Frequently Asked Questions (2)
- 毁灭性的灾难....
- Delphi for PHP 评测
- Microsoft Windows Server Code Name 'Longhorn' Beta 3