免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
CMS項(xiàng)目總結(jié):18、文件上傳commons

commons-fileupload包依賴于commons-io

<form action="ArticleServlet" method="post" enctype="multipart/form-data">     涉及到上傳文件一定要在form中定義enctype="multipart/form-data">,并且method=post

<input type="file" name="attachs" id="attachs">    類型叫file。    在定義enctype=multipart/form-data”后即使是普通的表單域也不能通過request.getParameter()來獲取。

由于原先的代碼中已經(jīng)使用了很多的request.getParameter()方法,所以不適合改動(dòng)所有的這個(gè)方法,我們需要想個(gè)新技巧來在不改動(dòng)或者很少改動(dòng)原先代碼的情況下實(shí)現(xiàn)文件上傳的功能。

 

實(shí)際上HttpServletRequest是個(gè)interface,所以在doPost、doGet那些方法中用的肯定不是HttpServletRequest的實(shí)例(因?yàn)榻涌谑菦]有實(shí)例的),那里的request是接口的某個(gè)具體實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)是由容器tomcat自動(dòng)創(chuàng)建的,實(shí)際上調(diào)用的是RequestFacade(實(shí)現(xiàn)了HttpServletRequest接口的類,多態(tài))

現(xiàn)在如果上傳的form中有file,enctype="multipart/form-data">,先在BaseServlet(訪問各種ArticleServlet、ChannelServlet的入口)中用MultipartRequestWrap中的request代替原先的request,待會(huì)兒在仔細(xì)的研究關(guān)于具體MultipartRequestWrap,代替的代碼如下:

boolean isMultipart = ServletFileUpload.isMultipartContent(request);判斷request是否是multipart類型,如果是的話request = new MultipartRequestWrapper(request);MultipartRequestWrapper中的request來替換原先的requestRequestFacade)。

關(guān)于用MultipartRequestWrapper代替RequestFacade,是用到了Decorator設(shè)計(jì)模式。

HttpServletRequestWrapper沒有默認(rèn)的無參的構(gòu)造方法

還需要?jiǎng)?chuàng)建Attachment(附件)的Bean類,同時(shí)添加到ArticleBean中:

以及在數(shù)據(jù)庫(kù)中創(chuàng)建attachmenttable

接下來進(jìn)入正題:

1分析MultipartRequestWrap的代碼:

在MultipartRequestWrapper中實(shí)現(xiàn)了request的多態(tài)替換,原有的代碼不需要改動(dòng)就能繼續(xù)使用request.getParameter()request.getParameterMap()。(不替換前如果form中有文件上傳,那么request.getParameter()、request.getParameterMap()方法是不能用的)。這段代碼就不逐行分析了,將來用的時(shí)候在看吧,不難。

表單域中可能存在同名name的(譬如多選的下拉選擇框,當(dāng)選中多個(gè)時(shí)(相同的name)),這時(shí)就用到

這段代碼。

Attachment數(shù)據(jù)放入request的代碼:

2、Attachment插入Article中;

ArticleServlet中添加的代碼:

我們?cè)仁沁@么實(shí)現(xiàn)的:

為了往Article中添加一些Attachment,在ArticleServlet中創(chuàng)建List,再調(diào)用setAttachment()。而更好的實(shí)現(xiàn)應(yīng)該是:

避免了在ArticleServlet中做復(fù)雜的操作,同時(shí)在ArticleServlet中不需要知道attachments是個(gè)List還是Set……。好處還有可以由Article決定如何添加Attachment注意這里有個(gè)GRASP模式(GRASP模式中的專家模式,專家模式:一個(gè)職責(zé)應(yīng)該放在具有這個(gè)職責(zé)所需信息的類中,往Article中添加Attachment的職責(zé)應(yīng)該放在具有AttachmentArticle類中。)

3、添加文章時(shí)往數(shù)據(jù)庫(kù)中填充t_attachment表中的字段,刪除文章時(shí)將文章對(duì)應(yīng)的附件信息從t_attachment表中刪除

1、在ArticleDaoForMyBatisImpl中添加文章(及附件)的代碼:

在Article.xml中插入t_attachment的代碼:

2、在ArticleDaoForMyBatisImpl中刪除文章(及附件)的代碼:

由于刪除文章的同時(shí)刪除附件,所以我們需要根據(jù)aritcle的id來找出article,再找出attachmentschannels,原本可以再單獨(dú)調(diào)用findAttachmentByArticle,但是我們用了這種resultMap的簡(jiǎn)便辦法,通過一次調(diào)用Article a = (Article) session.selectOne(Article.class.getName()+".findById", articleId);就根據(jù)articleid字段取出t_channelst_attachments表中的相關(guān)數(shù)據(jù),放到Articlechannels、attachments屬性中。

附件的在硬盤中的存儲(chǔ)信息是放在t_attachment中的,所以我們根據(jù)List attachments = a.getAttachments();取出文章的信息,然后調(diào)用new File(realPath).delete();刪除硬盤中的附件信息。最后再

//刪除數(shù)據(jù)庫(kù)中的相關(guān)記錄

session.delete(Article.class.getName() + ".del_attachments_by_articleId", articleId);

//刪除文章

session.delete(Article.class.getName()+".del", articleId);

注意順序一定要對(duì),先刪了硬盤的數(shù)據(jù),再刪數(shù)據(jù)庫(kù)中的t_attachment,最后再刪t_article中的數(shù)據(jù),先刪對(duì)象的關(guān)聯(lián),再刪對(duì)象自己。(因?yàn)槿绻葎h了t_attachment,就找不到附件存儲(chǔ)在硬盤的地址信息了,先刪t_article,那么就沒有articleid了,也不好刪t_attachment了)。

3、ArticleDaoForMyBatisImpl中不刪文章,只是單獨(dú)刪除附件:

ArticleServlet中刪除附件的代碼:

ArticleDaoForMyBatisImpl中的代碼:

Article.xml文件中的代碼:

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
自由動(dòng)力3.6版90個(gè)問答-4
前端教程:DjangoURL映射
淺談C#中的延遲加載(2)——善用virtual
簡(jiǎn)化JavaMail:小巧 Jakarta Commons-Email 簡(jiǎn)單教程
丟手絹找朋友
http://www.jscsedu.com/Article/ShowArticle.asp?ArticleID=79
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服