Archetype 是 Maven的模板, 选择 org.apache.maven.archetypes:maven-archetype-webapp
创建好的 maven 项目是下面这样

Spring 和 Hibernate 的版本 :
特别注意 : Spring5 和 Hibernate5 很多地方和4是不一样的, 这里要注意的
依赖版本 :
| 依赖名 | 版本 | 适用范围 | 备注 |
|---|---|---|---|
| junit | 4.13.2 | test | |
| spring-test | 4.3.9.RELEASE | - | |
| hibernate-core | 4.3.11.Final | - | Hibernate核心依赖 |
| spring-context | |||
| spring-context-support | |||
| spring-core | |||
| spring-tx | |||
| spring-beans | |||
| spring-aop | |||
| spring-orm | SpringORM框架依赖 | ||
| mysql-connector-java | 8.0.13 | 根据自己的版本来, 如果是MySQL5, 就使用5.x版本的 | |
| druid | 1.2.13-SNSAPSHOT | 阿里巴巴数据库连接池依赖 | |
xml配置 :
<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.0modelVersion>
<groupId>cn.knightzzgroupId>
<artifactId>mini-spring-hibernateartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<spring.version>4.3.9.RELEASEspring.version>
<hibernate.version>4.3.11.Finalhibernate.version>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>4.3.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-coreartifactId>
<version>${hibernate.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-ormartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.13version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.2.13-SNSAPSHOTversion>
dependency>
dependencies>
project>
整合Spring+Hibernate : 注意和 SpringMVC是和这俩没关系的, 为了防止把自己搞混, 先配置这两个
################### JDBC Configuration ##########################
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssh_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
################### Hibernate Configuration ##########################
#Hibernate方言配置
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#是否显示SQL语句
hibernate.show_sql=true
#是否自动更新表格
hibernate.hbm2ddl.auto=update
#Hibernate缓存统计策略配置
hibernate.generate_statistics=false
#是否使用格式化SQL语句
hibernate.format_sql=false
#在格式化的SQL语句的基础之上加强可读性
hibernate.use_sql_comments=false
################### 以下是Hibernate的c3p0配置 ##########################
#最大连接数
hibernate.c3p0.max_size=20
#最小连接数
hibernate.c3p0.min_size=5
#获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒
hibernate.c3p0.timeout=120
#最大的PreparedStatement的数量
hibernate.c3p0.max_statements=100
#每隔120秒检查连接池里的空闲连接 ,单位是秒
hibernate.c3p0.idle_test_period=120
#当连接池里面的连接用完的时候,C3P0一下获取的新的连接数
hibernate.c3p0.acquire_increment=2
# 每次都验证连接是否可用
hibernate.c3p0.validate=true
这个配置部分我主要分为三个部分 :
首先是第一部分 :
<context:component-scan base-package="cn.knightzz"/>
用于扫描spring的注解, 比如 @Component , @Service 这样的注解
然后是第二部分, Hibernate核心配置 :
首先是数据源 :
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}">
bean>
第一个是用来加载配置文件的, 这样就可以使用 ${jdbc.username} 来获取配置文件
其次是SessionFactory :
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}prop>
<prop key="hibernate.dialect">${hibernate.dialect}prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}prop>
<prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}prop>
<prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}prop>
<prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}prop>
<prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}prop>
<prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}prop>
<prop key="hibernate.c3p0.idle_test_period">${hibernate.c3p0.idle_test_period}prop>
<prop key="hibernate.c3p0.acquire_increment">${hibernate.c3p0.acquire_increment}prop>
<prop key="hibernate.c3p0.validate">${hibernate.c3p0.validate}prop>
props>
property>
<property name="packagesToScan" value="cn.knightzz.entity"/>
bean>
需要注意的有以下几点 :
另外就是, 一般情况下, 我们创建了一个 实体类, 比如 :
package com.southwind.entity;
import lombok.Data;
import java.util.Set;
@Data
public class Account {
private Integer id;
private String name;
private Set<Course> courses;
}
那么我们就需要创建一个对应的 Account.hbm.xml 文件去把实体类和数据库表进性映射 :
DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.southwind.entity.Account" table="t_account">
<id name="id" type="java.lang.Integer">
<column name="id">column>
<generator class="identity">generator>
id>
<property name="name" type="java.lang.String">
<column name="name">column>
property>
<set name="courses" table="account_course">
<key column="aid">key>
<many-to-many class="com.southwind.entity.Course" column="cid">many-to-many>
set>
class>
hibernate-mapping>
然后再 hibernate.cfg.xml 中进行配置
DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
.....
<mapping resource="com/southwind/entity/Orders.hbm.xml">mapping>
<mapping resource="com/southwind/entity/Account.hbm.xml">mapping>
session-factory>
hibernate-configuration>
但是, 为了简化开发, 我们可以使用注解进行映射 :
package cn.knightzz.entity;
import javax.persistence.*;
/**
* @author 王天赐
* @title: Student
* @projectName zjq-codes
* @description:
* @website http://knightzz.cn/
* @github https://github.com/knightzz1998
* @create: 2022-09-15 15:24
*/
@Entity
public class Student {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "id")
private int id;
@Basic
@Column(name = "name")
private String name;
@Basic
@Column(name = "age")
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
注意, 如果实体类名和表名一致(不区分大小写,) 就不需要添加 @Table(name="") 注解去指定表名
然后,我们在配置 sessionFactory时, 添加扫描配置
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}prop>
<prop key="hibernate.dialect">${hibernate.dialect}prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}prop>
<prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}prop>
<prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}prop>
<prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}prop>
<prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}prop>
<prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}prop>
<prop key="hibernate.c3p0.idle_test_period">${hibernate.c3p0.idle_test_period}prop>
<prop key="hibernate.c3p0.acquire_increment">${hibernate.c3p0.acquire_increment}prop>
<prop key="hibernate.c3p0.validate">${hibernate.c3p0.validate}prop>
props>
property>
<property name="packagesToScan" value="cn.knightzz.entity"/>
bean>
最后一行 扫描实体类路径配置
最后部分是 事务的部分 :
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory">
bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
使用bean去注入 sessionFactory, 创建 HibernateTransactionManager 类型的bean的对象, 另外这个配置名id="transactionManager"是默认识别的, 改了就识别不了
完整的配置如下 :
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
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-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<context:component-scan base-package="cn.knightzz"/>
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}">
bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}prop>
<prop key="hibernate.dialect">${hibernate.dialect}prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}prop>
<prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}prop>
<prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}prop>
<prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}prop>
<prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}prop>
<prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}prop>
<prop key="hibernate.c3p0.idle_test_period">${hibernate.c3p0.idle_test_period}prop>
<prop key="hibernate.c3p0.acquire_increment">${hibernate.c3p0.acquire_increment}prop>
<prop key="hibernate.c3p0.validate">${hibernate.c3p0.validate}prop>
props>
property>
<property name="packagesToScan" value="cn.knightzz.entity"/>
bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory">
bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
beans>
DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
session-factory>
hibernate-configuration>
这个里面一般可以配置数据源之类的, 但是在 applicationContext中配置过了,所以不需要配置任何东西
到这里基本上整个项目已经搭建好了
先创建一个 ssh_db 的数据库
create table ssh_db.student
(
id int auto_increment
primary key,
name varchar(255) not null,
age int not null
)
comment 'ssh测试数据库';
然后创建数据库表
先使用 IDEA自带的 DataBase 登陆上, 然后找到 侧边栏有个 Persistence 的功能, 如果找不到就去 IDEA 上方菜单 View -> Tool Windows 找
选中自己的项目, 单击右键, 选择 Generate … -> By DataBase Scheme
如下图所示
按照图上的勾选即可, 因为我们是使用注解的方式去映射实体类, 所以不需要生成 xml 文件
定义具体的方法
package cn.knightzz.dao;
import cn.knightzz.entity.Student;
import java.util.List;
/**
* @author 王天赐
* @title: StudentDao
* @projectName zjq-codes
* @description:
* @website http://knightzz.cn/
* @github https://github.com/knightzz1998
* @create: 2022-09-15 12:04
*/
public interface StudentDao {
public List<Student> findAll();
}
package cn.knightzz.dao.impl;
import cn.knightzz.dao.StudentDao;
import cn.knightzz.entity.Student;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import javax.transaction.Transactional;
import java.util.List;
/**
* @author 王天赐
* @title: StudentDaoImpl
* @projectName zjq-codes
* @description:
* @website http://knightzz.cn/
* @github https://github.com/knightzz1998
* @create: 2022-09-15 12:05
*/
@Repository
@Transactional
public class StudentDaoImpl implements StudentDao {
@Autowired
SessionFactory sessionFactory;
@Override
public List<Student> findAll() {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Student.class);
return criteria.list();
}
}
需要注意的点是 sessionFactory.getCurrentSession().createCriteria(Student.class); 这里后面尽量用 Student.class
添加相关的依赖
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>4.3.9.RELEASEversion>
dependency>
需要注意的是, Spring4 和 Junit4 与 Junit5的使用方式不一样, Junit4的注解使用, Junit5不一定能用
package cn.knightzz.test;
import cn.knightzz.dao.StudentDao;
import cn.knightzz.entity.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 王天赐
* @title: HibernateTest
* @projectName zjq-codes
* @description:
* @website http://knightzz.cn/
* @github https://github.com/knightzz1998
* @create: 2022-09-15 14:30
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class HibernateTest {
@Autowired
SessionFactory sessionFactory;
@Autowired
StudentDao studentDao;
@Test
public void test01() {
System.out.println(sessionFactory);
Session session = sessionFactory.openSession();
System.out.println(session);
Student student = new Student();
student.setAge(13);
student.setId(12);
student.setName("tom");
session.save(student);
// 手动提交事务, 这里和mybatis不一样
session.beginTransaction().commit();
session.close();
}
@Test
public void test02() {
System.out.println(studentDao.findAll());
}
}
注意 , 需要两个配置 :
SpringMVC 和前面两个关系不大! 注意
添加 SpringMVC 使用的依赖
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
<scope>providedscope>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
我们用到的jsp以及el表达式就需要 最后两个依赖
红框部分是我们需要创建或者修改的文件, 我们首先创建一个 spring-mvc.xml 的文件, 可以空着 , 以及 pages 下面的一些列的文件夹或者目录
web.xml 中的配置主要分为以下几个部分 :
首先是 DispacherServelet , 这个东西的作用是让原本应该是Servlet处理的请求, 把它拦截下来交给 SpringMVC
<servlet>
<servlet-name>DispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-mvc.xmlparam-value>
init-param>
<load-on-startup>2load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>DispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
除此之外, 还包含了 spring-mvc.xml 这个文件地址的映射
其次是 一些其他的配置,比如 中文处理的配置, applicationContext.xml 地址配置, ContextLoaderListener 的配置 :
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext.xmlparam-value>
context-param>
从上往下 :
最后是 Hibernate的配置 , 这个是要加上的, 具体作用可以找找博客看看, 不加会报错…
<filter>
<filter-name>openSessionInViewfilter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilterfilter-class>
filter>
<filter-mapping>
<filter-name>openSessionInViewfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。 目的是为了实现"Open Session in. 例如: 它允许在事务提交之后延迟加载显示所需要的对象。
spring-mvc 的配置比较简单 :
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="cn.knightzz"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
bean>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
bean>
<mvc:resources mapping="/pages/js/*" location="/pages/js/"/>
<mvc:resources mapping="/pages/css/*" location="/pages/css/"/>
<mvc:resources mapping="/pages/images/*" location="/pages/images/"/>
beans>
有几点需要提到的是 : :
http://localhost:8769/ssh/webapp/ 这个的作用和 http://localhost:8769/ssh/pages/css/student.css 会被 匹配到 webapp/pages/csspackage cn.knightzz.controller;
import cn.knightzz.dao.StudentDao;
import cn.knightzz.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
* @author 王天赐
* @title: StudentController
* @projectName zjq-codes
* @description:
* @website http://knightzz.cn/
* @github https://github.com/knightzz1998
* @create: 2022-09-15 18:24
*/
@Controller
public class StudentController {
@Autowired
StudentDao studentDao;
@RequestMapping("/student")
public ModelAndView findAll() {
ModelAndView mav = new ModelAndView();
List<Student> students = studentDao.findAll();
mav.addObject("students", students);
mav.setViewName("student");
return mav;
}
}
controller 部分很简单, 需要注意的是, 跳转页面有很多方法, 比如 使用 ModelAndView, 或者使用 Model , 或者其他的方法等等
<%--
Created by IntelliJ IDEA.
User: knight'z'z
Date: 2022/9/15
Time: 18:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- jstl 标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
学生
学生管理系统
添加
编号
姓名
年龄
${student.id}
${student.name}
${student.age}
修改 删除
需要注意的点有一些 :
引入js或者css的时候 rel 别忘了, 不然不显示
要使用 ${pageContext.request.contextPath} 这个其实相当于你发起了一次请求 , 等价于
student.css :
.title {
color: rebeccapurple;
font-size: 100px;
}
Hello World!
Student
点击 Student 即可跳转
所有的文件目录结构
全部配置完成以后, 点击 上方 Run 菜单, 添加配置
注意选的是 Tomact Server , 不是 Tomact EE Server