参考视频:SpringMVC教程,SpringMVC从零到精通,老杜SpringMVC,动力节点SpringMVC
1. 引入相关依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| <?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.muyoukule</groupId> <artifactId>ssm-annotation</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging>
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.1.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>6.1.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.15</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.3.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.22</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring6</artifactId> <version>3.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </dependency> </dependencies>
</project>
|
2. SSM整合
创建项目结构
1.1 Spring整合MyBatis
1.1.1 编写jdbc.properties
在类根路径下创建属性配置文件,配置连接数据库的信息:jdbc.properties
1 2 3 4
| jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring_db?useUnicode=true&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=root
|
1.1.2 编写DataSourceConfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class DataSourceConfig {
@Value("${jdbc.driver}") private String driver;
@Value("${jdbc.url}") private String url;
@Value("${jdbc.username}") private String username;
@Value("${jdbc.password}") private String password;
@Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
|
1.1.3 编写MyBatisConfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.muyoukule.config;
import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MyBatisConfig {
@Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.muyoukule.bean"); return sqlSessionFactoryBean; }
@Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.muyoukule.dao"); return msc; }
}
|
1.1.4 编写SpringConfig
1 2 3 4 5 6
| @Configuration @ComponentScan({"com.muyoukule.service"}) @PropertySource("classpath:jdbc.properties") @Import({DataSourceConfig.class, MyBatisConfig.class}) public class SpringConfig { }
|
1.2 Spring整合Spring MVC
1.2.1 编写WebAppInitializer(web.xml)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; }
@Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; }
@Override protected String[] getServletMappings() { return new String[]{"/"}; }
@Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceResponseEncoding(true); characterEncodingFilter.setForceRequestEncoding(true); HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter}; } }
|
1.2.2 编写SpringMvcConfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| @Configuration @ComponentScan("com.muyoukule.handler") @EnableWebMvc public class SpringMvcConfig implements WebMvcConfigurer {
@Bean public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(springTemplateEngine); resolver.setCharacterEncoding("UTF-8"); resolver.setOrder(1); return resolver; }
@Bean public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(iTemplateResolver); return templateEngine; }
@Bean public ITemplateResolver templateResolver(ApplicationContext applicationContext) { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setApplicationContext(applicationContext); resolver.setPrefix("/WEB-INF/thymeleaf/"); resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); resolver.setCacheable(false); return resolver; }
@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }
@Override public void addViewControllers(ViewControllerRegistry registry) { }
@Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { }
@Override public void addInterceptors(InterceptorRegistry registry) { } }
|
1.3 添加事务控制
1、在SpringConfig中开启事务管理器
1 2 3
| @EnableTransactionManagement public class SpringConfig { }
|
2、在DataSourceConfig中添加事务管理器对象
1 2 3 4 5 6
| @Bean public PlatformTransactionManager platformTransactionManager(DataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; }
|
3、在service类上添加如下注解:
1 2
| @Transactional public class UserService {}
|
3. 实现功能测试ssm整合
3.1 数据库表
tbl_user:
3.2 pojo类编写
1 2 3 4 5 6 7 8 9
| @Data @NoArgsConstructor @AllArgsConstructor public class User { private Long id; private String name; private Integer age; private String email; }
|
3.3 dao编写
1 2 3 4
| public interface UserDao { @Select("select * from tbl_user where id = #{id}") User selectById(Long id); }
|
3.4 service编写
1 2 3
| public interface UserService { public User getById(Long id); }
|
1 2 3 4 5 6 7 8 9 10
| @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao;
@Override public User getById(Long id) { return userDao.selectById(id); } }
|
3.5 handler编写
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController @RequestMapping("/users") public class UserHandler {
@Autowired private UserService userService;
@GetMapping("/{id}") public User detail(@PathVariable("id") Long id) { return userService.getById(id); } }
|
3.6 前端发送ajax
1、引入js文件
2、开启静态资源处理
1 2 3 4
| @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }
|
3、视图控制器
1 2 3
| public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); }
|
4、编写index.html页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ssm整合</title> <script th:src="@{/static/js/vue3.4.21.js}"></script> <script th:src="@{/static/js/axios.min.js}"></script> </head> <body> <div id="app"> <button @click="getMessage">查看id=1的用户信息</button> <h1>{{message}}</h1> </div> <script th:inline="javascript"> Vue.createApp({ data() { return { message: '' } }, methods: { async getMessage() { let response = await axios.get([[@{/}]] + 'users/1') this.message = response.data } } }).mount("#app") </script> </body> </html>
|
5、测试结果: