1293 字
6 分钟
SpringMVC开发指南
SpringMVC 完整开发指南
目录
1. 项目环境搭建
1.1 开发环境准备
- JDK 1.8+
- Maven 3.6+
- IDE(推荐使用IntelliJ IDEA)
- MySQL 5.7+
1.2 创建Maven项目
首先创建一个标准的Maven Web项目,在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>com.example</groupId> <artifactId>springmvc-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <spring.version>5.3.20</spring.version> <mybatis.version>3.5.9</mybatis.version> <mysql.version>8.0.28</mysql.version> <jackson.version>2.13.3</jackson.version> </properties> <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring JDBC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- JSON支持 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </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> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
1.3 项目目录结构
创建以下目录结构:
src/main/ ├── java/ │ └── com/example/ │ ├── config/ # 配置类 │ ├── controller/ # 控制器 │ ├── dao/ # 数据访问层 │ ├── model/ # 实体类 │ └── service/ # 服务层 ├── resources/ │ ├── mapper/ # MyBatis映射文件 │ ├── application.properties # 应用配置 │ └── logback.xml # 日志配置 └── webapp/ └── WEB-INF/ └── web.xml # Web应用配置
2. SpringMVC基础配置
2.1 Web.xml配置
在webapp/WEB-INF/web.xml
中配置SpringMVC的核心servlet:
<?xml version="1.0" encoding="UTF-8"?> <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_4_0.xsd" version="4.0"> <!-- Spring MVC前端控制器 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</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>
2.2 Spring MVC配置文件
创建resources/spring-mvc.xml
:
<?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:mvc="http://www.springframework.org/schema/mvc" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 开启注解扫描 --> <context:component-scan base-package="com.example"/> <!-- 开启SpringMVC注解驱动 --> <mvc:annotation-driven> <mvc:message-converters> <!-- JSON转换器 --> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> </mvc:message-converters> </mvc:annotation-driven> <!-- 静态资源处理 --> <mvc:resources mapping="/static/**" location="/static/"/> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
3. MyBatis整合
3.1 数据库配置
创建resources/application.properties
:
# 数据库配置 jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=root # MyBatis配置 mybatis.typeAliasesPackage=com.example.model mybatis.mapperLocations=classpath:mapper/*.xml
3.2 Spring-MyBatis整合配置
创建resources/spring-mybatis.xml
:
<?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"> <!-- 加载properties文件 --> <context:property-placeholder location="classpath:application.properties"/> <!-- 数据源配置 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- SqlSessionFactory配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="${mybatis.typeAliasesPackage}"/> <property name="mapperLocations" value="${mybatis.mapperLocations}"/> </bean> <!-- Mapper扫描配置 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
3.3 实体类示例
创建User.java
:
package com.example.model; public class User { private Long id; private String username; private String email; private String password; // getter和setter方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3.4 Mapper接口
创建UserMapper.java
:
package com.example.dao; import com.example.model.User; import org.apache.ibatis.annotations.*; import java.util.List; public interface UserMapper { @Select("SELECT * FROM users") List<User> findAll(); @Select("SELECT * FROM users WHERE id = #{id}") User findById(@Param("id") Long id); @Insert("INSERT INTO users(username, email, password) VALUES(#{username}, #{email}, #{password})") @Options(useGeneratedKeys = true, keyProperty = "id") void insert(User user); @Update("UPDATE users SET username=#{username}, email=#{email}, password=#{password} WHERE id=#{id}") void update(User user); @Delete("DELETE FROM users WHERE id = #{id}") void delete(@Param("id") Long id); }
3.5 Service层
创建UserService.java
:
package com.example.service; import com.example.model.User; import java.util.List; public interface UserService { List<User> findAll(); User findById(Long id); void create(User user); void update(User user); void delete(Long id); }
实现类UserServiceImpl.java
:
package com.example.service.impl; import com.example.dao.UserMapper; import com.example.model.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> findAll() { return userMapper.findAll(); } @Override public User findById(Long id) { return userMapper.findById(id); } @Override public void create(User user) { userMapper.insert(user); } @Override public void update(User user) { userMapper.update(user); } @Override public void delete(Long id) { userMapper.delete(id); } }
4. RESTful API设计与实现
4.1 响应对象封装
创建统一的响应对象Result.java
:
package com.example.model; public class Result<T> { private int code; private String message; private T data; public Result(int code, String message, T data) { this.code = code; this.message = message; this.data = data; } public static <T> Result<T> success(T data) { return new Result<>(200, "Success", data); } public static <T> Result<T> error(int code, String message) { return new Result<>(code, message, null); } // getter和setter方法 public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
4.2 异常处理
创建全局异常处理器GlobalExceptionHandler.java
:
package com.example.config; import com.example.model.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public Result<String> handleException(Exception e) { return Result.error(500, e.getMessage()); } @ExceptionHandler(RuntimeException.class) public Result<String> handleRuntimeException(RuntimeException e) { return Result.error(400, e.getMessage()); } }
4.3 RESTful Controller实现
创建UserController.java
:
package com.example.controller; import com.example.model.Result; import com.example.model.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping public Result<List<User>> findAll() { List<User> users = userService.findAll(); return Result.success(users); } @GetMapping("/{id}") public Result<User> findById(@PathVariable Long id) { User user = userService.findById(id); if (user == null) { return Result.error(404, "User not found"); } return Result.success(user); } @PostMapping public Result<User> create(@RequestBody User user) { userService.create(user); return Result.success(user); } @PutMapping("/{id}") public Result<User> update(@PathVariable Long id, @RequestBody User user) { user.setId(id); userService.update(user); return Result.success(user); } @DeleteMapping("/{id}") public Result<Void> delete(@PathVariable Long id) { userService.delete(id); return Result.success(null); } }
4.4 跨域配置
创建CorsConfig.java
:
package com.example.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .maxAge(3600); } }
4.5 数据库脚本
创建数据库表:
CREATE DATABASE demo; USE demo; CREATE TABLE users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
4.6 接口测试
使用Postman或curl测试API:
- 创建用户
curl -X POST http://localhost:8080/api/users \ -H "Content-Type: application/json" \ -d '{ "username": "john", "email": "john@example.com", "password": "123456" }'
- 查询用户列表
curl -X GET http://localhost:8080/api/users
- 查询单个用户
curl -X GET http://localhost:8080/api/users/1
- 更新用户
curl -X PUT http://localhost:8080/api/users/1 \ -H "Content-Type: application/json" \ -d '{ "username": "john_updated", "email": "john_updated@example.com", "password": "654321" }'
- 删除用户
curl -X DELETE http://localhost:8080/api/users/1