??xml version="1.0" encoding="utf-8" standalone="yes"?>
不用自己写了Q源码可以从
http://www.telio.be/blog/2006/01/06/ajax-upload-progress-monitor-for-commons-fileupload-example里面下蝲Q?/font>
下蝲地址
http://www.telio.be/blog/wp-content/uploads/2006/01/ajax-upload-1.0.war
下蝲完之后,你需要解包,在命令行中:
jar xvf ajax-upload-1.0.war
源码在\WEB-INF\src下面
要用到的文件有resources文g夹下Q\WEB-INF\下面的dwr.xml和lib下面的jar文g
上传面
在上面解开的包里面有index.jspq个是上传页面,upload.jsp负责上传Qresources包里面包含了dwr与服务器通讯的javascript脚本Q你需要把index.jsp的form中的action换成你的struts action卛_Q然后把form中的file名改成你actionform中的file属性名Q把面中剩余的fileL
index.jsp上传面CZ代码Q?/font>
<%@ page contentType="text/html; charset=gb2312" language="java"
import="java.util.*" errorPage=""%>
<%
String path=request.getContextPath();
%>
<html locale="true">
<head>
<SCRIPT language=javascript>
function check_file() {
var strFileName=document.forms(0).file;
if (strFileName.value==""){
alert("请选择要上传的文g");
return false;
}
startProgress();
}
function loadmessage(){
<%
if (request.getAttribute("message") != null) {
%>
window.alert("<%=request.getAttribute("message")%>");
window.returnValue="yes";
<%}%>
}
</SCRIPT>
<title>上传</title>
<script src='<%=path%>/resources/js/upload.js'> </script>
<script src='<%=path%>/dwr/interface/UploadMonitor.js'> </script>
<script src='<%=path%>/dwr/engine.js'> </script>
<script src='<%=path%>/dwr/util.js'> </script>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onLoad="loadmessage()">
<form name="form" method="post" action="<%=path%>/upload.do?method=upload" enctype="multipart/form-data" onSubmit="return check_file()">
<table width="60%" border="0" cellspacing="1">
<tr background-color=" #E7F5FE">
<td width="30%" align="right">从文件导入:</td>
<td width="51%"><input type="file" name="file" class="input"></td>
<td width="27%"><input type="submit" name="files" class="button_4"
style="border-style:None;width:71px;" value="定" id="uploadbutton">
</td>
</tr>
<tr align="left" background-color=" #E7F5FE">
<td colspan="3">
<div id="progressBar" style="display: none;">
<div id="theMeter">
<div id="progressBarText"></div>
<div id="progressBarBox">
<div id="progressBarBoxContent"></div>
</div>
</div>
</div>
</td>
</tr>
</table>
</form>
</body>
</html>
q且要修改一下\resources\js中的upload.js文gQ?/font>
function refreshProgress()
{
UploadMonitor.getUploadInfo(updateProgress);
}
function updateProgress(uploadInfo)
{
if (uploadInfo.inProgress)
{
document.getElementById('uploadbutton').disabled = true;
document.getElementById('file').disabled = true;
var fileIndex = uploadInfo.fileIndex;
var progressPercent = Math.ceil((uploadInfo.bytesRead / uploadInfo.totalSize) * 100);
document.getElementById('progressBarText').innerHTML = '文gdq度: ' progressPercent '%';
document.getElementById('progressBarBoxContent').style.width = parseInt(progressPercent * 3.5) 'px';
window.setTimeout('refreshProgress()', 1000);
}
else
{
document.getElementById('uploadbutton').disabled = false;
document.getElementById('file').disabled = false;
}
return true;
}
function startProgress()
{
document.getElementById('progressBar').style.display = 'block';
document.getElementById('progressBarText').innerHTML = '文gdq度: 0%';
document.getElementById('uploadbutton').disabled = true;
// wait a little while to make sure the upload has started ..
window.setTimeout("refreshProgress()", 1000);
return true;
}
配置dwr.xml
攑֜/WEB-INF/下面
<dwr>
<allow>
<create creator="new" javascript="UploadMonitor">
<param name="class" value="be.telio.mediastore.ui.upload.UploadMonitor"/>
</create>
<convert converter="bean" match="be.telio.mediastore.ui.upload.UploadInfo"/>
</allow>
</dwr>
web.xml中配|?/strong>dwrQ省略springQstruts{的配置
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
~写struts?/strong>MultipartRequestHandler QAjaxMultipartRequestHandler
实现 MultipartRequestHandler接口q在struts-config.xml的controller中替换默认的multipartClass
<controller>
<set-property property="multipartClass"
value="org.springside.components.ajaxupload.AjaxMultipartRequestHandler" />
</controller>
其实q个cAjaxMultipartRequestHandler~写很简单,把struts的src源码中的org.apache.struts.upload.CommonsMultipartRequestHandler.java修改一下就可以?strong>Q?/strong>
?strong>public void handleRequest(HttpServletRequest request)
throws ServletException {
Ҏ中把定义factory之前的那几行代码注释掉然后写?/font>
UploadListener listener = new UploadListener(request, 30);
FileItemFactory factory = new MonitoredDiskFileItemFactory(listener);
之后再注释掉
// upload.setSizeThreshold((int) getSizeThreshold(ac));
// upload.setRepositoryPath(getRepositoryPath(ac));
q个cd写完了
~写struts上传c?/strong>
q你原来编写的struts上传c?/font>
上传Ҏ代码D늤例:
/**
* 上传文g
*/
public ActionForward upload(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String path = getServlet().getServletContext().getRealPath("/");
log.info(">>>>>>>>>>>>>>>path:" path);
if (form == null) {
return mapping.findForward("success");
}
FileUploadForm fuf = (FileUploadForm) form;
FormFile file = fuf.getFile();
try {
if (file == null) {
log.info(">>>>>>>>>>>>>>>file为空");
return mapping.findForward("success");
}
} catch (Exception e) {
e.printStackTrace();
}
String fname = file.getFileName();
int t = 0;
for (int i = 0; i < fname.length(); i ) {
if (fname.charAt(i) == '.') {
t = i;
} }
String filename = null;
if (t > 0) {
filename = fname.substring(0, t);
}
log.info(">>>>>>>>>>>>>>>文g名:" filename);
String filepath = path "dataimport/upfiles/" fname;
File f = new File(path "dataimport/upfiles/");
log.info(">>>>>>>>>>>>>>>文g生成路径Q? filepath);
if (!f.exists()) {
f.mkdirs();
} else {
log.info(">>>>>>>>>>>>>>>路径存在");
}
InputStream stream = file.getInputStream();
OutputStream os = new FileOutputStream(path "dataimport/upfiles/"
fname);
int readBytes = 0;
byte buffer[] = new byte[8192];
while ((readBytes = stream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, readBytes);
}
os.close();
stream.close();
file.destroy();
String message = "成功Q?;
request.setAttribute("message", message);
return mapping.findForward("success");
}
<p> Name: <input type="text" id="demoName"/> <input value="Send" type="button" onclick="update()"/> <br/> Reply: <span id="demoReply"></span> </p>
function update() { var name = dwr.util.getValue("demoName"); Demo.sayHello(name, function(data) { dwr.util.setValue("demoReply", data); }); }
package org.getahead.dwrdemo.simpletext; public class Demo { public String sayHello(String name) { return "Hello, " + name; } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd"> <dwr> <allow> <create creator="new" javascript="Demo"> <param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/> </create> </allow> </dwr>
其他配置Q?/pre>1 web.xml:<listener>
<listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextAttributeListener</listener-class>
</listener>
<listener>
<listener-class>org.directwebremoting.servlet.EfficientShutdownServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>dwr-invoker</servlet-name><servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<!-- This should NEVER be present in live -->
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param><!-- Remove this unless you want to use active reverse ajax -->
<init-param>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param><!-- By default DWR creates application scope objects when they are first
used. This creates them when the app-server is started -->
<init-param>
<param-name>initApplicationScopeCreatorsAtStartup</param-name>
<param-value>true</param-value>
</init-param><!-- This enables full streaming mode. It's probably better to leave this
out if you are running across the internet -->
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>-1</param-value>
</init-param><!--
For more information on these parameters, see:
- http://getahead.org/dwr/server/servlet
- http://getahead.org/dwr/reverse-ajax/configuration
--><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping>
2 js文g引入Q因为我面代码攑֜了index.jsp里面。所以引入js的代码如下:
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping><script type='text/javascript' src='./tabs/tabs.js'> </script>
<script type='text/javascript' src='./dwr/engine.js'> </script>
<script type='text/javascript' src='./dwr/util.js'> </script>
<script type='text/javascript' src='./dwr/interface/Demo.js'> </script>应该建立一个项目\径。在所有文仉使用l一的\径?/pre>deepbluesea 2008-10-15 23:18 发表评论]]>
使用构造函数来创徏对象
构造函数是一个函敎ͼ调用它来例示q初始化Ҏcd的对象。可以?new 关键字来调用一个构造函数。下面给Z使用构造函数的新示例?
var myObject = new Object(); // 创徏没有属性的通用对象?
var myBirthday = new Date(1961, 5, 10); // 创徏一?Date 对象?
var myCar = new Car(); // 创徏一个用户定义的对象Qƈ初始化其属性?
通过构造函数将一个参C为特定的 this 关键字的g递给新创建的I对象。然后构造函数负责ؓ新对象执行适应的初始化Q创建属性ƈl出其初始|。完成后Q构造函数返回它所构造的对象的一个参数?
~写构造函?
可以使用 new q算W结合像 Object()、Date() ?Function() q样的预定义的构造函数来创徏对象q对其初始化。面向对象的~程其强有力的特征是定义自定义构造函C创徏脚本中用的自定义对象的能力。创Z自定义的构造函敎ͼq样可以创建具有已定义属性的对象。下面是自定义函数的CZQ注?this 关键字的使用Q?
function Circle (xPoint, yPoint, radius) {
this.x = xPoint; // 圆心?x 坐标?
this.y = yPoint; // 圆心?y 坐标?
this.r = radius; // 圆的半径?
}
调用 Circle 构造函数时Q给出圆心点的值和圆的半径Q所有这些元素是完全定义一个独特的圆对象所必需的)。结束时 Circle 对象包含三个属性。下面是如何例示 Circle 对象?
var aCircle = new Circle(5, 11, 99);
使用原型来创建对?
在编写构造函数时Q可以用原型对象(它本w是所有构造函数的一个属性)的属性来创徏l承属性和׃nҎ。原型属性和Ҏ按引用复制l类中的每个对象Q因此它们都h相同的倹{可以在一个对象中 更改原型属性的|新的值将覆盖默认|但仅在该实例中有效。属于这个类的其他对象不受此更改的媄响。下面给Z使用自定义构造函数的CZQCircleQ注?this 关键字的使用Q?
Circle.prototype.pi = Math.PI;
function ACirclesArea () {
return this.pi * this.r * this.r; // 计算圆面U的公式??r2?
}
Circle.prototype.area = ACirclesArea; // 计算圆面U的函数现在?Circle Prototype 对象的一个方法?
var a = ACircle.area(); // 此ؓ如何?Circle 对象上调用面U函数?
使用q个原则Q可以给预定义的构造函敎ͼ都具有原型对象)定义附加属性。例如,如果惌能够删除字符串的前后I格Q与 VBScript ?Trim 函数cMQ,可以给 String 原型对象创徏自己的方法?
// 增加一个名?trim 的函C?
// String 构造函数的原型对象的一个方法?
String.prototype.trim = function()
{
// 用正则表辑ּ前后空?
// 用空字符串替代?
return this.replace(/(^\s*)|(\s*$)/g, "");
}
// 有空格的字符?
var s = " leading and trailing spaces ";
// 昄 " leading and trailing spaces (35)"
window.alert(s + " (" + s.length + ")");
// 删除前后I格
s = s.trim();
// 昄"leading and trailing spaces (27)"
window.alert(s + " (" + s.length + ")");
2.递归
递归是一U重要的~程技术。该Ҏ用于让一个函C其内部调用其自n。一个示例就是计阶乘? 的阶乘被特别地定义ؓ 1?更大数的阶乘是通过计算 1 * 2 * ...来求得的Q每ơ增?1Q直臌到要计算光乘的那个数?
下面的段落是用文字定义的计算阶乘的一个函数?
“如果q个数小于零Q则拒绝接收。如果不是一个整敎ͼ则将其向下舍入ؓ盔R的整数。如果这个数?0Q则光乘ؓ 1。如果这个数大于 0Q则其与相邻较的数的阶乘怹?#8221;
要计Q何大?0 的数的阶乘,臛_需要计一个其他数的阶乘。用来实现这个功能的函数是已经位于其中的函敎ͼ该函数在执行当前的这个数之前Q必调用它本n来计相ȝ较小数的阶乘。这是一个递归CZ?
递归和P代(循环Q是密切相关?? 能用递归处理的算法也都可以采用P代,反之亦然。确定的法通常可以用几U方法实玎ͼ您只需选择最自然贴切的方法,或者您觉得用v来最L的一U即可?
昄Q这h可能会出现问题。可以很Ҏ地创Z个递归函数Q但该函C能得C个确定的l果Qƈ且不能达C个终炏V这L递归导致计机执行一?#8220;无限”循环。下面就是一个示例:在计阶乘的文字描述中遗漏了W一条规则(对负数的处理Q?Qƈ试图计算M负数的阶乘。这导致失败,因ؓ按顺序计?-24 的阶乘时Q首先不得不计算 -25 的阶乘;然而这样又不得不计?-26 的阶乘;如此l箋。很明显Q这hq也不会到达一个终止点?
因此在设计递归函数时应特别仔细。如果怀疑其中存在着无限递归的可能,则可以让该函数记录它调用自n的次数。如果该函数调用自n的次数太多,即您已军_了它应调用多次Q就自动退出?
下面仍然是阶乘函敎ͼq次是用 JScript 代码~写的?
// 计算阶乘的函数。如果传递了
// 无效的数|例如于ӞQ?
// 返?-1Q表明发生了错误。若数值有效,
// 把数D{换ؓ最相近的整敎ͼq?
// q回阶乘?
function factorial(aNumber) {
aNumber = Math.floor(aNumber); // 如果q个C是一个整敎ͼ则向下舍入?
if (aNumber < 0) { // 如果q个数小?0Q拒l接收?
return -1;
}
if (aNumber == 0) { // 如果?0Q则光乘ؓ 1?
return 1;
}
else return (aNumber * factorial(aNumber - 1)); // 否则Q递归直至完成?
}
3.变量范围
JScript 有两U变量范_全局和局部。如果在M函数定义之外声明了一个变量,则该变量为全局变量Q且该变量的值在整个持箋范围内都可以讉K和修攏V如果在函数定义内声明了一个变量,则该变量为局部变量。每ơ执行该函数旉会创建和破坏该变量;且它不能被该函数外的M事物讉K?
?C++ q样的语a也有“块范?#8221;。在q里QQ何一?#8220;{}”都定义新的范围。JScript 不支持块范围?
一个局部变量的名称可以与某个全局变量的名U相同,但这是完全不同和独立的两个变量。因此,更改一个变量的g会媄响另一个变量的倹{在声明局部变量的函数内,只有该局部变量有意义?
var aCentaur = "a horse with rider,"; // aCentaur 的全局定义?
// JScript 代码Qؓzv见有省略?
function antiquities() // 在这个函C声明了一个局?aCentaur 变量?
{
// JScript 代码Qؓzv见有省略?
var aCentaur = "A centaur is probably a mounted Scythian warrior";
// JScript 代码Qؓzv见有省略?
aCentaur += ", misreported; that is, "; // d到局部变量?
// JScript 代码Qؓzv见有省略?
} // 函数l束?
var nothinginparticular = antiquities();
aCentaur += " as seen from a distance by a naive innocent.";
/*
在函数内Q该变量的gؓ "A centaur is probably a mounted Scythian warrior,
misreported; that is, "Q在函数外,该变量的gؓq句话的其余部分Q?
"a horse with rider, as seen from a distance by a naive innocent."
*/
很重要的一Ҏ注意变量是否是在其所属范围的开始处声明的。有时这会导致意想不到的情况?
tweak();
var aNumber = 100;
function tweak() {
var newThing = 0; // 昑ּ声明 newThing 变量?
// 本语句将未定义的变量赋给 newThingQ因为已有名?aNumber 的局部变量?
newThing = aNumber;
//下一条语句将?42 赋给局部的 aNumber。aNumber = 42;
if (false) {
var aNumber; // 该语句永q不会执行?
aNumber = 123; // 该语句永q不会执行?
} // 条g语句l束?
} // 该函数定义结束?
?JScript q行函数Ӟ首先查找所有的变量声明Q?
var someVariable;
q以未定义的初始值创建变量。如果变量被声明时有|
var someVariable = "something";
那么该变量仍以未定义的值初始化Qƈ且只有在q行了声明行时才被声明值取代,假如曄被声明过?
JScript 在运行代码前处理变量声明Q所以声明是位于一个条件块中还是其他某些结构中无关紧要。JScript 扑ֈ所有的变量后立卌行函C的代码。如果变量是在函C昑ּ声明?? 也就是说Q如果它出现于赋D辑ּ的左边但没有?var 声明 ? 那么把它创Zؓ全局变量?
复制、传递和比较数据
?JScript 中,Ҏ据的处理取决于该数据的类型?
按值和按引用的比较
Numbers ?Boolean cd的?(true ?false) 是按值来复制、传递和比较的。当按值复制或传递时Q将在计机内存中分配一块空间ƈ原值复制到其中。然后,即更改原来的|也不会媄响所复制的|反过来也一PQ因两个值是独立的实体?
对象、数l以及函数是按引用来复制、传递和比较的?当按地址复制或传递时Q实际是创徏一个指向原始项的指针,然后像拯一h使用该指针。如果随后更改原始项Q则同时更改原始项和复刉Q反q来也一P。实际上只有一个实体;“复本”q不是一个真正的复本Q而只是该数据的又一个引用?
当按引用比较Ӟ要想比较成功Q两个变量必d照完全相同的实体。例如,两个不同?Array 对象即包含相同的元素也比较ؓ不相{。要x较成功,其中一个变量必Mؓ另一个的参考。要x查两个数l是否包含了相同的元素,比较 toString() Ҏ的结果?
最后,字符串是按引用复制和传递的Q但是是按值来比较的。请注意Q假如有两个 String 对象Q用 new String("something") 创徏的)Q按引用比较它们Q但是,如果其中一个或者两者都是字W串值的话,按值比较它们?
注意 鉴于 ASCII?ANSI 字符集的构造方法,按序列顺序大写字母位于小写字母的前面。例?"Zoo" 于 "aardvark"。如果想执行不区分大写的匹配,可以对两个字W串调用 toUpperCase() ?toLowerCase()?
传递参数给函数
按g递一个参数给函数是制作该参数的一个独立复本,即一个只存在于该函数内的复本。即使按引用传递对象和数组Ӟ如果直接在函C用新D盖原先的|在函数外q不反映新倹{只有在对象的属性或者数l的元素改变Ӟ在函数外才可以看出?
例如Q?IE 对象模式Q:
// 本代码段破坏Q覆盖)其参敎ͼ所?
// 调用代码中反映不出变化?
function Clobber(param)
{
// 破坏参数Q在调用代码?
// 看不到?
param = new Object();
param.message = "This will not work";
}
// 本段代码改变参数的属性,
// 在调用代码中可看到属性改变?
function Update(param)
{
// 改变对象的属性;
// 可从调用代码中看到改变?
param.message = "I was changed";
}
// 创徏一个对象,q赋l一个属性?
var obj = new Object();
obj.message = "This is the original";
// 调用 ClobberQƈ输出 obj.message。注意,它没有发生变化?
Clobber(obj);
window.alert(obj.message); // 仍然昄 "This is the original"?
// 调用 UpdateQƈ输出 obj.message。注意,它已l被改变了?
Update(obj);
window.alert(obj.message); // 昄 "I was changed"?
验数?
当按D行检验时Q是比较两个截然不同的项以查看它们是否相{。通常Q该比较是逐字节进行的。当按引用进行检验时Q是看这两项是否是指向同一个原始项的指针。如果是Q则比较l果是相{;如果不是Q即使它们每个字节都包含完全一L|比较l果也ؓ不相{?
按引用复制和传递字W串能节U内存;但是׃在字W串被创建后不能q行更改Q因此可以按D行比较。这样可以检查两个字W串是否包含相同的内容,即它们是完全独立生的?