以mavenJavaweb项目为例
目录
1.创建项目
进入idea,new project


配置Maven路径:
home path找maven的安装目录;
settings file找maven的conf目录下的settings.xml
Local repository是本地库,找到它的路径,同时它在settings.xml中有配置


2.配置文件
建好的项目如图:

pom.xml文件
管理依赖:
Spring Core & MVC (spring-context, spring-webmvc):提供了IoC容器、AOP、事务管理和MVC框架。
MyBatis (mybatis):核心的ORM框架。
MyBatis-Spring (mybatis-spring):关键的整合包,负责将MyBatis的生命周期融入Spring容器,使得MyBatis的SqlSession和Mapper接口可以由Spring来创建和管理。
MySQL Driver (mysql-connector-java):连接MySQL数据库的必备驱动。
Druid (druid):阿里巴巴出品的高性能数据库连接池。连接池负责管理数据库连接,避免频繁创建和关闭连接带来的性能开销。
Spring JDBC & TX (spring-jdbc, spring-tx):提供了JdbcTemplate和声明式事务管理的支持。
Servlet API (javax.servlet-api):编写Servlet和Web应用的基础API。
AspectJ (aspectjweaver, aspectjrt):提供AOP(面向切面编程)能力,Spring的事务管理就是基于AOP实现的。
<?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>com.qcby</groupId>
<artifactId>SSMDemo1028</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.3.18</spring.version>
<mybatis.version>3.5.9</mybatis.version>
</properties>
<dependencies>
<!-- Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- MyBatis-Spring整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!-- Spring JDBC (包含事务管理) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring TX (事务管理) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.7</version>
</dependency>
</dependencies>
</project>
web.xml
这是Web应用的总入口,它配置了Tomcat应该如何启动和运行应用。
<context-param> 与 ContextLoaderListener:
作用:启动Spring的根Web应用上下文(Root WebApplicationContext)。
流程:当Tomcat启动时,ContextLoaderListener监听器会初始化,读取contextConfigLocation参数指定的ApplicationContext.xml文件,创建一个Spring容器。这个容器主要承载业务层和持久层的Bean(如Service, Dao, 数据源, 事务管理器等)。
DispatcherServlet 与 springmvc.xml:
作用:启动Spring MVC的子应用上下文(Servlet WebApplicationContext),专门用于MVC相关的组件。
流程:当第一个HTTP请求到达时,名为springmvc的DispatcherServlet会初始化,并加载springmvc.xml配置。这个容器是根容器的子容器,可以访问根容器中的Bean,它主要承载表现层的Bean(如Controller, 视图解析器)。DispatcherServlet是所有HTTP请求的前端控制器,负责路由。
CharacterEncodingFilter:
作用:全局字符编码过滤器。
流程:在请求到达DispatcherServlet之前,该过滤器会拦截所有请求(/*),将请求和响应的字符编码强制设置为UTF-8,解决中文乱码问题。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!-- 配置Spring监听器 -->
<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>
<!-- 配置Spring MVC前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 字符编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ApplicationContext.xml
这是Spring框架的核心配置文件,负责管理业务逻辑、数据源和事务。
<context:component-scan base-package="com.qcby.service" />:
告诉Spring去扫描com.qcby.service包及其子包,将所有带有@Component, @Service等注解的类自动创建为Bean并纳入容器管理。
dataSource Bean (DruidDataSource):
配置数据库连接池。这里有一个潜在问题:driverClassName和url的值是硬编码的,通常使用jdbc.properties文件来配置,通过<context:property-placeholder>引入。
sessionFactory Bean (SqlSessionFactoryBean):
这是MyBatis与Spring整合的关键Bean。
它注入了数据源dataSource。
它通过mapperLocations属性指定了MyBatis的SQL映射文件(mapper/*.xml)的位置。
mapperScannerConfigurer Bean (MapperScannerConfigurer):
这是另一个关键整合组件。
它会自动扫描com.qcby.dao包,为其中每一个MyBatis的Mapper接口生成一个实现类的Bean,并将其注册到Spring容器中。这样,就可以在Service中直接使用@Autowired来注入Mapper接口,而无需编写其实现类。
事务配置 (transactionManager, <tx:advice>, <aop:config>)
transactionManager:定义事务管理器,它需要依赖数据源。
<tx:advice>:定义事务的增强 advice,即“事务应该如何运作”。这里配置了以find开头的方法为只读,其他所有方法都使用默认事务。
<aop:config>:定义切面,即“将上述事务增强应用到哪些地方”。这里通过AOP表达式指定,将事务增强应用到com.qcby.service包下所有以ServiceImpl结尾的类的所有公共方法上。
<?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:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--配置文件+注解方式-->
<context:component-scan base-package="com.qcby.service" />
<!--配置druid连接池-->
<!--配置开源连接池 Druid连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///gan_da_shi_zu" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!--Spring框架整合mybatis框架-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<!--注入连接池对象-->
<property name="dataSource" ref="dataSource" />
<!--加载映射配置文件-->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
<!--把dao对象存入到IOC容器中-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="sessionFactory" />
<!--扫码dao所在的包,把包中接口的代码对象存入到IOC容器中-->
<property name="basePackage" value="com.qcby.dao" />
</bean>
<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置事务的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!--配置事务的增强-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(public * com.qcby.service.*ServiceImpl.*(..))" />
</aop:config>
</beans>
jdbc.properties
这是一个键值对属性文件,用于将易变的数据库配置与Spring主配置解耦。
它定义了驱动、URL、用户名和密码。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/322?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root
log4j.properties
用于配置Log4j 1.x版本的日志行为。
它设置了日志的输出目的地(控制台stdout和文件file)。
设置了日志的输出格式 (ConversionPattern)。
设置了日志的级别 (INFO)和特定包(com.xxx.dao)的级别(DEBUG),这在调试MyBatis生成的SQL时非常有用。
设置了日志文件的滚动策略(单个文件最大10MB,最多备份10个)。
# 日志级别
log4j.rootLogger=INFO, stdout, file
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# 文件输出
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/ssm.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# MyBatis日志
log4j.logger.com.xxx.dao=DEBUG
springmvc.xml
这个文件专门配置Web层(MVC)的相关行为。
<context:component-scan base-package="com.qcby.controller">:
专门扫描com.qcby.controller包,将带有@Controller注解的类注册为Web层的Bean。
viewResolver Bean (InternalResourceViewResolver):
视图解析器。当Controller返回一个字符串如"success"时,它会将其解析为具体的物理视图路径:/static/pages/success.jsp。
<mvc:annotation-driven />:
至关重要的配置。它注册了Spring MVC所必需的一系列处理器和适配器,使得@Controller, @RequestMapping, @ResponseBody等注解能够正常工作。它还默认配置了JSON转换(如果Jackson在classpath中)。
(注释掉的)<mvc:resources />:
如果启用,用于处理静态资源(CSS, JS, 图片)。它告诉Spring MVC,对于特定路径的请求(如/css/**)直接到文件系统目录(如/css/)下查找资源,而不要交给Controller处理。
总结:这个文件让Spring MVC能够找到Controller、解析视图,并处理静态资源。
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 扫描controller的注解,别的不扫描 -->
<context:component-scan base-package="com.qcby.controller"></context:component-scan>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- JSP文件所在的目录 -->
<property name="prefix" value="/static/pages/" />
<!-- 文件的后缀名 -->
<property name="suffix" value=".jsp" />
</bean>
<!--静态资源不过滤
<mvc:resources location="/css/" mapping="/css/**" /> -->
<!-- <mvc:resources location="/static/image/" mapping="/images/**" />-->
<!-- <mvc:resources location="/static/js/" mapping="/js/**" />-->
<!-- 开启对SpringMVC注解的支持 -->
<mvc:annotation-driven />
</beans>
3.Java部分
controller:控制器
作用:接收HTTP请求,调用Service,返回响应。
package com.qcby.controller;
import com.qcby.domain.Admin;
import com.qcby.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller // 标记为Spring MVC控制器
@RequestMapping("/admin") // 根路径映射
public class AdminController {
@Autowired // 依赖注入Service
private AdminService adminService;
@RequestMapping("/select") // 具体路径映射:/admin/select
public void select(){
List<Admin> admins = adminService.findAll();
System.out.println("查询逻辑......");
for(Admin ad : admins){
System.out.println(ad); // 在控制台输出
}
}
}
service:业务逻辑接口
作用:定义业务逻辑的方法声明
package com.qcby.service;
import com.qcby.domain.Admin;
import java.util.List;
public interface AdminService {
List<Admin> findAll();
}
serviceImpl:业务逻辑实现类
作用:实现具体的业务逻辑,协调多个DAO操作。
package com.qcby.service.impl;
import com.qcby.dao.AdminDao;
import com.qcby.domain.Admin;
import com.qcby.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service // 正确的注解位置 - 标记为Spring管理的Bean
public class AdminServiceImpl implements AdminService {
@Autowired // 依赖注入 - Spring自动注入AdminDao的实现
private AdminDao adminDao;
@Override
public List<Admin> findAll() {
return adminDao.findAll(); // 直接调用DAO层
}
}
@Service:告诉Spring这个类是业务逻辑组件,要创建Bean并管理
@Autowired自动注入AdminDao的实例(由MyBatis-Spring整合包自动生成)
这里只是简单转发,实际项目中会包含复杂的业务逻辑
dao:数据访问接口
作用:定义数据库操作的方法声明。
这是一个接口,只有方法声明没有实现
MyBatis会通过动态代理自动生成这个接口的实现类
方法名findAll对应Mapper XML文件中的SQL语句ID
package com.qcby.dao;
import com.qcby.domain.Admin;
import java.util.List;
public interface AdminDao {
List<Admin> findAll();
}
domain:实体类,对应数据库中的表结构
package com.qcby.domain;
public class Admin {
private String name;
private String password;
public Admin(String name, String password) {
this.name = name;
this.password = password;
}
public Admin(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "admin{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}

4.Jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<body>
<h2><%= "Hello World!" %></h2>
<button id="select">查询</button>
</body>
<script>
$(document).ready(function(){
$("#select").click(function(){
$.ajax({
url:"admin/select",
type:"get",
success:function(){
console.log("查询成功")
},
error:function(){
console.log("查询失败")
}
})
})
})
</script>
</html>
这里就是简单接了按钮和绑定了事件,调用select接口,只是打印到了控制台:


8613

被折叠的 条评论
为什么被折叠?



