??xml version="1.0" encoding="utf-8" standalone="yes"?>
整个|站首页的基本结构是通过jsp的include标签所有通过freemarker生成的静态页面组lv来。后台控制各个部分的静态页生成。这样做首进行了拆分Q便于了静态页面的l护Q当我们需要生?#8220;友情链接”部分的时候就只生成友情链接部分,而不需要将整个面都从新生成一ơ?
以下是我生成静态页最核心的方法,使用freemarker?
其实很简单,只要Google一下就有很多这斚w的代码。我也是Google的代码然后自己再Ҏ(gu)实际情况修改。简单说明一下参敎ͼ
ServletContext Q这个不用说了吧。做java web的应该都知道Q只不过struts2中这栯取ServletActionContext.getServletContext()
Map <String,Object> data : 模版的数据来源。freemarker通过一个Maplftl模版送数据?
现在已友情链接ؓ列子详细介绍静态页面如何生成。其他模块以此类推?
String templatePath : ftl所在的路径。我q里相对于网站的一个相对\径然后通过ServerContext获取l对路径?
String targetHtmlPath : 最后生成静态页的\径:我这里相对于|站的一个相对\径然后通过ServerContext获取l对路径?
友情链接Ҏ(gu)q段代码 <jsp:include page="/html/index_link.html" flush="true"> </jsp:include>我们需要freemarker生成一个index_link.html文g。友情链接数据来源通过数据库查询获取?
然后再写一个方法专门生成友情链接静态页面:
此方法调用上面的createHTMLҎ(gu)?
然后Ҏ(gu)以上Ҏ(gu)我们可以再Struts2的action里面从数据库查询数据攑օmap调用createIndexFriendLink()Ҏ(gu)生成静态页了?
q是action中的一个方?
List links = friendLinkDAO.findAll();通过spring注入action的hiberate DAO获取数据llist然后通过以下代码
HashMap <String,Object> data = new HashMap <String,Object>();
data.put("links", links);
准备数据调用createIndexFriendLink()Ҏ(gu)?
以下是:ftl模版源码Q?
q样友情链接静态页q成了。然后其他静态页依此葫芦ȝ?
ȝQ虽焉态页讉K速度快和其他的好处,但实现v来毕竟还是很ȝ了,l护也是一个麻烦事情。如果?zhn)的站?gu)新速度快那么就需要在你的后台数据更新部分调用相应的createHTMLҎ(gu)实时的生成静态页面。如果更新速度不慢可以在后台手动更新或者利用操作系l的定时d功能L行你的静态页面生成程序?
]]>
一、安装篇
jspSmartUpload是由www.jspsmart.com|站开发的一个可免费使用的全功能的文件上传下载组Ӟ适于嵌入执行上传下蝲操作的JSP文g中。该lg有以下几个特点:
1、用简单。在JSP文g中仅仅书写三五行JAVA代码可以搞定文件的上传或下载,方便?
2、能全程控制上传。利用jspSmartUploadlg提供的对象及其操作方法,可以获得全部上传文g的信息(包括文g名,大小Q类型,扩展名,文g数据{)Q方便存取?
3、能对上传的文g在大、类型等斚w做出限制。如此可以o掉不W合要求的文件?
4、下载灵zR仅写两行代码,p把Web服务器变成文件服务器。不文件在Web服务器的目录下或在其它Q何目录下Q都可以利用jspSmartUploadq行下蝲?
5、能文件上传到数据库中Q也能将数据库中的数据下载下来。这U功能针对的是MYSQL数据库,因ؓ不具有通用性,所以本文不准备举例介绍q种用法?
jspSmartUploadlg可以从www.jspsmart.com|站上自׃载,压羃包的名字是jspSmartUpload.zip。下载后Q用WinZip或WinRAR其解压到Tomcat的webapps目录下(本文以Tomcat服务器ؓ例进行介l)。解压后Q将webapps/jspsmartupload目录下的子目录Web-inf名字改ؓ全大写的WEB-INFQ这样一改jspSmartUploadcL能用。因为TomcatҎ(gu)件名大小写敏感,它要求Web应用E序相关的类所在目录ؓWEB-INFQ且必须是大写。接着重新启动TomcatQ这样就可以在JSP文g中用jspSmartUploadlg了?
注意Q按上述Ҏ(gu)安装后,只有webapps/jspsmartupload目录下的E序可以使用jspSmartUploadlgQ如果想让Tomcat服务器的所有Web应用E序都能用它Q必d如下工作Q?
1Q进入命令行状态,目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下?
2Q运行JAR打包命oQjar cvf jspSmartUpload.jar com
Q也可以打开资源理器,切换到当前目录,用WinZipcom目录下的所有文件压~成jspSmartUpload.zipQ然后将jspSmartUpload.zip换名为jspSmartUpload.jar文g卛_。)
3Q将jspSmartUpload.jar拯到Tomcat的shared/lib目录下?
二、相关类说明?
?Filec?
q个cd装了一个上传文件的所有信息。通过它,可以得到上传文g的文件名、文件大、扩展名、文件数据等信息?
FilecM要提供以下方法:
1、saveAs作用Q将文g换名另存?
原型Q?
public void saveAs(java.lang.String destFilePathName)
?
public void saveAs(java.lang.String destFilePathName, int optionSaveAs)
其中QdestFilePathName是另存的文g名,optionSaveAs是另存的选项Q该选项有三个|分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUALQSAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系l的根目录ؓ文g根目录另存文ӞSAVEAS_VIRTUAL表明以Web应用E序的根目录为文件根目录另存文gQSAVEAS_AUTO则表Clg军_Q当Web应用E序的根目录存在另存文g的目录时Q它会选择SAVEAS_VIRTUALQ否则会选择SAVEAS_PHYSICAL?
例如QsaveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文g名实际是c:\upload\sample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用E序的根目录是webapps/jspsmartuploadQ则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用E序根目录下存在upload目录Q则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)Q否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)?
Q对于WebE序的开发来_最好用SAVEAS_VIRTUALQ以便移植?
2、isMissing
作用Q这个方法用于判断用h否选择了文Ӟ也即对应的表单项是否有倹{选择了文件时Q它q回false。未选文件时Q它q回true?
原型Qpublic boolean isMissing()
3、getFieldName
作用Q取HTML表单中对应于此上传文件的表单的名字?
原型Qpublic String getFieldName()
4、getFileName
作用Q取文g名(不含目录信息Q?
原型Qpublic String getFileName()
5、getFilePathName
作用Q取文g全名Q带目录Q?
原型Qpublic String getFilePathName
6、getFileExt
作用Q取文g扩展名(后缀Q?
原型Qpublic String getFileExt()
7、getSize
作用Q取文g长度Q以字节计)
原型Qpublic int getSize()
8、getBinaryData
作用Q取文g数据中指定位Ud的一个字节,用于文件等处理?
原型Qpublic byte getBinaryData(int index)。其中,index表示位移Q其值在0到getSize()-1之间?
?Filesc?
q个c表C所有上传文件的集合Q通过它可以得C传文件的数目、大等信息。有以下Ҏ(gu)Q?
1、getCount
作用Q取得上传文件的数目?
原型Qpublic int getCount()
2、getFile
作用Q取得指定位Ud的文件对象FileQ这是com.jspsmart.upload.FileQ不是java.io.FileQ注意区分)?
原型Qpublic File getFile(int index)。其中,index为指定位U,其值在0到getCount()-1之间?
3、getSize
作用Q取得上传文件的总长度,可用于限制一ơ性上传的数据量大?
原型Qpublic long getSize()
4、getCollection
作用Q将所有上传文件对象以Collection的Ş式返回,以便其它应用E序引用Q浏览上传文件信息?
原型Qpublic Collection getCollection()
5、getEnumeration
作用Q将所有上传文件对象以EnumerationQ枚举)的Ş式返回,以便其它应用E序览上传文g信息?
原型Qpublic Enumeration getEnumeration()
?Requestc?
q个cȝ功能{同于JSP内置的对象request。只所以提供这个类Q是因ؓ对于文g上传表单Q通过request对象无法获得表单的|必须通过jspSmartUploadlg提供的Request对象来获取。该cL供如下方法:
1、getParameter
作用Q获取指定参C倹{当参数不存在时Q返回gؓnull?
原型Qpublic String getParameter(String name)。其中,name为参数的名字?
2、getParameterValues
作用Q当一个参数可以有多个值时Q用此方法来取其倹{它q回的是一个字W串数组。当参数不存在时Q返回gؓnull?
原型Qpublic String[] getParameterValues(String name)。其中,name为参数的名字?
3、getParameterNames
作用Q取得Request对象中所有参数的名字Q用于遍历所有参数。它q回的是一个枚丑֞的对象?
原型Qpublic Enumeration getParameterNames()
?SmartUploadc这个类完成上传下蝲工作?
AQ上传与下蝲q的方法:
只有一个:initialize?
作用Q执行上传下载的初始化工作,必须W一个执行?
原型Q有多个Q主要用下面这个:
public final void initialize(javax.servlet.jsp.PageContext pageContext)
其中QpageContext为JSP面内置对象Q页面上下文Q?
BQ上传文件用的Ҏ(gu)Q?
1、upload
作用Q上传文件数据。对于上传操作,W一步执行initializeҎ(gu)Q第二步p执行q个Ҏ(gu)?
原型Qpublic void upload()
2、save
作用Q将全部上传文g保存到指定目录下Qƈq回保存的文件个数?
原型Qpublic int save(String destPathName)
和public int save(String destPathName,int option)
其中QdestPathName为文件保存目录,optionZ存选项Q它有三个|分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。(同FilecȝsaveAsҎ(gu)的选项之值类|SAVE_PHYSICAL指示lg文件保存到以操作系l根目录为文件根目录的目录下QSAVE_VIRTUAL指示lg文件保存到以Web应用E序根目录ؓ文g根目录的目录下,而SAVE_AUTO则表C由lg自动选择?
注:save(destPathName)作用{同于save(destPathName,SAVE_AUTO)?
3、getSize
作用Q取上传文g数据的总长?
原型Qpublic int getSize()
4、getFiles
作用Q取全部上传文gQ以Files对象形式q回Q可以利用Filescȝ操作Ҏ(gu)来获得上传文件的数目{信息?
原型Qpublic Files getFiles()
5、getRequest
作用Q取得Request对象Q以便由此对象获得上传表单参C倹{?
原型Qpublic Request getRequest()
6、setAllowedFilesList
作用Q设定允怸传带有指定扩展名的文Ӟ当上传过E中有文件名不允许时Q组件将抛出异常?
原型Qpublic void setAllowedFilesList(String allowedFilesList)
其中QallowedFilesList为允怸传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文gQ可以用两个逗号表示。例如:setAllowedFilesList("doc,txt,,")允怸传带doc和txt扩展名的文g以及没有扩展名的文g?
7、setDeniedFilesList
作用Q用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限Ӟ则上传时lg抛出异常?
原型Qpublic void setDeniedFilesList(String deniedFilesList)
其中QdeniedFilesList为禁止上传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想止上传那些没有扩展名的文gQ可以用两个逗号来表C。例如:setDeniedFilesList("exe,bat,,")禁止上传带exe和bat扩展名的文g以及没有扩展名的文g?
8、setMaxFileSize
作用Q设定每个文件允怸传的最大长度?
原型Qpublic void setMaxFileSize(long maxFileSize)
其中QmaxFileSizeZؓ每个文g允许上传的最大长度,当文件超出此长度Ӟ不被上传?
9、setTotalMaxFileSize
作用Q设定允怸传的文g的总长度,用于限制一ơ性上传的数据量大?
原型Qpublic void setTotalMaxFileSize(long totalMaxFileSize)
其中QtotalMaxFileSize为允怸传的文g的总长度?
CQ下载文件常用的Ҏ(gu)
1、setContentDisposition
作用Q将数据q加到MIME文g头的CONTENT-DISPOSITION域。jspSmartUploadlg会在q回下蝲的信息时自动填写MIME文g头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,L此方法?
原型Qpublic void setContentDisposition(String contentDisposition)
其中QcontentDispositiond的数据。如果contentDisposition为nullQ则lg自动添?attachment;"Q以表明下载的文g作ؓ附gQ结果是IE览器将会提C另存文Ӟ而不是自动打开q个文gQIE览器一般根据下载的文g扩展名决定执行什么操作,扩展名ؓdoc的将用wordE序打开Q扩展名为pdf的将用acrobatE序打开Q等{)?
2、downloadFile
作用Q下载文件?
原型Q共有以下三个原型可用,W一个最常用Q后两个用于Ҏ(gu)情况下的文g下蝲Q如更改内容cdQ更改另存的文g名)?
?public void downloadFile(String sourceFilePathName)
其中QsourceFilePathName下蝲的文件名Q带目录的文件全名)
?public void downloadFile(String sourceFilePathName,String contentType)
其中QsourceFilePathName下蝲的文件名Q带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被览器识别)?
?public void downloadFile(String sourceFilePathName,String contentType,String destFileName)
其中QsourceFilePathName下蝲的文件名Q带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被览器识别),destFileNameZ载后默认的另存文件名?
三、文件上传篇
?表单要求
对于上传文g的FORM表单Q有两个要求Q?
1、METHOD应用POSTQ即METHOD="POST"?
2、增加属性:ENCTYPE="multipart/form-data"
下面是一个用于上传文件的FORM表单的例子:
|
?上传的例?
1、上传页面upload.html
本页面提供表单,让用户选择要上传的文gQ点?上传"按钮执行上传操作?
面源码如下Q?
|
2、上传处理页面do_upload.jsp
本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法Q在此不赘述了?
面源码如下Q?nbsp;
|
四、文件下载篇
1、下载链接页面download.html
面源码如下Q?
|
2、下载处理页面do_download.jsp do_download.jsp展示了如何利用jspSmartUploadlg来下载文Ӟ从下面的源码中就可以看到Q下载何其简单?
源码如下Q?
|
注意Q执行下载的面Q在Java脚本范围外(?lt;% ... %>之外Q,不要包含HTML代码、空根{回车或换行{字W,有的话将不能正确下蝲。不信的话,可以在上q源码中%><%之间加入一个换行符Q再下蝲一下,保证出错。因为它影响了返回给览器的数据,D解析出错?
3、如何下载中文文?
jspSmartUpload虽然能下载文Ӟ但对中文支持不。若下蝲的文件名中有汉字Q则览器在提示另存的文件名Ӟ昄的是一堆ؕ码,很扫人兴。上面的例子是q样。(q个问题也是众多下蝲lg所存在的问题,很少有h解决Q搜索不到相兌料,可叹Q)
ZljspSmartUploadlg增加下蝲中文文g的支持,我对该组件进行了研究Q发现对q回l浏览器的另存文件名q行UTF-8~码后,览器便能正显CZ文名字了。这是一个o人高兴的发现。于是我对jspSmartUploadlg的SmartUploadcd了升U处理,增加了toUtf8Stringq个Ҏ(gu)Q改动部分源码如下:
|
注意源码中粗体部分,原jspSmartUploadlg对返回的文g未作M处理Q现在做了编码的转换工作Q将文g名{换ؓUTF-8形式的编码Ş式。UTF-8~码对英文未作Q何处理,对中文则需要{换ؓ%XX的Ş式。toUtf8StringҎ(gu)中,直接利用Java语言提供的编码{换方法获得汉字字W的UTF-8~码Q之后将其{换ؓ%XX的Ş式?
源码编译后打包成jspSmartUpload.jarQ拷贝到Tomcat的shared/lib目录下(可ؓ所有WEB应用E序所׃nQ,然后重启Tomcat服务器就可以正常下蝲含有中文名字的文件了。另QtoUtf8StringҎ(gu)也可用于转换含有中文的超U链接,以保证链接的有效Q因为有的WEB服务器不支持中文链接?
结QjspSmartUploadlg是应用JSPq行B/SE序开发过E中l常使用的上传下载组Ӟ它用简单,方便。现在我又ؓ其加上了下蝲中文名字的文件的支持Q真个是如虎ȝQ必赢得更多开发者的青睐?br />