Idea+maven搭建SSH(struts2+hibernate5+spring5)環境的方法步驟
最近要使用 SSH 來編寫期末的考核任務,之前也在網上查閱了很久,也試出了很多的問題。也很感謝很多前輩們的總結,我也查到了很多用用的內容。
本次專案,我將以一個簡單的登入案例實現 SSH 的專案整合,專案我會放到 Github 上面,需要的同學可以 clone 下來在本地跑一跑
專案地址:SSH 腳手架
一、專案環境搭建
使用 maven 搭建一個 Java Web 專案
1.1 配置 Spring 座標依賴
引入 Spring 座標依賴
<!-- spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!--spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- spring-orm --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- aop面向切面依賴的jar包 --> <!-- aspectjrt --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.1</version> </dependency> <!-- aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.1</version> </dependency>
1.2 配置 hibernate 座標依賴
我們的目標是要整合 SSH,所以需要 hibernate 的核心依賴, mysql 資料庫驅動,以及 c3p0 資料庫連線池
<!-- hibernate核心依賴 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.17.Final</version> </dependency> <!-- mysql資料庫驅動依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- c3p0連線池 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency>
1.3 配置 struts2 座標依賴
我們需要 struts 核心,以及 struts 整合 spring 的外掛,以及 struts 對 json 資料處理的外掛
<!-- struts2 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.35</version> </dependency> <!-- struts2-spring-plugin整合spring和struts2 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.35</version> </dependency> <!-- json 資料處理,struts 外掛 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.3.8</version> </dependency>
1.4 配置Java EE 座標依賴
這裡可以引入 servlet api,jstl 標籤庫等一系列工具
<!-- servlet api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <!-- lombok 一個外掛,可以免 getter 和 setter 方法,但是需要我們在 idea 中裝對應的外掛才可以使用,可以不要--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency> <!-- jstl --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
1.5 其他工具
json 處理工具
<dependency> <groupId>org.jetbrains</groupId> <artifactId>annotations-java5</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <!-- 官方給的 json 包,建議使用這個,但是我後面好像並沒有用到 --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160810</version> </dependency>
二、專案結構搭建
2.1 配置檔案
使用如下方式建立
1.applicationContext.xml
2.jdbc.properties
3.struts.xml
2.2 包結構
建立如下的基本包結構
三、編寫配置檔案
3.1 web.xml 檔案配置
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <!-- Spring 的配置檔案--> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- struts2核心過濾器,過濾所有的請求 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 上下文監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
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"/> <!-- 自動掃描與裝配bean--> <context:component-scan base-package="dao.*,service.*"/> <context:component-scan base-package="action"/> <!--引入註解解析器--> <context:annotation-config/> <!-- 資料來源連線池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <property name="minPoolSize" value="${jdbc.minPoolSize}"/> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/> <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="hibernateProperties"> <props> <!--配置Hibernate的方言--> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.current_session_context_class">thread</prop> <!--格式化輸出sql語句--> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.use_sql_comments">false</prop> </props> </property> <!-- 自動掃描實體 --> <property name="packagesToScan" value="entity" /> </bean> <!-- 配置 HibernateTemplate 物件 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <!-- 注入 SessionFactory 物件 --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 用註解來實現事務管理 --> <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="txManager"/> </beans>
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"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="user" namespace="/" extends="struts-default"> <action name="checklogin" class="ua" method="login"> <!-- 登入成功挑戰至首頁 --> <result name="success" type="redirect">/index.jsp</result> <!-- 登入失敗跳轉至錯誤頁面 --> <result name="error" type="redirect">/error.jsp</result> </action> </package> </struts>
六、前端介面編寫
6.1 登入介面編寫
<%-- Created by IntelliJ IDEA. User: Gorit Date: 2020/6/13 Time: 23:18 Contact: [email protected] To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="checklogin" method="post"> <label for="username">賬戶:</label> <input type="text" name="username" id="username"><br> <label for="password">密碼:</label> <input type="password" name="password" id="password"><br> <input type="submit" value="登入"> </form> </body> </html>
6.1 登入成功
<%-- Created by IntelliJ IDEA. User: Gorit Date: 2020/6/13 Time: 23:21 Contact: [email protected] To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h3>歡迎你 ${sessionScope.user} 登入!!</h3> </body> </html>
6.3 登入失敗
<%-- Created by IntelliJ IDEA. User: Gorit Date: 2020/6/13 Time: 23:21 Contact: [email protected] To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>出錯啦!!!</h2> </body> </html>
到此這篇關於Idea+maven搭建SSH(struts2+hibernate5+spring5)環境的方法步驟的文章就介紹到這了,更多相關Idea+maven搭建SSH內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!