Idea + maven 搭建 SSH (struts2 +hibernate5 + spring5) 環境

org.apache.struts

struts2-core

2.3.35

org.apache.struts

struts2-spring-plugin

2.3.35

org.apache.struts

struts2-json-plugin

2.3.8

1.4 配置Java EE 坐標依賴

這里可以引入 servlet api,jstl 標簽庫等一系列工具

javax.servlet

javax.servlet-api

3.1.0

provided

javax.servlet.jsp

javax.servlet.jsp-api

2.3.1

provided

org.projectlombok

lombok

1.18.0

provided

jstl

jstl

1.2

taglibs

standard

1.1.2

1.5 其他工具

json 處理工具

org.jetbrains

annotations-java5

RELEASE

compile

org.json

json

20160810

二、項目結構搭建

=======================================================================

2.1 配置文件

使用如下方式創建

在這里插入圖片描述

  1. applicationContext.xml

  2. jdbc.properties

  3. struts.xml

2.2 包結構

創建如下的基本包結構

在這里插入圖片描述

三、編寫配置文件

=======================================================================

3.1 web.xml 文件配置

Archetype Created Web Application

contextConfigLocation

classpath:applicationContext.xml

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

/*

org.springframework.web.context.ContextLoaderListener

3.2 編寫 jdbc.properties 文件

這里我們需要自己手動修改數據庫的信息配置

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.jdbcUrl=jdbc:mysql://localhost:3306/hibernate?characterEncoding=utf-8&autoReconnect=true&useSSL=false

jdbc.user=root

jdbc.password=root

#連接池中保留的最小連接數

jdbc.minPoolSize=1

#連接池中保留的最大連接數

jdbc.maxPoolSize=20

#初始化連接數

jdbc.initialPoolSize=1

3.3 編寫 applicationContext.xml 配置文件

這里面也包含了數據庫的基本配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:tx=“http://www.springframework.org/schema/tx”

xmlns:context=“http://www.springframework.org/schema/context”

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

<context:property-placeholder location=“classpath:jdbc.properties”/>

<context:component-scan base-package=“dao.,service.”/>

<context:component-scan base-package=“action”/>

context:annotation-config/

org.hibernate.dialect.MySQLDialect

update

thread

true

true

false

<tx:annotation-driven transaction-manager=“txManager”/>

3.4 struts 配置文件

我們還沒有編寫的具體的 action 服務,所以這里先跳過

四、使用 hibernate 逆向生成工具生成實體

========================================================================================

4.1 配置數據庫連接信息

使用 idea 自帶的數據庫連接的工具

在這里插入圖片描述

完善基本配置信息

在這里插入圖片描述

4.2 逆向生成實體類

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

4.3 實體類配置

生成好后可以看到和數據庫對應的實體類,我的表很簡單,一個簡單的用戶表,只有 id, username, password 字段

在這里插入圖片描述

但是我們發現里面的部分內容會爆紅,這是因為我們沒有指定數據源

在這里插入圖片描述

選擇我們剛才連接的數據庫

在這里插入圖片描述

然后就沒問題了。

五、JavaBean 編寫

============================================================================

看到包結構,大家應該可以猜出來,我是使用的典型的 MVC 三層架構來編寫的

5.1 編寫 dao 層

創建 UserDao 以及 它的實現類 UserDaoImpl

在這里插入圖片描述

UserDao 編寫

package dao;

import entity.User;

public interface UserDao {

// 用戶登錄驗證

public User selectByUsernameAndPassword(String username, String password);

}

UserDaoImpl

package dao.Impl;

import dao.UserDao;

import entity.User;

import org.hibernate.Session;

import org.hibernate.query.Query;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.orm.hibernate5.HibernateTemplate;

import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

// 使用 Spring 來接管持久層的所有操作

@Repository

public class UserDaoImpl implements UserDao {

// 使用 Hibernate 提供的模板

@Autowired

@Resource

private HibernateTemplate hibernateTemplate;

// 生成對應的 get 和 set 方法

public HibernateTemplate getHibernateTemplate() {

return hibernateTemplate;

}

public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

this.hibernateTemplate = hibernateTemplate;

}

@Override

public User selectByUsernameAndPassword(String username, String password) {

// 登錄的邏輯不算難,就是使用 sql 語句查詢,username 和 password 兩個字段是否存在即可,我們使用的是 hibernate 框架,所以要寫 hql 語句

Session session = hibernateTemplate.getSessionFactory().openSession();

Query q = session.createQuery(“from User u where u.username = ? and u.password = ?”);

q.setParameter(0,username);

q.setParameter(1,password);

User u = (User) q.uniqueResult();

return u;

}

}

我們寫好了 dao 層,這時候發現出現了爆紅的問題,這里我們需要手動添加項目的依賴信息

在這里插入圖片描述

點擊 project structure

在這里插入圖片描述

在這里插入圖片描述

添加這個就可以了,問題就解決了

在這里插入圖片描述

顯示正常了

在這里插入圖片描述

5.2 編寫 Service 層

同樣,我們創建對應的 UserService 和 對應的 UserServiceImpl

有的同學可能會問道,不就是一個簡單的登錄功能嘛,有必要這么麻煩嗎?是的,這么做確實沒必要,但是隨著項目的越來越大,只有把具體的功能全部分開來做,這樣才不至于整個項目太過于亂

編寫用戶的業務層 接口 UserService

package service;

import entity.User;

public interface UserService {

// 登錄驗證

User checklogin(String username, String password);

}

編寫 業務層對應的實現類 UserServiceImpl

package service.Impl;

import dao.UserDao;

import entity.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import service.UserService;

@Service

public class UserServiceImpl implements UserService {

// 這里業務層調用持久層的方法

@Autowired

private UserDao ud;

@Override

public User checklogin(String username, String password) {

return ud.selectByUsernameAndPassword(username,password);

}

}

5.3 編寫 Controller 層 (UserAction)

這里的邏輯思路,是 controller 層 調用 service 的方法,service 層調用 dao 層的方法

package action;

import com.opensymphony.xwork2.ActionContext;

import entity.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import service.UserService;

import java.util.Map;

// 使用 Controller 表示這是控制層,使用 ua 表示這個類被 Spring 所管理

@Controller(“ua”)

public class UserAction {

// 編寫兩個屬性,使用 struts2 的 ognl 表達式可以直接接收到前端穿過來的數據,不再需要 request.getParameter(“xxxx”) 接收數據了

private String username;

private String password;

// 調用業務層的方法

@Autowired

private UserService us;

// get 方法可以不要, set 方法必須有,不然前端的數據就無法注入進來

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

// 編寫登錄逇控制層方法

public String login() {

System.out.println(username + " " + password); // 打印穿過來的數據

ActionContext ac = ActionContext.getContext();

// 得到 servlet 中的三大域的 session 域,在這里我們要將數據保存至 session,并在前端展示

Map<String,Object> session = ac.getSession(); // 我們可以看到 session 的實質就是一個 map

User user = us.checklogin(username,password); // 登錄驗證

if ( user!=null ) {

session.put(“user”,username);

return “success”;

} else {

return “error”;

}

}

}

5.4 編寫 struts 路由映射

記得在 Project Structure 添加如下配置

在這里插入圖片描述

stucts action 配置

<?xml version="1.0" encoding="UTF-8"?>

自我介紹一下,小編13年上海交大畢業,曾經在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現在。

深知大多數Java工程師,想要提升技能,往往是自己摸索成長或者是報班學習,但對于培訓機構動則幾千的學費,著實壓力不小。自己不成體系的自學效果低效又漫長,而且極易碰到天花板技術停滯不前!

因此收集整理了一份《2024年Java開發全套學習資料》,初衷也很簡單,就是希望能夠幫助到想自學提升又不知道該從何學起的朋友,同時減輕大家的負擔。img

既有適合小白學習的零基礎資料,也有適合3年以上經驗的小伙伴深入學習提升的進階課程,基本涵蓋了95%以上Java開發知識點,真正體系化!

由于文件比較大,這里只是將部分目錄截圖出來,每個節點里面都包含大廠面經、學習筆記、源碼講義、實戰項目、講解視頻,并且會持續更新!

如果你覺得這些內容對你有幫助,可以掃碼獲取!!(備注Java獲取)

img

總結

我們總是喜歡瞻仰大廠的大神們,但實際上大神也不過凡人,與菜鳥程序員相比,也就多花了幾分心思,如果你再不努力,差距也只會越來越大。實際上,作為程序員,豐富自己的知識儲備,提升自己的知識深度和廣度是很有必要的。

Mybatis源碼解析

《互聯網大廠面試真題解析、進階開發核心學習筆記、全套講解視頻、實戰項目源碼講義》點擊傳送門即可獲取!
技能,往往是自己摸索成長或者是報班學習,但對于培訓機構動則幾千的學費,著實壓力不小。自己不成體系的自學效果低效又漫長,而且極易碰到天花板技術停滯不前!**

因此收集整理了一份《2024年Java開發全套學習資料》,初衷也很簡單,就是希望能夠幫助到想自學提升又不知道該從何學起的朋友,同時減輕大家的負擔。[外鏈圖片轉存中…(img-C1M1t1tm-1713384424162)]

[外鏈圖片轉存中…(img-VMFfQBTB-1713384424162)]

[外鏈圖片轉存中…(img-AN1CZh1T-1713384424163)]

既有適合小白學習的零基礎資料,也有適合3年以上經驗的小伙伴深入學習提升的進階課程,基本涵蓋了95%以上Java開發知識點,真正體系化!

由于文件比較大,這里只是將部分目錄截圖出來,每個節點里面都包含大廠面經、學習筆記、源碼講義、實戰項目、講解視頻,并且會持續更新!

如果你覺得這些內容對你有幫助,可以掃碼獲取!!(備注Java獲取)

img

總結

我們總是喜歡瞻仰大廠的大神們,但實際上大神也不過凡人,與菜鳥程序員相比,也就多花了幾分心思,如果你再不努力,差距也只會越來越大。實際上,作為程序員,豐富自己的知識儲備,提升自己的知識深度和廣度是很有必要的。

Mybatis源碼解析

[外鏈圖片轉存中…(img-7W9TCuse-1713384424163)]

[外鏈圖片轉存中…(img-mJri2T8N-1713384424163)]

《互聯網大廠面試真題解析、進階開發核心學習筆記、全套講解視頻、實戰項目源碼講義》點擊傳送門即可獲取!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13248.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6大部分,20 個機器學習算法全面匯總!!建議收藏!(上篇)

前兩天有小伙伴說想要把常見算法的原理 公式匯集起來。 這樣非常非常方便查看&#xff01;分為上下兩篇&#xff0c;下篇地址&#xff1a; 本次文章分別從下面6個方面&#xff0c;涉及到20個算法知識點&#xff1a; 監督學習算法 無監督學習算法 半監督學習算法 強化學習…

YOLOV8環境部署(GPU版本)

一、安裝&#xff43;&#xff55;&#xff44;&#xff41;和&#xff43;&#xff55;&#xff44;&#xff4e;&#xff4e; 1、安裝cuda之前先打開英偉達控制面板查看自己的顯卡信息 2、“幫助”—>“系統信息”—>“組件”&#xff0c;然后看第三行的信息“Nvidia …

進程信號 signal

文章目錄 信號基礎信號的產生OS中的時間 信號的保存sigset_tsigprocmasksigpending 信號的捕捉用戶態和內核態sigactionvolatile SIGCHLD 信號基礎 生活中的信號 你在網上買了很多件商品&#xff0c;再等待不同商品快遞的到來。但即便快遞沒有到來&#xff0c;你也知道快遞來臨…

elememt-plus的表格的增刪改查#Vue3無需json數據,無需后端接口

elememt-plus的表格的增刪改查#Vue3無需json數據&#xff0c;無需后端接口 實現效果&#xff1a; <template><!-- 演示地址 --><div class"dem-add"><!-- Search start --><div class"dem-title"><p>演示地址</…

Python裝飾器:深入理解與應用實例

Python裝飾器&#xff1a;深入理解與應用實例 一、引言 在Python編程中&#xff0c;裝飾器&#xff08;Decorators&#xff09;是一個強大且實用的特性&#xff0c;它允許程序員在不修改原有函數或類代碼的情況下&#xff0c;為其添加額外的功能。裝飾器本質上是一個可調用對…

基于springboot的知識管理系統源碼數據庫

基于springboot的知識管理系統源碼數據庫 隨著信息互聯網信息的飛速發展&#xff0c;無紙化作業變成了一種趨勢&#xff0c;針對這個問題開發一個專門適應師生作業交流形式的網站。本文介紹了知識管理系統的開發全過程。通過分析企業對于知識管理系統的需求&#xff0c;創建了…

【Git教程】(十八)拆分大項目 — 概述及使用要求,執行過程及其實現,替代解決方案 ~

Git教程 拆分大項目 1?? 概述2?? 使用要求3?? 執行過程及其實現3.1 拆分模塊版本庫3.2 將拆分出的模塊作為外部版本庫集成 4?? 替代解決方案 通常軟件項目都是由單體小型系統開始的&#xff0c;在開發過程中項目規模和團隊人員不斷擴大&#xff0c; 將項目模塊化會顯得…

C#實現各種Hash計算

C#實現各種Hash計算 文章目錄 C#實現各種Hash計算涉及框架及庫目前支持可計算的類型核心代碼完整可運行代碼 BCrypt總結 涉及框架及庫 自己在NuGet管理器里面安裝即可 BouncyCastle.Cryptography&#xff1a;是加密算法和協議的.NET實現。 目前支持可計算的類型 BLAKE2B_16…

如何在Idea離線情況下安裝vue.js插件

親踐有效&#xff0c;步驟如下: 1. 互聯網環境登陸vue.js官網(Vue.js - IntelliJ IDEs Plugin | Marketplace)。 2. 然后先確定你的IDEA的版本&#xff1a;在你IDEA的安裝文件中找到product-info.json&#xff0c;里面的buildNumber記錄著你IDEA的精確版本號&#xff0c;根據…

【Entity Framework】EF中SaveChanges如何使用

【Entity Framework】EF中SaveChanges如何使用 文章目錄 【Entity Framework】EF中SaveChanges如何使用一、概述二、更改跟蹤和SaveChanges三、SaveChanges優勢四、使用SaveChanges添加數據五、使用SaveChanges更新數據六、使用SaveChanges刪除數據七、單個SaveChanges中的多個…

roscore啟動報錯的解決方法【將環境變量配置于最后】

今天在啟動rviz時發生一個很奇怪的報錯&#xff1a; rviz: error while loading shared libraries: librviz.so: cannot open shared object file: No such file or directory 我感覺很納悶&#xff01;再試著啟動一下roscore&#xff0c;發現如下報錯&#xff1a; [rosout-1…

[muduo網絡庫]——使用muduo庫搭建Echo服務器(剖析muduo網絡庫核心部分、設計思想)

在此之前&#xff0c;我們對于muduo庫的每一類幾乎都進行了逐行的分析&#xff0c;但是一個網絡庫的每個模塊之間總是有千絲萬縷的關系&#xff0c;所以可能有的地方還是有分析的不到位&#xff0c;所以從這一篇開始&#xff0c;我們從muduo的簡單使用----搭建一個Echo服務器&a…

Python爬蟲從入門到精通:一篇涵蓋所有細節的高質量教程

目錄 第一部分&#xff1a;Python爬蟲基礎 1.1 爬蟲原理 1.2 Python爬蟲常用庫 1.3 爬蟲實戰案例 1.4 注意事項 第二部分&#xff1a;爬蟲進階技巧 2.1 處理動態加載的內容 2.2 登錄認證 2.3 分布式爬取 2.4 反爬蟲策略 第三部分&#xff1a;爬蟲實戰項目 3.1 豆瓣…

【C語言】指針(二)

目錄 一、傳值調用和傳址調用 二、數組名的理解 三、通過指針訪問數組 四、一維數組傳參的本質 五、指針數組 六、指針數組模擬實現二維數組 一、傳值調用和傳址調用 指針可以用在哪里呢&#xff1f;我們看下面一段代碼&#xff1a; #include <stdio.h>void Swap(i…

基于Spring封裝一個websocket工具類使用事件發布進行解耦和管理

最近工作中&#xff0c;需要將原先的Http請求換成WebSocket&#xff0c;故此需要使用到WebSocket與前端交互。故此這邊需要研究一下WebSocket到底有何優點和不可替代性&#xff1a; WebSocket優點&#xff1a; WebSocket 協議提供了一種在客戶端和服務器之間進行全雙工通信的…

如何在MATALB中調用libMR

? 因為個人項目原因,我曾將參考OpenMax源碼GitHub - abhijitbendale/OSDN: Code and data for the research paper “Towards Open Set Deep Networks” A Bendale, T Boult, CVPR 2016將其轉換到MATLAB使用。 OpenMax 使用極值理論實現對開放集的篩選,在計算得分時需要用l…

異地組網群暉不能訪問怎么辦?

在日常使用群暉網絡儲存設備時&#xff0c;我們常常會遇到無法訪問的情況&#xff0c;特別是在異地組網時。這個問題很常見&#xff0c;但也很讓人困擾。本文將針對異地組網群暉無法訪問的問題進行詳細解答和分析。 異地組網的問題 在異地組網中&#xff0c;群暉設備無法訪問的…

Unity | Spine動畫動態加載

一、準備工作 Spine插件及基本知識可查看這篇文章&#xff1a;Unity | Spine動畫記錄-CSDN博客 二、Spine資源動態加載 1.官方說明 官方文檔指出不建議這種操作。但spine-unity API允許在運行時從SkeletonDataAsset或甚至直接從三個導出的資產實例化SkeletonAnimation和Skel…

被耽誤了的發明家

高三的某一天&#xff0c;數學焦老師在黑板上推公式&#xff0c;突然花屁股&#xff08;見另一篇博文《數學老師們》&#xff09;上出現了一個光圈。我心里一樂&#xff0c;有人在玩鏡子。本來大家對于焦老師的花屁股已經司空見慣了&#xff0c;可以不受干擾地聽課&#xff0c;…

HNU-算法設計與分析-作業3

第三次作業【動態規劃】 文章目錄 第三次作業【動態規劃】<1>算法實現題 3-1 獨立任務最優解問題<2>算法實現題 3-4 數字三角形問題<3>算法實現題 3-8 最小m段和問題<4>算法實現題 3-25 m處理器問題 <1>算法實現題 3-1 獨立任務最優解問題 ▲問…