【快速搭建系列】idea快速搭建SSH2框架(struts2+spring5+hibernate5)
压了很久的文,都差点忘记了
网上关于SSH的框架教程五花八门的,自己踩了一周多的坑说什么也要搞一个简单粗暴的😂
那么现在开始
步骤
首先创建一个maven项目,如果你不知道怎么创建,可以看下这篇笔记: 【快速搭建系列】idea保姆级傻瓜式快速搭建maven项目(附免费资源示例)_Tuerlechat,的博客-CSDN博客
添加maven依赖
pom.xml
<properties>
<spring.version>5.1.0.RELEASE</spring.version>
</properties>
<dependencies>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- AOP织入包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.1</version>
</dependency>
<!-- 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>
<!-- 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>
<!-- 日志 -->
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
<!-- 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 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
项目结构
我写了一个小例子,项目结构如下:
下面的文件对应这个图片一一对应就好😇
配置文件
相对的东西自己改一下就好
数据库配置文件
database.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/数据库名?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
jdbc.username=数据库用户名
jdbc.password=数据库密码
jdbc.maxPoolSize=20
spring配置文件
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">
<!-- 读取数据库配置文件jdbc.properties -->
<context:property-placeholder location="classpath:database.properties"/>
<!-- 自动扫描与装配bean-->
<context:component-scan base-package="com.r.dao.*,com.r.service.*"/>
<context:component-scan base-package="com.r.action"/>
<!--引入注解解析器-->
<context:annotation-config/>
<!-- 数据源连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
</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="com.r.pojo" />
</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"/>
<!-- 将struts类注入spring的bean中(只是介绍用法,如果不需要删掉即可) -->
<bean id="UserAction" class="com.r.action.UserAction"/>
</beans>
struts2配置文件
这个可以写自己的路径,或者第一次搭可以按我的例子走
struts.xml
<?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="helloworld" namespace="/" extends="struts-default">
<!-- 如果action类使用spring的bean注入,那么class属性中要设置成注入相应bean的id即可 -->
<action name="login"
class="UserAction"
method="login">
<!-- 登录成功挑战至首页 -->
<result name="success">/index.jsp</result>
<!-- 登录失败跳转至错误页面 -->
<result name="error">/error.jsp</result>
</action>
<!-- 如果没有用spring的bean注入,正常指定到相应action类的位置即可 -->
<action name="test"
class="com.r.action.TestAction"
method="execute">
<result name="test">/test.jsp</result>
</action>
</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 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>
<!-- 欢迎页面 -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
逆向生成实体类
idea右侧选择database,按图添加数据库
输入相关信息,然后ok
右击数据库,跟着图示走
然后选择一下相应的数据库和把其放在哪个包下,和选择逆向生成数据库的那些表
然后ok
tips:相应的对勾要记得打上!!!🤓
如果有提示就yes
然后可以看到已经成功生成逆向实体类
逆向实体类代码
User.java
package com.r.pojo;
import javax.persistence.*;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.Objects;
/**
* @Author Tuerlechat,
* @Date 2022/12/5
*/
@Entity
@Table(name = "jntm_user", schema = "jntm", catalog = "")
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "id", nullable = false)
private long id;
@Basic
@Column(name = "userCode", nullable = true, length = 15)
private String userCode;
@Basic
@Column(name = "userName", nullable = true, length = 15)
private String userName;
@Basic
@Column(name = "userPassword", nullable = true, length = 15)
private String userPassword;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id && Objects.equals(userCode, user.userCode) && Objects.equals(userName, user.userName) && Objects.equals(userPassword, user.userPassword);
}
@Override
public int hashCode() {
return Objects.hash(id, userCode, userName, userPassword);
}
}
然后继续接口阿巴阿巴。。。
Dao层接口
UserDao.java
/**
* @Author Tuerlechat,
* @Date 2022/11/8
*/
public interface UserDao {
// 用户登录验证
public User selectByUsernameAndPassword(String username, String password);
}
Dao层接口实现
UserDaoImpl.java
/**
* @Author Tuerlechat,
* @Date 2022/11/8
*/
// 使用 Spring 来接管持久层的所有操作
@Repository
public class UserDaoImpl implements UserDao {
// 使用 Hibernate 提供的模板
@Autowired
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) {
Session session = hibernateTemplate.getSessionFactory().openSession();
Query q = session.createQuery("from User u where u.userCode = ? and u.userPassword = ?");
q.setParameter(0,username);
q.setParameter(1,password);
User u = (User) q.uniqueResult();
return u;
}
}
tips:别想着写@mapper,那是人家mybatis的😂
Service层接口
UserService.java
/**
* @Author Tuerlechat,
* @Date 2022/11/8
*/
@Service
public interface UserService {
// 登录验证
User checklogin(String username, String password);
}
Service层接口实现
UserServiceImpl.java
/**
* @Author Tuerlechat,
* @Date 2022/11/8
*/
@Service
public class UserServiceImpl implements UserService {
// 这里业务层调用持久层的方法
@Autowired
private UserDao userDao;
@Override
public User checklogin(String username, String password) {
return userDao.selectByUsernameAndPassword(username,password);
}
}
Action层
这里我写了两个:
TestAction是没有查数据库(直接显示一下页面看是否成功,单纯的测试页面)
UserAction是查数据库,是一个登录验证的小例子
tips:如果还连不上数据库的话可以先测试TestAction是否可行
TestAction.java
/**
* @Author Tuerlechat,
* @Date 2022/11/8
*/
public class TestAction {
public String execute() {
System.out.println("TestAction类被调用了。"); //处理请求
return "test"; //响应,实现页面跳转
}
}
UserAction.java
/**
* @Author Tuerlechat,
* @Date 2022/11/8
*/
public class UserAction {
@Autowired
private UserService userService;
// 编写两个属性(如果需要接收数据的话,可以使用 struts2 的 ognl 表达式可以直接接收到前端穿过来的数据,不再需要 request.getParameter() 来接收数据)
private String username;
private String password;
// get 方法可以不要, set 方法必须有,不然前端的数据就无法注入进来(当然直接lombok写也可以)
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 = userService.checklogin(username,password); // 登录验证
if ( user!=null ) {
session.put("user",username);
return "success";
} else {
return "error";
}
}
}
前端页面
error.jsp
<%--
Created by IntelliJ IDEA.
User: Tuerlechat,
Date: 2022/11/8
Time: 17:08
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>
<h1>error</h1>
</body>
</html>
index.jsp
<%--
Created by IntelliJ IDEA.
User: Tuerlechat,
Date: 2022/11/8
Time: 17:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h3>欢迎你 ${sessionScope.user} 登录!!</h3>
</body>
</html>
login.jsp
<%--
Created by IntelliJ IDEA.
User: Tuerlechat,
Date: 2022/11/8
Time: 17:08
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="login.action" 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>
test.jsp
<%--
Created by IntelliJ IDEA.
User: Tuerlechat,
Date: 2022/11/8
Time: 19:27
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>
我是test页面,请看控制台打印的信息。
</body>
</html>
然后运行服务器即可
运行结果
访问登录页面
如果你的web.xml与我的一致,那么会直接访问login.jsp,如果没有就自己跳转一下
输入数据库的正确数据然后登录(如果你没有现成的数据库,那么自己建一个一样的数据库结构即可)
可以看见登录成功,并将用户session的值成功存入并显示出来
如果输错了就会跳转到错误页面(这就不演示了,都是一样的)
访问test页面
打开控制台
可以看到输出,说明成功进入了TestAction
完结撒花
到这里一个ssh框架就搭好啦~🥳
一个小注意点(可有可无)
tips:pom.xml中导入spring的版本和applicationContext.xml中的hibernateX要相会一致,否则会报错(比如spring5所以就要设置成hibernate5,spring3所以就要设置成hibernate3)😇