摘要:本文学习了如何在Spring框架中整合SpringMVC框架。
环境
Windows 10 企业版 LTSC 21H2
MySQL 5.7.40
Java 1.8
Tomcat 8.5.50
Maven 3.6.3
Spring 5.2.25.RELEASE
1 概述
分工:
- Spring是核心容器,负责对象管理、依赖注入、事务控制等核心功能。
- SpringMVC是基于Spring的MVC框架,负责请求接收、参数解析、视图跳转等视图层功能。
整合后可以让Web容器中的Controller对象能够直接使用核心容器中的Service对象,实现分层开发的解耦。
2 目录结构
目录结构如下:
code1 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
| demo-ss/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/ │ │ │ ├── initializer/ │ │ │ │ └── WebInitializer.java │ │ │ ├── config/ │ │ │ │ ├── RootConfig.java │ │ │ │ └── WebConfig.java │ │ │ ├── entity/ │ │ │ │ └── User.java │ │ │ ├── dao/ │ │ │ │ └── UserDao.java │ │ │ ├── service/ │ │ │ │ └── UserService.java │ │ │ └── controller/ │ │ │ └── UserController.java │ │ ├── resources/ │ │ │ └── jdbc.properties │ │ └── webapp/ │ │ ├── static/ │ │ │ └── js/ │ │ │ └── jquery.min.js │ │ ├── WEB-INF/ │ │ │ └── views/ │ │ │ └── user.jsp │ │ └── index.jsp └── pom.xml
|
3 创建配置文件
创建Maven项目,并创建pom.xml文件:
pom.xml1 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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId> <artifactId>demo-spring-springmvc</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging>
<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> </properties>
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.25.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.25.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.25.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <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> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.13.Final</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.3</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project>
|
创建jdbc.properties文件:
jdbc.properties1 2 3 4
| jdbc.driverClass=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=GMT%2B8 jdbc.username=root jdbc.password=123456
|
4 创建配置类
创建Web初始化器:
java1 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
| public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { RootConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] {WebConfig.class}; } @Override protected String[] getServletMappings() { return new String[] {"/"}; } @Override protected Filter[] getServletFilters() { CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter(); encodingFilter.setEncoding("UTF-8"); encodingFilter.setForceEncoding(true); return new Filter[] {encodingFilter}; } }
|
创建根容器配置类:
java1 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
| @Configuration @EnableTransactionManagement @PropertySource("classpath:jdbc.properties") @ComponentScan( basePackages = "com.example", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class) ) public class RootConfig { @Resource private Environment env; @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(env.getProperty("jdbc.driverClass")); dataSource.setUrl(env.getProperty("jdbc.url")); dataSource.setUsername(env.getProperty("jdbc.username")); dataSource.setPassword(env.getProperty("jdbc.password")); return dataSource; } @Bean public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(dataSource()); } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } @Bean public TransactionTemplate transactionTemplate() { return new TransactionTemplate(transactionManager()); } }
|
创建Web容器配置类:
java1 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
| @Configuration @EnableWebMvc @ComponentScan("com.example.controller") public class WebConfig implements WebMvcConfigurer { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); resolver.setContentType("text/html;charset=UTF-8"); return resolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("/static/"); } @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { for (int i = 0; i < converters.size(); i++) { if (converters.get(i) instanceof StringHttpMessageConverter) { StringHttpMessageConverter custom = new StringHttpMessageConverter(StandardCharsets.UTF_8); custom.setWriteAcceptCharset(false); converters.set(i, custom); break; } } } }
|
5 创建业务类
创建User类:
java1 2 3 4 5 6 7
| public class User { private Integer id; private String name; private Integer age; private String email; }
|
创建UserDao类:
java1 2 3 4 5 6 7 8 9
| @Repository public class UserDao { @Resource private JdbcTemplate jdbcTemplate; public List<User> selectUserList() { String sql = "SELECT id, name, age, email FROM user"; return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); } }
|
创建UserService类:
java1 2 3 4 5 6 7 8 9
| @Service @Transactional public class UserService { @Resource private UserDao userDao; public List<User> findUserList() { return userDao.selectUserList(); } }
|
创建UserController类:
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Controller @RequestMapping("/user") public class UserController { @Resource private UserService userService; @GetMapping("/page") public String page() { return "user"; } @GetMapping("/list") @ResponseBody public List<User> list() { return userService.findUserList(); } }
|
6 创建页面
复制3.6.0版本的Jquery文件到项目。
创建欢迎页面:
index.jsp1 2 3 4 5 6 7 8 9 10 11 12 13
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <div> <a href="${pageContext.request.contextPath}/user/page">查看用户列表</a> </div> </body> </html>
|
创建列表页面:
user.jsp1 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
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>用户列表</title> <script src="${pageContext.request.contextPath}/static/js/jquery.min.js"></script> <style> #userTable, #userTable th, #userTable td { border: 1px solid #ddd; border-collapse: collapse; } #userTable th, #userTable td { padding: 8px; text-align: left; } </style> </head> <body> <h2>用户列表</h2> <table id="userTable"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>邮箱</th> </tr> </thead> <tbody id="userTableBody"> </tbody> </table>
<script> $(document).ready(function() { $.ajax({ url: '${pageContext.request.contextPath}/user/list', type: 'GET', dataType: 'json', success: function(users) { var $tbody = $('#userTableBody'); $tbody.empty(); $.each(users, function(index, user) { var row = '<tr>' + '<td>' + user.id + '</td>' + '<td>' + user.name + '</td>' + '<td>' + user.age + '</td>' + '<td>' + user.email + '</td>' + '</tr>'; $tbody.append(row); }); }, error: function(xhr, status, error) { console.error('获取用户列表失败:', error); $tbody.html('<tr><td colspan="3">加载失败,请稍后重试</td></tr>'); } }); }); </script> </body> </html>
|
条