IEDA使用maven搭建ssh框架步骤详解
闲来无事,在网上跟着教程搭建了一个shh框架,中间也遇到一些头疼的问题,现将我的搭建过程分享一下,并且将中途遇到的问题和解决方法发出来一起探讨一下.
ssh简单介绍:
ssh即spring+struts+hibernate整合,这是一套在ssm(spring+springMVC+mybatis)之前非常流行的企业级开发框架,现在的话用的人比较少,一般是一些比较老的项目在使用.但用不用是一回事,至少得了解一下.
前期准备:
1.java环境(这个没有的可以在网上找一下教程,很简单的)
2.安装IDEA(我使用的是2020版本)
3.安装MySQL数据库(我用的8.0版本)
4.tomcat
建立项目
idea新建一个maven项目,勾选Create from archetype,选择maven-archetype-webapp,点击next。
之前看的教程里面没有这一步,直接使用默认的步骤新建的项目里面没有webapp文件夹,自己新建的话有点麻烦,并且小白的话容易搞错,导致项目无法运行,所以建议按这个步骤来一次
后面两个步骤就是给项目取一个名字,输入项目名直接next。
新建好的项目界面,项目文件夹里已经把webapp文件夹自动弄好了的
编辑pom.xml文件,导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>ssh-demo</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>ssh-demo Maven Webapp</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourcEncoding>UTF_8</project.build.sourcEncoding>
<spring.version>3.1.1.RELEASE</spring.version>
<hibernate.version>3.6.5.Final</hibernate.version>
<struts2.version>2.3.1</struts2.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.1_3</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>
<finalName>ssh_student</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
完善目录结构
使用这种方式创建的项目目录是没有java、和resources文件夹的,我们需要在src/mian目录下创建java文件夹和resources文件夹。
我的idea在新建文件夹的时候会提示需要的java、resources文件夹,直接点击红色框中的文件夹就可以快速创建。有的idea版本不会提示,这里我演示一下使用普通方式创建。
这是我没有点击,直接创建的文件夹,文件夹是灰色的
java文件夹右键点击Mark Directory as -->Sources Root
同理resources文件夹右键点击Mark Directory as -->Resources Root
这样你的java文件夹和resources文件夹就创建好了
在java文件夹下创建com.demo文件夹,在demo文件夹下创建action、service、dao、entity文件夹
action就类似ssm框架中controller,用于接收请求匹配业务,页面跳转等
service就是业务层,处理所有业务
dao就是数据持久层
entity就是存放实体类的地方
这是创建好的目录大致结构
创建applicationContext.xml配置文件
在resources文件夹右键->NEW->XML Configuration File ->Spring Config,文件命名文applicationContext.xml,如果你没有这个选项就直接创建一个普通的applicationContext.xml文件,把我的内容复制进去就行。
新建好的applicationContext文件,如果你的文件前面没有一片绿叶子,那你需要检查一下spring依赖是否导入成功,或者你的命名错误。
创建db.properties文件
这里面存放数据库的连接数据(账号密码等)
在resources文件夹下新建一个普通文件,命名为db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=xxxxxx
jdbc.url=jdbc:mysql://localhost:3306/student?characterEncoding=utf8&rewriteBatchedStatements=true&useUnicode=true
编辑applicationContext.xml
注意这个:黄色标签提示,点击蓝色字体后选择Create new 巴拉巴拉。。。
点击ok
在创建context标签时会提示添加标签,Alt+回车键 选中就行。他会自动添加标签
嫌麻烦可以直接复制下面的,干货走起
<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:property-placeholder location="classpath:db.properties" />
<context:annotation-config/>
<context:component-scan base-package="com.demo.action"/>
<context:component-scan base-package="com.demo.service"/>
<context:component-scan base-package="com.demo.dao" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="maxPoolSize">
<value>50</value>
</property>
<property name="minPoolSize">
<value>5</value>
</property>
<property name="initialPoolSize">
<value>5</value>
</property>
<property name="maxIdleTime">
<value>20</value>
</property>
<property name="maxStatements">
<value>50</value>
</property>
<property name="acquireIncrement">
<value>20</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.autoReconnect">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.demo.entity</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
</beans>
建立一个Database
1.右边侧边栏点击database,点击+号,DataSource,MySQL
输入账号密码、连接的数据库名、测试一下、ok
设计实体类(方法一)
@Data注解可以自动生成get、set等方法,@Column(name = “class”)代表此属性在数据库中对应的字段名为“class”。
package com.kevin.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.Objects;
@Data
@Entity
@Table(name = "user", schema = "student")
public class User {
@Id
@Column(name = "id")
private int id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "name")
private String name;
@Column(name = "class")
private String classId;
@Column(name = "sex")
private String sex;
}
实体类编辑好后会出现一个问题,鼠标点击描红的部分,ALT+回车键,点击Assign Data Source
Data Source栏选择连接的数据库,ok。描红消失
设计实体类(方法二)
View --> IoolWindows --> Persistence 调出Persistence 窗口
File --> Project Structure… --> Modules --> + --> Hibernate -->ok
Persistence窗口中sessionfFactory右键 -->Geberate Per… --> by Database …
这是生成的实体类
个人喜欢使用方法一,看起来整洁一点
编辑数据层(DAO)代码
在dao目录下新建一个接口类(userDao)
package com.kevin.dao;
import com.demo.entity.User;
import java.util.List;
public interface UserDao {
public void add(User user);
public void del(int id);
public void update(User user);
public User getUser(int id);
public List<User> getUserList();
public boolean login(User user);
}
在dao目录下新建一个impl目录,并新建一个userDao的实现类userDaoImpl
package com.kevin.dao.impl;
import com.demo.dao.UserDao;
import com.demo.entity.User;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import javax.annotation.Resource;
import java.util.Iterator;
@Transactional(rollbackFor = Exception.class)
@Repository("UserDao")
public class UserDaoImpl implements UserDao {
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
@Override
public void add(User user) {
sessionFactory.getCurrentSession().save(user);
}
@Override
public void del(int id) {
sessionFactory.getCurrentSession().delete(sessionFactory.getCurrentSession().get(User.class,id));
}
@Override
public void update(User user) {
sessionFactory.getCurrentSession().update(user);
}
@Override
public User getUser(int id) {
return (User)sessionFactory.getCurrentSession().get(User.class,id);
}
@Override
public List<User> getUserList() {
List<User> userList = (List<User>) sessionFactory.getCurrentSession().createQuery("FROM User").list();
return userList;
}
@Override
public boolean login(User user) {
String sql = "FROM User u where u.username = ? and u.password = ?";
Query query = sessionFactory.getCurrentSession().createQuery(sql);
query.setString(0, user.getUsername());
query.setString(1, user.getPassword());
Iterator iterate = query.iterate();
if (iterate.hasNext()){
return true;
}
return false;
}
}
编辑业务层(service)
在service目录下创建userService接口,创建impl文件夹并创建userService的实现类userServiceImpl
package com.kevin.service.impl;
import com.demo.dao.UserDao;
import com.demo.entity.User;
import com.demo.service.UserService;
import org.springframework.stereotype.Repository;
import java.util.List;
import javax.annotation.Resource;
import java.util.ArrayList;
@Repository("UserService")
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public boolean login(User user) {
boolean login = this.userDao.login(user);
return login;
}
@Override
public List<User> getStuList() {
List<User> userList = this.userDao.getUserList();
ArrayList<Object> objects = new ArrayList<>();
return userList;
}
}
编辑action层代码
userAction
package com.demo.action;
import com.demo.entity.User;
import com.demo.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import static com.opensymphony.xwork2.Action.ERROR;
@Controller("userAction")
@Scope("prototype")
public class UserAction {
@Resource
private UserService userService;
private User user;
public User getUser(){
return user;
}
public void setUser(User user){
this.user = user;
}
public String login(){
System.out.println("login收到请求");
if (userService.login(user)){
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("user",user);
return "homePage";
}
return ERROR;
}
public String getStuList(){
List<User> stuList = userService.getStuList();
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("stuList",stuList);
return "stuForm";
}
}
在webapp文件夹下创建jsp文件
index.jsp
<%--
Created by IntelliJ IDEA.
User: 徐文兴
Date: 2022/5/20
Time: 16:44
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="user_login.action" method="post">
<input type="text" name="user.username" placeholder="输入用户名" />
<br/>
<input type="password" name="user.password" placeholder="输入密码" />
<br />
<input type="submit" value="登录">
<input type="reset" value="重置">
</form>
</body>
</html>
homePage.jsp
<%--
Created by IntelliJ IDEA.
User: 徐文兴
Date: 2022/5/20
Time: 16:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<h1>学生管理系统 - 详情页面</h1>
<a href="user_getStuList.action">查看所有学生信息</a>
</head>
<body>
</body>
</html>
stuForm.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.List" %>
<%@ page import="com.demo.entity.User" %>
<%--
Created by IntelliJ IDEA.
User: 徐文兴
Date: 2022/5/20
Time: 16:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<h>学生详细信息</h>
<table border="1"width="80%">
<tr>
<th>学号</th>
<th>姓名</th>
<th>班级</th>
<th>性别</th>
</tr>
<c:forEach var="stu" items="${sessionScope.stuList}">
<tr>
<th>${stu.username}</th>
<th>${stu.name}</th>
<th>${stu.classId}</th>
<th>${stu.sex}</th>
</tr>
</c:forEach>
</table>
</head>
<body>
</body>
</html>
error.jsp
<%--
Created by IntelliJ IDEA.
User: 徐文兴
Date: 2022/5/20
Time: 16:47
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>
创建sturts.xml配置文件
在resources目录下新建sturts.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>
<constant name="struts.devMode" value="false"/>
<constant name="struts.objectFactory" value="spring" />
<package name="user" namespace="/" extends="struts-default">
<action name="user_*" class="userAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="homePage">/homePage.jsp</result>
<result name="stuForm">/stuForm.jsp</result>
</action>
</package>
</struts>
配置web.xml
webapp目录下WEB-INF目录下的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 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">
<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>
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
数据库表信息
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学号、账号',
`password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`class` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '班级',
`sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
`classId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES (1, '2018001', '123456', '老六', '三班', '男', NULL);
INSERT INTO `user` VALUES (2, '2018002', '123456', '老八', '三班', '男', NULL);
INSERT INTO `user` VALUES (3, '2018003', '123456', '狗蛋', '三班', '男', NULL);
INSERT INTO `user` VALUES (4, '2018004', '123456', '二狗', '三班', '男', NULL);
INSERT INTO `user` VALUES (5, '2018005', '123456', '西八', '三班', '女', NULL);
INSERT INTO `user` VALUES (6, '2018006', '123456', '小明', '三班', '女', NULL);
INSERT INTO `user` VALUES (7, '2018007', '123456', '张三', '三班', '男', NULL);
INSERT INTO `user` VALUES (8, '2018008', '123456', '李四', '三班', '男', NULL);
INSERT INTO `user` VALUES (9, '2018009', '123456', '麻子', '三班', '男', NULL);
SET FOREIGN_KEY_CHECKS = 1;
建立tomcat服务器
项目试运行
登录
登录成功
查看所有学生信息
搞定,整合完成。码字不易,各位给点关注,谢谢了
|