最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb文件上傳流程

 更新時間:2022年05月24日 17:02:35   作者:小王Java  
這篇文章主要介紹了JavaWeb文件上傳流程,JavaWeb中最重要的技術(shù)之一,下文關(guān)于其文件上傳的流程分享,需要的小伙伴可以參考一下

JavaWeb文件上傳

本文我們學習JavaWeb中最重要的技術(shù)之一,文件上傳,該案例我會用一個小型的用戶管理系統(tǒng)實現(xiàn),一步步帶入,內(nèi)容通俗易懂,下面我們步入正題!

做一個簡單的用戶管理系統(tǒng)

功能如下

用戶注冊,參數(shù)有用戶名,用戶名密碼,用戶頭像,

用戶登錄,登錄成功后跳轉(zhuǎn)至主頁顯示用戶頭像和名稱,支持注銷賬號,注銷賬號后,頁面跳轉(zhuǎn)至登錄頁

技術(shù)棧:后端采用JavaWeb、MySQL5.7、Druid連接池、前端采用bootstrap框架結(jié)合jsp

先上效果

完整操作項目演示:

包含:用戶注冊,用戶登錄,用戶登錄后顯示用戶信息,即頭像,賬號名,最右側(cè)顯示注銷,點擊注銷后跳轉(zhuǎn)至登錄頁

項目結(jié)構(gòu)Java源碼

前端頁面jsp

數(shù)據(jù)表準備

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文件我會同步資源,小伙伴們不用擔心哦~

項目結(jié)構(gòu)簡介

本項目采用三層架構(gòu)實現(xiàn),即:service層、dao層、servlet層

  • servlet層:

由于之前的servlet層類增刪改查的類太過于多,導致代碼冗余,所以在jsp頁面發(fā)送請求時,采用模塊化的方式進行訪問,例如:

  • 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

這樣一個對應(yīng)的類解決該類的所有對數(shù)據(jù)庫的增刪改查操作,提高了程序的可維護性,減少代碼的冗余,提高了程序的健壯性。
抽取出公共父類:BaseServletBaseServlet類核心代碼

public class BaseServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.獲取瀏覽器請求的資源
String uri = req.getRequestURI();
//2.獲取請求的方法名,最后斜線后面的內(nèi)容
String methodName = uri.substring(uri.lastIndexOf("/")+1);
try {
//3.根據(jù)方法名獲取方法,通過反射獲取
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//4.調(diào)用方法
method.invoke(this, req, resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
  • dao層

dao層抽取出公共數(shù)據(jù)庫連接類,BaseDao,基于db.properties配置文件連接本地數(shù)據(jù)庫

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 {
//采用單例模式實現(xiàn),防止數(shù)據(jù)庫連接超時
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{

//業(yè)務(wù)層類,用于調(diào)用業(yè)務(wù)層方法
UserService userService = new UserServiceImpl();

/**
* 注冊用戶
* @param req
* @param resp
*/
public void register(HttpServletRequest req, HttpServletResponse resp) {
//獲取數(shù)據(jù)
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();
}
//存入數(shù)據(jù)庫的路徑
String headPortraitPath = "";
for (FileItem fileItem : fileItemList) {
if (!fileItem.isFormField()) {
//是文件域
String fileName = fileItem.getName();
//獲取原來文件的后綴
String suffix = fileName.substring(fileName.lastIndexOf("."));
//生成新的文件名,為防止重復,采用隨機數(shù)
String destFileName = UUID.randomUUID().toString().replace("-", "");

//存入數(shù)據(jù)庫的路徑拼接完畢,例如格式:隨機文件名.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");
//驗證參數(shù)是否合法,不為空
boolean flag = userService.exam(username, password);
if (flag) {
//將數(shù)據(jù)存入數(shù)據(jù)庫
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) {
//獲取數(shù)據(jù)
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();
}
}
}

到此這篇關(guān)于JavaWeb文件上傳流程的文章就介紹到這了,更多相關(guān)JavaWeb文件上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java銀行管理系統(tǒng)源碼

    java銀行管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了java銀行管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java開發(fā)之Spring連接數(shù)據(jù)庫方法實例分析

    Java開發(fā)之Spring連接數(shù)據(jù)庫方法實例分析

    這篇文章主要介紹了Java開發(fā)之Spring連接數(shù)據(jù)庫方法,以實例形式較為詳細的分析了Java Spring開發(fā)中針對數(shù)據(jù)庫的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Java加密 消息摘要算法SHA實現(xiàn)詳解

    Java加密 消息摘要算法SHA實現(xiàn)詳解

    這篇文章主要介紹了Java加密 消息摘要算法SHA實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Springboot mybatis-plus配置及用法詳解

    Springboot mybatis-plus配置及用法詳解

    這篇文章主要介紹了Springboot mybatis-plus配置及用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java實現(xiàn)微信支付的簽名算法示例

    Java實現(xiàn)微信支付的簽名算法示例

    這篇文章主要為大家介紹了Java實現(xiàn)微信支付的簽名算法實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java Spring集成MapStruct詳情

    Java Spring集成MapStruct詳情

    這篇文章主要介紹了Java Spring集成MapStruct詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • Java Arrays.fill()的具體使用

    Java Arrays.fill()的具體使用

    本文主要介紹了Java Arrays.fill()的具體使用,更好地理解Arrays.fill()方法的用法以及在實際應(yīng)用中如何使用它,感興趣的可以了解一下
    2023-09-09
  • Springboot 2.6集成redis maven報錯的坑記錄

    Springboot 2.6集成redis maven報錯的坑記錄

    這篇文章主要介紹了Springboot 2.6集成redis maven報錯的坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 如何利用Ganymed SSH-2模擬SSH操作

    如何利用Ganymed SSH-2模擬SSH操作

    這幾天看SFTP資料時,無意中看到了Ganymed SSH-2,寫了個簡單demo,通過,感覺挺好用的,下面就和大家分享下。需要的朋友可以過來參考參考
    2013-08-08
  • MyBatis Plus復合主鍵問題的解決

    MyBatis Plus復合主鍵問題的解決

    在數(shù)據(jù)庫設(shè)計中,有時候需要使用復合主鍵來唯一標識表中的一行數(shù)據(jù),本文將為您詳細介紹MyBatis Plus中復合主鍵的問題以及解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

阳西县| 襄汾县| 竹北市| 逊克县| 蒙自县| 三台县| 台东市| 来安县| 建德市| 香格里拉县| 新巴尔虎右旗| 岐山县| 景宁| 静宁县| 洛隆县| 汝阳县| 都匀市| 石首市| 伊金霍洛旗| 登封市| 江都市| 马龙县| 咸阳市| 江口县| 巴林左旗| 武胜县| 龙江县| 长武县| 江西省| 蒙阴县| 遵义市| 府谷县| 鄄城县| 汝城县| 锦屏县| 安远县| 威宁| 商南县| 卢龙县| 万安县| 裕民县|