胡长城(银狐999)BLOG

专注SOA,MDA,EAI,BPM,工作流,J2EE;个人主页http://www.javafox.org

胡长城ID:james999
551907次访问,排名71好友0人,关注者50
J2EE,Workflow,BPM,EAI,SOA,工作流
james999的文章
原创 186 篇
翻译 0 篇
转载 2 篇
评论 623 篇
银狐999的公告
个人主要工作流文档可从 javafox live网络硬盘下载

最近评论
cai123mei456:你认识胡长柱么 ?
cai123mei456:你认识胡长柱么 ?
james999:to shendl: 在普元。
james999:to shendl: 在普元。
shendl:胡兄现在在国内公司吗? 什么公司,什么Workflow产品吗?
文章分类
收藏
    相册
    50 Relational Blogs
    Hongsoft博客
    J2EE与ERP禅话
    Peter's Blog
    俠盜躶奔漢
    切尔斯基(RSS)
    动物园的猪
    胡奇
    赵斌BLog
    阿飞外传
    55 Workflow Preacher
    Ekkart Kindler
    Michael zur Muehlen
    Wil van der Aalst
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 Liferay Portal额外研究(6):Portlet附件上传处理的点滴收藏

    新一篇: Liferay Portal额外研究(7):修改用户登录首页布局之方案二 | 旧一篇: Liferay Portal额外研究(5):对多分发命令Action的支持(方案一)

    作者:胡长城(银狐999)
    时间:2006年9月5日晚
     
    首先更正上一篇有关多分发Action处理的一些严重Bug。
     
    更正一:在上篇中,我比较倾向于直接基于Struts DispatchAction扩展,这是错误的,应该尽量基于PortletAction,虽然这样会让扩展增加一些Struts DispatchAction本已有的代码,但是这才是符合Portlet Action处理思想的。并且在Liferay的内部处理中,对于actionurl处理的情况下,是强制必须基于PortletAction扩展的。
    更正二:在上篇中,多分发处理的样例代码只侧重对Render的多分发,其实这是不完善的,也容易造成误导。在Porttal的Portlet请求处理,是分为:Action和Render两个阶段的。其实真正的多业务处理更应该在Action阶段来完成,Render则主要负责对push位置和页面数据进行渲染。
     
    Liferay中开发附件上传处理应用,要比在单纯Servlet和Struts Action中开发简单很多。但是需要注意的是,必须在Action阶段才能处理附件File对象,而在Render阶段已经不能处理了。
     
    让我们首先来看一下com.liferay.portal.servlet.MainServlet类,此类是所有“/c”请求的转移控制类。在此类中,liferay对含有文件上传的请求做了拦截和封装,利用UploadServletRequest类来包装原始的http request请求

    if ((contentType != null&&
                (contentType.startsWith(
    "multipart/form-data"))) {
                req 
    = new UploadServletRequest(req);
    }

            在UploadServletRequest类中,则将所有当前请求参数进行了提取,并对上传的文件做了临时存储。实际上内部是采用Apache Commons Upload进行的封装。
       
        这样在PortletAction的procesAction处理中,可以对上传附件进行业务处理和存储。       当然,你可以通过ActionRequest来强制自己获取原始的UploadServletRequest对象,可以如下操作:

    public class NewFileUploadAction extends PortletAction {
        
    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");
    }

     

    //req是ActionRequest对象
    ActionRequestImpl reqImpl = (ActionRequestImpl)req;
    HttpServletRequest httpReq 
    = reqImpl.getHttpServletRequest();
    UploadServletRequest urequest 
    = (UploadServletRequest)httpReq;

          置于在Action处理阶段,获取到UploadServletRequest对象后存储附件、过滤附件类型等操作就很容易实现了,此处不再累赘叙述。
       
      不过在附件上传中都会涉及到一个问题:控制附件上传的大小和类型。对于类型的控制,liferay没有提供任何控制和扩展实现机制,这个只能开发人员在外围自己实现。

        对于控制附件上传大小,则只能通过在system_ext.properties配置“com.liferay.util.servlet.UploadServletRequest.max.size”属性来统一设置。
        从这两个方面来讲,liferay对附件的处理不够灵活,在开发过程中,还需要做一定封装来辅助。
     
        稍微在这里补充一点,开发人员可以通过在页面请求url中,根据参数来决定是否执行action阶段。
        如下所示,通过renderResponsecreateActionURLcreateReanderURL来决定提交请求是否执行Action阶段,但注意,都会执行reader阶段的。

    <%
    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>

     

    发表于 @ 2006年09月05日 19:24:00|评论(loading...)|编辑

    新一篇: Liferay Portal额外研究(7):修改用户登录首页布局之方案二 | 旧一篇: Liferay Portal额外研究(5):对多分发命令Action的支持(方案一)

    评论

    #pikachu 发表于2006-09-06 22:01:00  IP: 202.96.19.*
    liferay已经出4.1.2了,看了前几篇好像还是用的liferay 4.0。

    liferay的上传文件曾经有过中文文件名的问题,不知道现在版本是否还有这个问题。至少在4.0好像还存在。

    actionUrl也可以用tag来完成,这是个人风格的问题了。

    struts的集成方法越来越多了,现在版本的liferay的example好像是用jetspeed2的struts-bridge完成的。我觉得开发portlet同liferay绑定太紧密不是很理想,也不容易调试。还是开发独立的struts,然后再和liferay集成比较合适
    #yeahzi 发表于2006-09-09 21:12:00  IP: 61.187.64.*
    你好,我初学liferay portal,还是名在校大学生,但我在跟同学进行在portal上进行二次开发时遇到了困难,想向您请教一下,我们采用的是STRUTS+HIBERNATE,在做前台时,有个关于附件的问题解决不了,就是我们想做出在点击链接时使其弹出"打开,保存,取消"对话框,我已经在DownloadAction extends Action中设定了response.setHeader("Content-disposition",
    "attachment; filename=" + fileName);
    但却没有反映,也尝试过在页面中直接写代码<%%>或把头部给改了,也没有预期的效果,窗口就是没有弹出来,也想过直接继承PORTAL中的Action,但还没有试过,看了一些PORTAL自己的源代码,发现它也是继承了ACTION,可能水平不够,看不出个所以然来,希望能够指点一二,不胜感激.
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 银狐999