【快速搭建系列】idea快速搭建SSH2框架(struts2+spring5+hibernate5)

【快速搭建系列】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)😇

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tuerlechat,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值