📅  最后修改于: 2023-12-03 15:05:16.211000             🧑  作者: Mango
Spring MVC是一个基于MVC(Model-View-Controller)的Web应用程序框架,它使用Spring框架作为应用程序的后端。它提供了一种模块化方法开发Web应用程序。本文将介绍如何使用Spring MVC来实现CRUD(增删改查)操作,以及给出一个示例程序。
CRUD是一种重要的数据库操作,其中包含四个基本操作:创建、读取、更新和删除。在Spring MVC中,CRUD操作通常通过HTTP请求来执行。每个请求都由控制器所处理,将数据传递到指定的处理器方法中。
通过HTTP请求,我们可以向数据库添加新的记录。在Spring MVC中,我们可以通过使用@PostMapping
注解来实现创建操作。以下是一个示例:
@PostMapping(value = "/add")
public ModelAndView addEmployee(@ModelAttribute("employee") Employee employee) {
EmployeeService.addEmployee(employee);
return new ModelAndView("redirect:/");
}
在以上示例中,我们通过@ModelAttribute
来传递员工对象,然后将其添加到数据库中。该操作将返回一个重定向到主页的模型视图。
读取操作是从数据库中检索数据。在Spring MVC中,我们通常使用@GetMapping
注解来实现读取操作。以下是一个示例:
@GetMapping(value = "/edit/{id}")
public ModelAndView editEmployee(@PathVariable("id") int id) {
Employee employee = EmployeeService.getEmployeeById(id);
ModelAndView model = new ModelAndView("employee_form");
model.addObject("employee", employee);
return model;
}
在以上示例中,我们使用@PathVariable
来检索特定的员工记录,并将其传递到employee_form
模板中。该操作将返回一个模型视图,其中包含将要编辑的员工数据。
更新操作是对数据库中现有记录的修改。在Spring MVC中,我们通常使用@PostMapping
注解来实现更新操作。以下是一个示例:
@PostMapping(value = "/edit")
public ModelAndView updateEmployee(@ModelAttribute("employee") Employee employee) {
EmployeeService.updateEmployee(employee);
return new ModelAndView("redirect:/");
}
在以上示例中,我们通过@ModelAttribute
来传递待更新的员工对象。该操作将更新员工记录并返回主页的重定向模型视图。
删除操作是从数据库中删除现有记录。在Spring MVC中,我们通常使用@GetMapping
注解来实现删除操作。以下是一个示例:
@GetMapping(value = "/delete/{id}")
public ModelAndView deleteEmployee(@PathVariable("id") int id) {
EmployeeService.deleteEmployee(id);
return new ModelAndView("redirect:/");
}
在以上示例中,我们使用@PathVariable
来检索特定的员工记录,并将其从数据库中删除。该操作将返回主页的重定向模型视图。
接下来,我们将给出一个基于Spring MVC实现的示例程序。该程序将实现一个简单的员工管理系统,用于演示CRUD操作的实现。以下是该示例的要求:
该示例程序使用以下技术:
示例程序的源代码可在GitHub上进行查看和下载。
首先,在Spring MVC中,我们需要先配置一个扫描器来扫描所有的控制器和服务层类。以下是ApplicationContextConfig
类的实现:
@Configuration
@ComponentScan(basePackages = {"com.example.springmvccrudexample"})
@EnableWebMvc
public class ApplicationContextConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
@Bean
public DataSource getDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/employee_db?useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean
public JdbcTemplate getJdbcTemplate() {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(getDataSource());
return jdbcTemplate;
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
在以上示例中,我们配置了视图解析器、资源处理器和数据源。我们还配置了JdbcTemplate
类,该类是Spring框架提供的用于简化JDBC操作的类。
在该示例程序中,我们将使用MySQL数据库。以下为MySQL数据库的表定义:
CREATE DATABASE employee_db;
USE employee_db;
CREATE TABLE employees (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(45) NOT NULL,
department VARCHAR(45) NOT NULL,
salary INT NOT NULL,
PRIMARY KEY (id)
);
接下来,我们需要编写控制器类。在该示例程序中,我们主要需要实现以下业务逻辑:
以下是EmployeeController
类的实现:
@Controller
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@RequestMapping("/")
public ModelAndView home() {
List<Employee> employees = employeeService.listAllEmployees();
ModelAndView model = new ModelAndView("home");
model.addObject("employees", employees);
return model;
}
@RequestMapping("/new")
public ModelAndView newEmployee() {
Employee employee = new Employee();
ModelAndView model = new ModelAndView("employee_form");
model.addObject("employee", employee);
return model;
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView saveEmployee(@ModelAttribute("employee") Employee employee) {
employeeService.save(employee);
return new ModelAndView("redirect:/");
}
@RequestMapping("/edit/{id}")
public ModelAndView editEmployee(@PathVariable(name = "id") int id) {
ModelAndView model = new ModelAndView("employee_form");
Employee employee = employeeService.get(id);
model.addObject("employee", employee);
return model;
}
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
public ModelAndView deleteEmployee(@PathVariable(name = "id") int id) {
employeeService.delete(id);
return new ModelAndView("redirect:/");
}
}
在以上示例中,我们使用了@RequestMapping
注解来定义URL到控制器方法的映射关系。我们使用@ModelAttribute
注解将数据绑定到指定的对象上,并使用@Autowired
注解来注入EmployeeService
类。这样,我们就可以在控制器中使用服务层的方法,来实现CRUD操作。
接下来,我们需要编写服务层类。服务层类的作用是处理业务逻辑,与持久层交互。以下是EmployeeService
类的实现:
@Service
public class EmployeeService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Employee> listAllEmployees() {
String sql = "SELECT * FROM employees";
List<Employee> employees = jdbcTemplate.query(sql, new RowMapper<Employee>() {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
employee.setDepartment(rs.getString("department"));
employee.setSalary(rs.getInt("salary"));
return employee;
}
});
return employees;
}
public void save(Employee employee) {
String sql = "INSERT INTO employees (name, department, salary) VALUES (?, ?, ?)";
jdbcTemplate.update(sql, employee.getName(), employee.getDepartment(), employee.getSalary());
}
public Employee get(int id) {
String sql = "SELECT * FROM employees WHERE id = ?";
Employee employee = jdbcTemplate.queryForObject(sql, new RowMapper<Employee>() {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
employee.setDepartment(rs.getString("department"));
employee.setSalary(rs.getInt("salary"));
return employee;
}
}, id);
return employee;
}
public void update(Employee employee) {
String sql = "UPDATE employees SET name = ?, department = ?, salary = ? WHERE id = ?";
jdbcTemplate.update(sql, employee.getName(), employee.getDepartment(), employee.getSalary(), employee.getId());
}
public void delete(int id) {
String sql = "DELETE FROM employees WHERE id = ?";
jdbcTemplate.update(sql, id);
}
}
在以上示例中,我们使用了@Service
注解来定义该类为一个服务层类。在该类中,我们使用JdbcTemplate
类来与数据库进行交互,以实现CRUD操作。
接下来,我们需要编写视图模板。在该示例程序中,我们使用JSP作为视图模板。以下是home.jsp
模板的实现:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<meta charset="UTF-8">
<title>Employee Management System</title>
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="/SpringMVCCRUDExample/static/css/style.css">
</head>
<body>
<div class="container">
<h1>Employee Management System</h1>
<a href="/SpringMVCCRUDExample/new" class="btn btn-primary mb-3">Add New Employee</a>
<table class="table table-striped">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Department</th>
<th>Salary</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<c:forEach items="${employees}" var="employee">
<tr>
<td>${employee.id}</td>
<td>${employee.name}</td>
<td>${employee.department}</td>
<td>${employee.salary}</td>
<td>
<a href="/SpringMVCCRUDExample/edit/${employee.id}" class="btn btn-primary btn-sm">Edit</a>
<a href="/SpringMVCCRUDExample/delete/${employee.id}" class="btn btn-danger btn-sm">Delete</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
</body>
</html>
在以上示例中,我们使用了Bootstrap框架来设计网页。我们使用了JSTL核心标签库和格式化标签库来显示员工记录。它使用了Controller层定义的URL路径,以便用户在网页上执行CRUD操作。
最后,我们需要打包并部署应用程序。在该示例程序中,我们可以使用Maven来打包。以下是pom.xml
文件的实现:
<groupId>com.example</groupId>
<artifactId>SpringMVCCRUDExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring.version>5.2.7.RELEASE</spring.version>
<jstl.version>1.2</jstl.version>
<mysql.version>8.0.19</mysql.version>
<lombok.version>1.18.10</lombok.version>
<bootstrap.version>4.6.0</bootstrap.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>${bootstrap.version}</version>
</dependency>
</dependencies>
在以上示例中,我们使用了Spring MVC、JSTL、MySQL、Lombok、Bootstrap等技术来实现该示例程序。现在,我们可以打包并运行该示例程序。若干个页面将以网站的形式展示该示例程序的功能。
Spring MVC是一个流行的Web应用程序框架,有助于实现CRUD操作。在该示例程序中,我们学习了如何使用Spring MVC和MySQL数据库来实现一个简单的员工管理系统。我们可以应用这些知识和技术来构建自己的Web应用程序,帮助我们更有效地管理业务。