首頁 > 軟體

JavaWeb檔案上傳流程

2022-05-24 14:01:45

JavaWeb檔案上傳

本文我們學習JavaWeb中最重要的技術之一,檔案上傳,該案例我會用一個小型的使用者管理系統實現,一步步帶入,內容通俗易懂,下面我們步入正題!

做一個簡單的使用者管理系統

功能如下

使用者註冊,引數有使用者名稱,使用者名稱密碼,使用者頭像,

使用者登入,登入成功後跳轉至主頁顯示使用者頭像和名稱,支援登出賬號,登出賬號後,頁面跳轉至登入頁

技術棧:後端採用JavaWebMySQL5.7Druid連線池、前端採用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包如下

jar檔案放在WEB-INF/lib資料夾下,主要是為了安全。

檔案上傳需要的jar包:

jar檔案我會同步資源,小夥伴們不用擔心哦~

專案結構簡介

本專案採用三層架構實現,即:service層、dao層、servlet層

  • servlet層:

由於之前的servlet層類增刪改查的類太過於多,導致程式碼冗餘,所以在jsp頁面傳送請求時,採用模組化的方式進行存取,例如:

  • http://localhost/Blog/user/addUser 存取user模組的addUser
  • http://localhost/Blog/user/getUserList 存取user模組的getUserList
  • http://localhost/Blog/dept/addDept 存取dept的addDept
  • http://localhost/Blog/dept/getDeptList 存取dept的getDeptList

這樣一個對應的類解決該類的所有對資料庫的增刪改查操作,提高了程式的可維護性,減少程式碼的冗餘,提高了程式的健壯性。
抽取出公共父類別: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層

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!


IT145.com E-mail:sddin#qq.com