本文實例為大家分享了jsp+servlet實現(xiàn)文件上傳到服務器功能的具體代碼,供大家參考,具體內(nèi)容如下
項目目錄結構大致如下:
正如我在上圖紅線畫的三個東西:dao、service、servlet 這三層是主要的結構,類似 mvc 架構,dao是模型實體類(邏輯層),service是服務層,servlet是視圖層,三者協(xié)作共同完成項目。
這里的user是由user表來定義的一個類,再封裝增刪改查等操作,實現(xiàn)從數(shù)據(jù)庫查詢與插入,修改與刪除等操作,并實現(xiàn)了分頁操作,也實現(xiàn)了將圖片放到服務器上運行的效果。
dao層:主要實現(xiàn)了user類的定義,接口iuserdao的定義與實現(xiàn)(userdaoimpl);
service層:直接定義一個接口類iuserservice,與iuserdao相似,再實現(xiàn)其接口類userserviceimpl,直接實例化userdaoimpl再調(diào)用其方法來實現(xiàn)自己的方法,重用了代碼。詳見代碼吧;
servlet層:起初是將表user 的每個操作方法都定義成一個servlet 去實現(xiàn),雖然簡單,但是太多了,不好管理,于是利用 基類baseservlet 實現(xiàn)了“反射機制”,通過獲取的 action 參數(shù)自己智能地調(diào)用對應的方法,而userservlet則具體實現(xiàn)自己的方法,以供調(diào)用,方便許多,詳見之前的博文或下述代碼。
將文件上傳到 tomcat 服務器的編譯后運行的過程的某個文件關鍵要在每次編譯后手動為其創(chuàng)建該文件夾來存放相應的上傳文件,否則會導致每次重啟 tomcat 服務器后該編譯后的工程覆蓋了原先的,導致上傳文件存放的文件夾不存在,導致代碼找不到該文件夾而報錯,即上傳不成功。如下圖所示:
主要是考慮圖片路徑的問題,手工設置路徑肯定不能保證不重復,所以取到上傳圖片的后綴名后利用隨機生成的隨機數(shù)作為圖片名,這樣就不會重復名字了:
string extendedname = picturepath.substring(picturepath.lastindexof("."),// 截取從最后一個'.'到字符串結束的子串。 picturepath.length()); // 把文件名稱重命名為全球唯一的文件名 string uniquename = uuid.randomuuid().tostring(); savefilename = uniquename + extendedname;// 拼接路徑名
增加用戶時代碼如下:
// 增 public void add(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { system.out.println("add方法被調(diào)用"); // 獲取數(shù)據(jù) int id = 0; string username = null; string password = null; string sex = null; date birthday = null; string address = null; string savefilename = null; string picturepath = null; // 得到表單是否以enctype="multipart/form-data"方式提交 boolean ismulti = servletfileupload.ismultipartcontent(request); if (ismulti) { // 通過fileitemfactory得到文件上傳的對象 fileitemfactory fif = new diskfileitemfactory(); servletfileupload upload = new servletfileupload(fif); try { list<fileitem> items = upload.parserequest(request); for (fileitem item : items) { // 判斷是否是普通表單控件,或者是文件上傳表單控件 boolean isform = item.isformfield(); if (isform) {// 是普通表單控件 string name = item.getfieldname(); if ("id".equals(name)) { id = integer.parseint(item.getstring("utf-8")); system.out.println(id); } if ("sex".equals(name)) { sex = item.getstring("utf-8"); system.out.println(sex); } if ("username".equals(name)) { username = item.getstring("utf-8"); system.out.println(username); } if ("password".equals(name)) { password = item.getstring("utf-8"); system.out.println(password); } if ("birthday".equals(name)) { string birthdaystr = item.getstring("utf-8"); simpledateformat sdf = new simpledateformat( "yyyy-mm-dd"); try { birthday = sdf.parse(birthdaystr); } catch (parseexception e) { e.printstacktrace(); } system.out.println(birthday); } if ("address".equals(name)) { address = item.getstring("utf-8"); system.out.println(address); } if ("picturepath".equals(name)) { picturepath = item.getstring("utf-8"); system.out.println(picturepath); } } else {// 是文件上傳表單控件 // 得到文件名 xxx.jpg string sourcefilename = item.getname(); // 得到文件名的擴展名:.jpg string extendedname = sourcefilename.substring( sourcefilename.lastindexof("."), sourcefilename.length()); // 把文件名稱重命名為全球唯一的文件名 string uniquename = uuid.randomuuid().tostring(); savefilename = uniquename + extendedname; // 得到上傳到服務器上的文件路徑 // c:\\apache-tomcat-7.0.47\\webapps\\taobaoservlet4\\upload\\xx.jpg string uploadfilepath = request.getsession() .getservletcontext().getrealpath("upload/"); file savefile = new file(uploadfilepath, savefilename); // 把保存的文件寫出到服務器硬盤上 try { item.write(savefile); } catch (exception e) { e.printstacktrace(); } } } } catch (numberformatexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (fileuploadexception e) { // todo auto-generated catch block e.printstacktrace(); } } // 2、封裝數(shù)據(jù) user user = new user(id, username, password, sex, birthday, address, savefilename); // 3、調(diào)用邏輯層api iuserservice iuserservice = new userserviceimpl(); // 4、控制跳轉 httpsession session = request.getsession(); if (iuserservice.save(user) > 0) { system.out.println("添加新用戶成功!"); list<user> users = new arraylist<user>(); users = iuserservice.listall(); session.setattribute("users", users); response.sendredirect("userservlet?action=getpage"); } else { system.out.println("添加新用戶失??!"); printwriter out = response.getwriter(); out.print("<script type='text/javascript'>"); out.print("alert('添加新用戶失??!請重試!');"); out.print("</script>"); } }
修改用戶時注意考慮圖片更改和沒更改這兩種情況,圖片更改時要先獲取原圖片并刪除其在服務器上的圖片,再添加新圖片到服務器;圖片不更改時則無需更新圖片路徑。
// 改 public void update(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { system.out.println("update方法被調(diào)用"); httpsession session = request.getsession(); // 獲取數(shù)據(jù) int id = (int)session.getattribute("id"); string username = null; string password = null; string sex = null; date birthday = null; string address = null; string savefilename = null; string picturepath = null; iuserservice iuserservice = new userserviceimpl(); // 得到表單是否以enctype="multipart/form-data"方式提交 boolean ismulti = servletfileupload.ismultipartcontent(request); if (ismulti) { // 通過fileitemfactory得到文件上傳的對象 fileitemfactory fif = new diskfileitemfactory(); servletfileupload upload = new servletfileupload(fif); try { list<fileitem> items = upload.parserequest(request); for (fileitem item : items) { // 判斷是否是普通表單控件,或者是文件上傳表單控件 boolean isform = item.isformfield(); if (isform) {// 是普通表單控件 string name = item.getfieldname(); if ("sex".equals(name)) { sex = item.getstring("utf-8"); system.out.println(sex); } if ("username".equals(name)) { username = item.getstring("utf-8"); system.out.println(username); } if ("password".equals(name)) { password = item.getstring("utf-8"); system.out.println(password); } if ("birthday".equals(name)) { string birthdaystr = item.getstring("utf-8"); simpledateformat sdf = new simpledateformat( "yyyy-mm-dd"); try { birthday = sdf.parse(birthdaystr); } catch (parseexception e) { e.printstacktrace(); } system.out.println(birthday); } if ("address".equals(name)) { address = item.getstring("utf-8"); system.out.println(address); } if ("picturepath".equals(name)) { picturepath = item.getstring("utf-8"); system.out.println(picturepath); } } else {// 是文件上傳表單控件 // 得到文件名 xxx.jpg picturepath = item.getname(); if (picturepath != "") {// 有選擇要上傳的圖片 // 得到文件名的擴展名:.jpg string extendedname = picturepath.substring( picturepath.lastindexof("."),// 截取從最后一個'.'到字符串結束的子串。 picturepath.length()); // 把文件名稱重命名為全球唯一的文件名 string uniquename = uuid.randomuuid().tostring(); savefilename = uniquename + extendedname;// 拼接路徑名 // 得到上傳到服務器上的文件路徑 // c:\\apache-tomcat-7.0.47\\webapps\\commonhelloworldservlet\\upload\\xx.jpg string uploadfilepath = request.getsession() .getservletcontext().getrealpath("upload/"); file savefile = new file(uploadfilepath, savefilename); // 把保存的文件寫出到服務器硬盤上 try { item.write(savefile); } catch (exception e) { e.printstacktrace(); } // 3、調(diào)用邏輯層 api // 根據(jù)id查詢用戶并獲取其之前的圖片 user user = iuserservice.getuserbyid(id); string oldpic = user.getpicturepath(); string oldpicpath = uploadfilepath + "\\" + oldpic; file oldpictodelete = new file(oldpicpath); oldpictodelete.delete();// 刪除舊圖片 } } } } catch (numberformatexception e) { e.printstacktrace(); } catch (fileuploadexception e) { e.printstacktrace(); } } system.out.println(id + "\t" + username + "\t" + password + "\t" + sex + "\t" + address + "\t" + picturepath + "\t" + birthday); // 2、封裝數(shù)據(jù) user user = new user(id, username, password, sex, birthday, address, savefilename); if (iuserservice.update(user) > 0) { system.out.println("修改數(shù)據(jù)成功!"); list<user> users = new arraylist<user>(); users = iuserservice.listall(); session.setattribute("users", users); // 4、控制跳轉 response.sendredirect("userservlet?action=getpage"); } else { system.out.println("修改數(shù)據(jù)失?。?); printwriter out = response.getwriter(); out.print("<script type='text/javascript'>"); out.print("alert('修改數(shù)據(jù)失??!請重試!');"); out.print("</script>"); } }
刪除的話就比較簡單了,直接獲取原圖片路徑并刪除,則原圖片在服務器上被刪除。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持碩編程。
- jsp+servlet實現(xiàn)文件上傳與下載功能
- EJB3.0部署消息驅(qū)動Bean拋javax.naming.NameNotFoundException異常
- 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法
- 秒殺系統(tǒng)Web層設計的實現(xiàn)方法
- 將properties文件的配置設置為整個Web應用的全局變量實現(xiàn)方法
- JSP使用過濾器防止Xss漏洞
- 在JSP頁面中動態(tài)生成圖片驗證碼的方法實例
- 詳解JSP 內(nèi)置對象request常見用法
- 使用IDEA編寫jsp時EL表達式不起作用的問題及解決方法
- jsp實現(xiàn)局部刷新頁面、異步加載頁面的方法
- Jsp中request的3個基礎實踐
- JavaServlet的文件上傳和下載實現(xiàn)方法
- JSP頁面的靜態(tài)包含和動態(tài)包含使用方法