博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSF 2.0碰到一个比较纠结的问题——上传文件
阅读量:6335 次
发布时间:2019-06-22

本文共 1814 字,大约阅读时间需要 6 分钟。

JSF 1.2之前还可以用MyFaces的组件,2.0还是个新玩意,只能靠自己。

开始的想法是自己做一个上传文件组件,组件中封装<input type="file" />,然后用commons-fileupload解析ServletRequest。

 

ExpandedBlockStart.gif
代码
import
 org.apache.commons.fileupload.
*
;
import
 javax.faces.context.
*
;
import
 javax.servlet.http.HttpServletRequest;
import
 java.util.List;
@FacesComponent(
"
uploadFile.UIUpload
"
)
public
 
class
 UIUpload 
extends
 UIInput {
    
public
 UIUpload() {
        
this
.setRendererType(
null
);
    }
    @Override
    
public
 
void
 encodeBegin(FacesContext fc) 
throws
 IOException {
        ResponseWriter rw 
=
 fc.getResponseWriter();
        String clientId 
=
 
this
.getClientId(fc);
        rw.startElement(
"
input
"
this
);
        rw.writeAttribute(
"
type
"
"
file
"
null
);
        rw.writeAttribute(
"
name
"
, clientId 
+
 
"
.file
"
null
);
        rw.endElement(
"
input
"
);
    }
    @Override
    
public
 
void
 decode(FacesContext fc) {
        ExternalContext external 
=
 fc.getExternalContext();
        HttpServletRequest request 
=
 (HttpServletRequest) external.getRequest();
        String clientId 
=
 getClientId(fc);
        
if
(ServletFileUpload.isMultipartContent(request)) {
            FileItemFactory factory 
=
 
new
 DiskFileItemFactory();
            ServletFileUpload upload 
=
 
new
 ServletFileUpload(factory);
            
try
 {
                List fileItems 
=
 upload.parseRequest(request);
                
//
......
            } 
catch
 (FileUploadException ex) {
                
//
......
            }
        }
    }
}

上传文件的form需要有属性enctype="multipart/form-data",就像下面这样。cc:uploadfile就是上面那个上传文件的组件。

 

<
h:form 
enctype
="multipart/form-data"
 
>
    
<
cc:uploadfile 
/>
    
<
h:commandButton 
value
="Submit"
 
/>
</
h:form
>

 

可是JSF在生成html时,会向form中加入一些<input type="hidden" />的标签,用来恢复组件树。而enctype="multipart/form-data"的form是没法正常提交这些input的,所以组件的decode方法根本就没法执行。

那么现在唯一可行的方法就是通过system event来处理上传文件。

<
f:event 
type
="preRenderView"
 listener
="#{bean.getPostFile}"
 
/>

JSF已经发展到2.0了,连<input type="file" />这样最基本的html标签都没有解决,不能不说是个遗憾。除了这个问题外,2.0的改进还是挺大的,我个人最喜欢两点:一是支持get的form和url传值;二是el 2.2的method支持参数。希望Trinidad 2.0和对应的ADF不要让我等太久。

 

转载地址:http://ijioa.baihongyu.com/

你可能感兴趣的文章
各种排序算法
查看>>
Vuex详解笔记2
查看>>
django url注册器组件, 响应器组件, 分页器组件
查看>>
JAVA之IO流(字符流)
查看>>
RHEL7启动到命令模式
查看>>
sublime的python开发环境搭建
查看>>
Windows Server 2008 R2 配置AD(Active Directory)域控制器
查看>>
Python函数之装饰器
查看>>
Ace of Aces
查看>>
The Factor
查看>>
基于AdminLTE的jquery头像更新
查看>>
6、Modal
查看>>
比较和排序(IComparable和IComparer以及它们的泛型实现)
查看>>
关于浮点数精度的问题
查看>>
第四十八课、替换对话框的设计与实现------------------狄泰软件学院
查看>>
集成 dubbo 微服务
查看>>
C++11 占位符placeholders和函数bind用法
查看>>
驱动编译的时候注意编译工程选项
查看>>
使用NSData来加载文件
查看>>
嵌入式开发必备知识点
查看>>