本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7630341
建立时间:2006年5月29日




[Java Open Source]Liferay Portal额外研究(6):Portlet附件上传处理的点滴
软件技术

lhwork 发表于 2006/9/6 14:25:14

作者:胡长城(银狐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阶段。    如下所示,通过renderResponse的createActionURL和createReanderURL来决定提交请求是否执行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>


阅读全文(3225) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.844 second(s), page refreshed 144789965 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号