作者:佚名 | 来源:网络 | 添加时间:2006-03-23 10:38:52 | 人气:2390
我们将实现一个具有AJAX能力的组件——它不仅实现把文件上传到服务器,而且"实时地"监视文件上传的实际过程。
四、处理AJAX请求| public void decode(FacesContext context, UIComponent component) { UIFileUpload input = (UIFileUpload) component; //检查是否这是一个上传进度请求,或是一个实际的上传请求. ExternalContext extContext = context.getExternalContext(); Map parameterMap = extContext.getRequestParameterMap(); String clientId = input.getClientId(context); Map requestMap = extContext.getRequestParameterMap(); if(requestMap.get(clientId) == null){ return;//什么也不做,返回 } if(parameterMap.containsKey(PROGRESS_REQUEST_PARAM_NAME)){ //这是一个在该文件请求中的得到进度信息的请求. //得到该进度信息并把它生成为XML HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse(); //设置响应的头信息 response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); try { ResponseWriter writer = FacesUtils.setupResponseWriter(context); writer.startElement("progress", input); writer.startElement("percentage", input); //从会话中获得当前进度百分数(由过滤器所设置). Double progressCount = (Double)extContext.getSessionMap(). get("FileUpload.Progress." +input.getClientId(context)); if(progressCount != null){ writer.writeText(progressCount, null); }else{ writer.writeText("1", null);//我们还没有收到上传 } writer.endElement("percentage"); writer.startElement("clientId", input); writer.writeText(input.getClientId(context), null); writer.endElement("clientId"); writer.endElement("progress"); } catch(Exception e){ //做一些错误记录... } }else{ //正常的译码请求. ... |
| //正常的译码请求. if(requestMap.get(clientId).toString().equals("file")){ try{ HttpServletRequest request = (HttpServletRequest)extContext.getRequest(); FileItem fileData = (FileItem)request.getAttribute(clientId); if(fileData != null) input.setSubmittedValue(fileData); //现在我们需要清除与该项相关的任何进度 extContext.getSessionMap().put("FileUpload.Progress." + input.getClientId(context),new Double(100)); }catch(Exception e){ throw new RuntimeException("不能处理文件上传" +" - 请配置过滤器.",e); } } |
| function refreshProgress(){ // 假定我们正在进入到阶段2. document.getElementById(fileUpload1_stage1).style.display = none; document.getElementById(fileUpload1_stage2).style.display = ; document.getElementById(fileUpload1_stage3).style.display = none; //创建AJAX寄送 AjaxRequest.post( { //指定正确的参数,以便 //该组件在服务器端被正确处理 parameters:{ uploadForm:uploadForm, fileUpload1:fileUpload1, jsf.component.UIFileUpload:1, ajax.abortPhase:4 } //Abort at Phase 4. //指定成功处理相应的回调方法. ,onSuccess:function(req) { var xml = req.responseXML; if( xml.getElementsByTagName(clientId).length == 0) { setTimeout(refreshProgress(),200); return; } var clientId = xml.getElementsByTagName(clientId); clientId = clientId[0].firstChild.nodeValue + _progressBar; //从XML获取百分比 var percentage = xml.getElementsByTagName(percentage)[0].firstChild.nodeValue; var innerSpans = document.getElementById(clientId).getElementsByTagName(span); document.getElementById(clientId + label).innerHTML = Math.round(percentage) + %; //基于当前进度,设置这些span的式样类。 for(var i=0;i<innerSpans.length;i++){ if(i < percentage){ innerSpans.className = active; }else{ innerSpans.className = passive; } } //如果进度不是100,我们需要继续查询服务器以实现更新. if(percentage != 100){ setTimeout(refreshProgress(),400); } else { //文件上传已经完成,我们现在需要把该组件送入到第3个阶段. document.getElementById(fileUpload1_stage1).style.display = none; document.getElementById(fileUpload1_stage2).style.display = none; document.getElementById(fileUpload1_stage3).style.display = ; } } }); } return builder.toString(); |