<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文我們學習JavaWeb中最重要的技術之一,檔案上傳,該案例我會用一個小型的使用者管理系統實現,一步步帶入,內容通俗易懂,下面我們步入正題!
功能如下
使用者註冊,引數有使用者名稱,使用者名稱密碼,使用者頭像,
使用者登入,登入成功後跳轉至主頁顯示使用者頭像和名稱,支援登出賬號,登出賬號後,頁面跳轉至登入頁
技術棧:後端採用JavaWeb、MySQL5.7、Druid連線池、前端採用bootstrap框架結合jsp
完整操作專案演示:
包含:使用者註冊,使用者登入,使用者登入後顯示使用者資訊,即頭像,賬號名,最右側顯示登出,點選登出後跳轉至登入頁
專案結構Java原始碼
前端頁面jsp
t_user_info
CREATE TABLE `t_user_info` ( `noid` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL, `password` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL, `head_portrait_path` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`noid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
專案所需jar包如下:
jar檔案放在WEB-INF/lib資料夾下,主要是為了安全。
檔案上傳需要的jar包:
jar檔案我會同步資源,小夥伴們不用擔心哦~
本專案採用三層架構實現,即:service層、dao層、servlet層
由於之前的servlet層類增刪改查的類太過於多,導致程式碼冗餘,所以在jsp頁面傳送請求時,採用模組化的方式進行存取,例如:
這樣一個對應的類解決該類的所有對資料庫的增刪改查操作,提高了程式的可維護性,減少程式碼的冗餘,提高了程式的健壯性。
抽取出公共父類別:BaseServletBaseServlet類核心程式碼
public class BaseServlet extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.獲取瀏覽器請求的資源 String uri = req.getRequestURI(); //2.獲取請求的方法名,最後斜線後面的內容 String methodName = uri.substring(uri.lastIndexOf("/")+1); try { //3.根據方法名獲取方法,通過反射獲取 Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); //4.呼叫方法 method.invoke(this, req, resp); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
dao層抽取出公共資料庫連線類,BaseDao,基於db.properties組態檔連線本地資料庫
db.properties組態檔:
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1/db_blog?useSSL=true username=root password=111111
BaseDao核心程式碼
public class BaseDao { //採用單例模式實現,防止資料庫連線超時 private static DataSource ds = null; public QueryRunner initQueryRunner() throws Exception { if (ds == null) { String dbFile = this.getClass().getClassLoader().getResource("/").getFile(); dbFile = dbFile.substring(1) + "db.properties"; FileReader fr = new FileReader(dbFile); Properties pro = new Properties(); pro.load(fr); ds = DruidDataSourceFactory.createDataSource(pro); } QueryRunner qur = new QueryRunner(ds); return qur; } }
Userservlet核心程式碼
@WebServlet("/user/*") public class UserServlet extends BaseServlet{ //業務層類,用於呼叫業務層方法 UserService userService = new UserServiceImpl(); /** * 註冊使用者 * @param req * @param resp */ public void register(HttpServletRequest req, HttpServletResponse resp) { //獲取資料 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload fileUpload = new ServletFileUpload(factory); try { List<FileItem> fileItemList = fileUpload.parseRequest(req); //獲取當前專案的路徑 String classesPath = this.getClass().getResource("/").getPath(); File f1 = new File(classesPath); //專案路徑 String projectPath = f1.getParentFile().getParentFile().getParentFile().getAbsolutePath(); //最後上傳的路徑 String uploadPath = projectPath + "\ROOT\upload\"; File f2 = new File(uploadPath); if (!f2.exists()) { f2.mkdirs(); } //存入資料庫的路徑 String headPortraitPath = ""; for (FileItem fileItem : fileItemList) { if (!fileItem.isFormField()) { //是檔案域 String fileName = fileItem.getName(); //獲取原來檔案的字尾 String suffix = fileName.substring(fileName.lastIndexOf(".")); //生成新的檔名,為防止重複,採用亂數 String destFileName = UUID.randomUUID().toString().replace("-", ""); //存入資料庫的路徑拼接完畢,例如格式:隨機檔名.txt headPortraitPath = destFileName + suffix; //寫入硬碟的路徑 uploadPath += headPortraitPath; //獲取輸入流 InputStream is = fileItem.getInputStream(); //輸出流 FileOutputStream fos = new FileOutputStream(uploadPath); //將上傳的檔案寫入指定路徑 try { byte[] buf = new byte[10240]; while (true) { int realLen = is.read(buf, 0, buf.length); if (realLen < 0) { break; } fos.write(buf, 0, realLen); } } finally { if (fos != null) fos.close(); if (is != null) is.close(); } } else { //不是檔案域,是普通控制元件 //獲取輸入框的名稱 String fieldName = fileItem.getFieldName(); //獲取輸入框中的值 String fieldVal = fileItem.getString("utf-8"); //加入請求域中 req.setAttribute(fieldName, fieldVal); } } String username = (String) req.getAttribute("username"); String password = (String) req.getAttribute("password"); //驗證引數是否合法,不為空 boolean flag = userService.exam(username, password); if (flag) { //將資料存入資料庫 User user = new User(); user.setUsername(username); user.setPassword(password); user.setHead_portrait_path(headPortraitPath); if (userService.save(user)) { resp.sendRedirect(req.getContextPath()+"/login.jsp"); } } else { resp.sendRedirect(req.getContextPath()+"/register.jsp"); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } /** * 使用者登入 * @param req * @param resp */ public void login(HttpServletRequest req, HttpServletResponse resp) { //獲取資料 String username = req.getParameter("username"); String password = req.getParameter("password"); //驗證是否存在該使用者 User user = new User(); try { if (userService.exam(username, password)) { user.setUsername(username); user.setPassword(password); user = userService.getByUser(user); if (user.getHead_portrait_path() != null) { HttpSession s1 = req.getSession(); s1.setAttribute("user", user); resp.sendRedirect(req.getContextPath()+"/index.jsp"); } else { resp.sendRedirect(req.getContextPath()+"/login.jsp"); } } else { resp.sendRedirect(req.getContextPath()+"/login.jsp"); } } catch(Exception e) { e.printStackTrace(); } } }
到此這篇關於JavaWeb檔案上傳流程的文章就介紹到這了,更多相關JavaWeb檔案上傳內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45