Spring MVC基础入门与实例分析
发布时间: 2023-12-23 01:31:58 阅读量: 34 订阅数: 23
# 第一章:Spring MVC简介
1.1 Spring MVC是什么
1.2 Spring MVC的特点与优势
1.3 Spring MVC的基本工作原理
### 2. 第二章:Spring MVC环境搭建
2.1 配置开发环境
2.2 创建一个简单的Spring MVC项目
2.3 配置Spring MVC的核心组件
## 3. 第三章:Spring MVC的基本组件
Spring MVC框架是建立在Spring Framework之上的,它提供了一种基于Java的Web开发框架,使得开发者可以轻松地创建Web应用程序。在本章中,我们将深入了解Spring MVC的基本组件,包括控制器的编写与配置、视图解析器、以及基于注解的请求映射。
### 3.1 控制器(Controller)的编写与配置
在Spring MVC中,控制器负责接收用户请求,并根据请求参数调用业务逻辑处理后生成响应。控制器可以通过XML配置、注解或者实现特定接口的方式进行定义。
以下是一个简单的Spring MVC控制器例子,我们将通过注解的方式进行配置:
```java
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
```
在上面的例子中,我们使用`@Controller`注解声明了一个控制器类`HelloController`,并通过`@RequestMapping`注解配置了请求映射。当用户访问`/hello`路径时,将会调用`hello`方法,并将"Hello, Spring MVC!"的信息传递给视图。
### 3.2 视图解析器(View Resolver)
视图解析器负责将控制器返回的逻辑视图名映射为真正的视图资源。在Spring MVC中,可以通过`InternalResourceViewResolver`来配置视图解析器,将逻辑视图名映射为物理视图资源的位置。
```xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
```
在上面的示例中,我们配置了一个`InternalResourceViewResolver`来将逻辑视图名映射为`/WEB-INF/views/`目录下的`.jsp`文件。
### 3.3 基于注解的请求映射
除了使用XML配置外,Spring MVC还提供了基于注解的方式进行请求映射。通过`@RequestMapping`注解,可以将请求URL映射到具体的控制器方法上,从而简化了URL与处理方法之间的对应关系。
```java
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String listUsers(Model model) {
// 获取用户列表并传递给视图
return "userList";
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getUser(@PathVariable("id") int userId, Model model) {
// 根据用户ID获取用户信息并传递给视图
return "userInfo";
}
}
```
在上面的示例中,我们使用了`@RequestMapping`注解将`/user/list`和`/user/{id}`路径分别映射到`listUsers`和`getUser`方法上,从而实现了基于注解的请求映射。
### 4. 第四章:Spring MVC与前端交互
Spring MVC 提供了强大的支持来处理与前端的交互,包括表单处理与数据绑定、数据校验与处理以及 RESTful 风格的请求处理。本章将介绍如何利用 Spring MVC 实现与前端的交互,以及一些常见的技术和实践。
#### 4.1 表单处理与数据绑定
在 Web 开发中,表单处理和数据绑定是非常常见的需求。Spring MVC 提供了数据绑定的支持,可以将表单提交的数据直接绑定到后端的 Java 对象上,极大地简化了数据处理的流程。
##### 场景
假设我们有一个简单的用户注册表单,包括用户名和密码,我们希望将表单提交的数据绑定到后端的 User 对象上。
##### 代码示例
```java
@Controller
public class UserController {
@RequestMapping("/register")
public String showRegisterForm(Model model) {
model.addAttribute("user", new User());
return "register";
}
@RequestMapping(value = "/doRegister", method = RequestMethod.POST)
public String doRegister(@ModelAttribute("user") User user) {
// 处理用户注册逻辑,user 对象已经被自动绑定
return "success";
}
}
```
```jsp
<!-- register.jsp -->
<form action="doRegister" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="Register" />
</form>
```
##### 代码总结
- `@ModelAttribute` 注解可以将表单提交的数据绑定到指定的对象上。
- 在 JSP 页面中,我们使用 `<form>` 标签提交数据,Spring MVC 会自动将数据绑定到 `@ModelAttribute` 注解指定的对象上。
##### 结果说明
用户可以通过注册页面输入用户名和密码,提交表单后,数据会被自动绑定到后端的 User 对象上,简化了数据处理的流程。
#### 4.2 数据校验与处理
数据校验是 Web 开发中必不可少的一环。Spring MVC 提供了强大的数据校验和处理功能,能够帮助我们轻松地校验表单提交的数据,并进行相应的处理。
##### 场景
在用户注册过程中,我们需要校验用户名和密码的合法性,确保数据的完整性和正确性。
##### 代码示例
```java
@Controller
public class UserController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("id");
binder.setValidator(new UserValidator());
}
@RequestMapping("/register")
public String showRegisterForm(Model model) {
model.addAttribute("user", new User());
return "register";
}
@RequestMapping(value = "/doRegister", method = RequestMethod.POST)
public String doRegister(@Valid @ModelAttribute("user") User user, BindingResult result) {
if (result.hasErrors()) {
return "register";
}
// 处理用户注册逻辑
return "success";
}
}
```
```java
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if (user.getUsername().length() < 5) {
errors.rejectValue("username", "username.short", "Username is too short");
}
// 其他数据校验逻辑
}
}
```
##### 代码总结
- `@InitBinder` 注解可以用来初始化数据绑定器,包括设置不允许绑定的字段和设置数据验证器。
- 数据验证器必须实现 `Validator` 接口,通过 `@Valid` 注解标记需要进行数据校验的对象,在 `BindingResult` 参数中可以获取校验结果。
##### 结果说明
在用户注册时,用户名长度不满足要求时,提交表单会触发校验错误,页面会提示用户名过短。
#### 4.3 RESTful风格的请求处理
RESTful 风格的请求处理是一种优雅的 URL 设计方案,能够使我们的接口更加直观和易用。Spring MVC 提供了良好的支持来处理 RESTful 风格的请求。
##### 场景
我们希望设计一套用户管理系统的 RESTful 接口,包括用户列表查询、用户信息获取、用户信息修改和用户信息删除。
##### 代码示例
```java
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable long id) {
return userService.getUserById(id);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable long id, @RequestBody User user) {
userService.updateUser(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable long id) {
userService.deleteUser(id);
}
}
```
##### 代码总结
- 使用 `@RestController` 注解标识该类为 RESTful 接口处理类。
- 使用 `@RequestMapping` 注解指定 URL 路径。
- 使用 `@GetMapping`、`@PutMapping`、`@DeleteMapping` 注解指定不同的 HTTP 方法。
##### 结果说明
通过设计符合 RESTful 风格的接口,可以使用户管理系统的接口更直观和易用,便于前后端的开发和交互。
### 5. 第五章:Spring MVC的拦截器与过滤器
在本章中,我们将学习如何在Spring MVC中使用拦截器与过滤器来实现请求的预处理、后处理以及过滤功能。通过拦截器与过滤器,我们可以对请求进行权限验证、日志记录、字符编码处理等操作,从而实现更加灵活、高效的请求处理与控制。
#### 5.1 编写与配置拦截器
拦截器(Interceptor)是Spring MVC框架提供的一种强大的机制,可以在请求处理的各个阶段进行拦截与处理。其主要作用是在请求处理之前进行预处理,请求处理之后进行后处理,从而实现对请求的控制与增强。
##### 5.1.1 编写拦截器类
```java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行拦截处理
// 可以进行权限验证、日志记录等操作
return true; // 返回true表示继续执行请求,返回false表示终止执行请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理之后进行后处理
// 可以对返回的数据进行处理或包装
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在请求完成之后进行资源清理操作
}
}
```
##### 5.1.2 配置拦截器
```xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/admin/**"/> <!-- 配置拦截的路径 -->
<bean class="com.example.MyInterceptor"/> <!-- 配置拦截器类 -->
</mvc:interceptor>
</mvc:interceptors>
```
#### 5.2 使用过滤器进行请求处理
过滤器(Filter)是Servlet规范中的一种组件,可以在请求的前后进行过滤与处理。Spring MVC框架允许我们在web.xml中配置过滤器,并与Spring容器进行整合,实现对请求的统一处理。
##### 5.2.1 编写过滤器类
```java
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器初始化操作
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤处理操作,可以在请求处理前后进行操作
chain.doFilter(request, response); // 调用链中的下一个过滤器或目标资源(servlet或JSP页面)
}
@Override
public void destroy() {
// 过滤器销毁操作
}
}
```
##### 5.2.2 配置过滤器
```xml
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/admin/*</url-pattern> <!-- 配置过滤的路径 -->
</filter-mapping>
```
通过以上方式,我们可以在Spring MVC中灵活地使用拦截器与过滤器来实现对请求的预处理、后处理以及过滤操作,从而更好地控制请求的流程与处理。
### 6. 第六章:实例分析
在本章中,我们将通过构建一个简单的用户管理系统来演示Spring MVC的基本用法。我们将会实现用户列表展示、用户添加、用户删除和用户编辑功能,并且使用Spring MVC进行RESTful风格的接口设计。
#### 6.1 构建一个简单的用户管理系统
首先,我们需要创建一个用户实体类,包括用户的ID、姓名和年龄属性,并编写DAO层接口和Service层接口来实现对用户信息的增删改查操作。
```java
// User.java
public class User {
private Long id;
private String name;
private int age;
// 省略getter和setter方法
}
// UserDao.java
public interface UserDao {
User findById(Long id);
void save(User user);
void update(User user);
void delete(Long id);
List<User> findAll();
}
// UserService.java
public interface UserService {
User findById(Long id);
void addUser(User user);
void updateUser(User user);
void deleteUser(Long id);
List<User> getAllUsers();
}
```
#### 6.2 实现用户列表展示与增删改查功能
接下来,我们需要编写Controller层的代码,实现用户管理系统的页面展示和相应的请求处理。
```java
// UserController.java
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public String userList(Model model) {
List<User> userList = userService.getAllUsers();
model.addAttribute("users", userList);
return "userList";
}
@GetMapping("/add")
public String addUserForm(Model model) {
model.addAttribute("user", new User());
return "addUser";
}
@PostMapping("/add")
public String addUserSubmit(@ModelAttribute User user) {
userService.addUser(user);
return "redirect:/user/list";
}
@GetMapping("/delete/{id}")
public String deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return "redirect:/user/list";
}
@GetMapping("/edit/{id}")
public String editUserForm(@PathVariable Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "editUser";
}
@PostMapping("/edit/{id}")
public String editUserSubmit(@PathVariable Long id, @ModelAttribute User user) {
user.setId(id);
userService.updateUser(user);
return "redirect:/user/list";
}
}
```
#### 6.3 使用Spring MVC进行RESTful风格的接口设计
为了实现RESTful风格的接口设计,我们可以使用@RestController注解。
```java
// RestfulUserController.java
@RestController
@RequestMapping("/api/user")
public class RestfulUserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.updateUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
@GetMapping("/all")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
}
```
0
0