1.三层架构与MVC模式
三层架构
MVC模式
2.SpringMVC执行流程
3.SpringMVC的基本使用方法
1. 配置
1.1 Maven依赖
首先,在pom.xml
文件中添加Spring MVC的依赖:
<dependencies>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<!-- Servlet API, JSP, and other web dependencies -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- Other dependencies like logging, testing, etc. -->
</dependencies>
1.2 配置DispatcherServlet
在web.xml
中配置DispatcherServlet
,它是Spring MVC的核心组件,用于接收所有的HTTP请求并分发给相应的控制器处理。
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-config.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>
1.3 配置Spring MVC
创建spring-mvc-config.xml
文件来配置Spring MVC的组件扫描、视图解析器等。
<?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"
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">
<!-- 扫描控制器所在的包 -->
<context:component-scan base-package="com.example.controller" />
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
2. 创建控制器
创建一个简单的控制器类,使用@Controller
注解,并定义一个处理GET请求的方法,返回一个逻辑视图名称。
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello"; // 返回逻辑视图名,对应到/WEB-INF/views/hello.jsp
}
}
3. 创建视图
在/WEB-INF/views/
目录下创建一个名为hello.jsp
的JSP页面作为视图,用来展示控制器传递过来的数据。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Hello Page</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
4. 运行应用
启动你的Web容器(例如Tomcat),访问http://localhost:8080/your-app-context/hello
,你应该能看到显示“Hello, Spring MVC!”的消息。
3.SpringMVC请求参数获取
如果不添加@ResponseBody,则会自动把回传的字符串添加前后缀,变成请求jsp
请求参数获取
在Spring MVC中,有多种方式可以获取请求参数:
-
通过方法参数直接绑定:Spring MVC支持将请求参数直接绑定到控制器方法的参数上。对于GET和POST请求中的表单数据,可以使用简单类型的参数或命令对象来接收。
-
使用
@RequestParam
注解:当需要指定请求参数的名字,或者参数是可选的时候,可以使用@RequestParam
注解。它可以用来获取查询字符串参数或表单提交的数据。 -
使用
@PathVariable
注解:当URL模式中包含占位符时,可以使用@PathVariable
注解来提取URL路径中的变量。 -
使用
@RequestBody
注解:如果请求体是以JSON或XML等格式发送的,可以使用@RequestBody
注解将请求体的内容转换成Java对象。 -
使用
@MatrixVariable
注解:用于从URI路径段中获取矩阵变量(matrix variables),这是一种较少用的方式。
数据回传
为了回传数据,我们可以直接返回一个简单的类型(如String、Integer等),或者返回一个复杂对象(如POJO)。当我们想要将Java对象序列化为JSON或XML并将其作为响应体的一部分发送给客户端时,我们应该使用@ResponseBody
注解。
下面是一个详细的示例,展示了如何使用上述概念来获取请求参数,并使用@ResponseBody
来返回数据:
package com.example.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController // 相当于 @Controller + @ResponseBody
@RequestMapping("/api")
public class ExampleController {
// 通过方法参数直接绑定
@GetMapping("/greet/{name}")
public String greet(@PathVariable String name) {
return "Hello, " + name + "!";
}
// 使用@RequestParam获取查询参数
@GetMapping("/search")
public String search(@RequestParam("query") String query) {
return "You searched for: " + query;
}
// 使用@RequestBody处理POST请求体
@PostMapping("/user")
public User createUser(@RequestBody User user) {
// 处理用户创建逻辑
return user; // 返回创建的用户对象
}
// 使用ResponseEntity封装响应
@PutMapping("/user/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
// 假设这里执行了更新操作
user.setId(id);
return new ResponseEntity<>(user, HttpStatus.OK);
}
// 定义一个简单的User类
static class User {
private Long id;
private String name;
// Getters and Setters (省略)
// 必须提供无参构造函数以供Jackson序列化/反序列化使用
public User() {}
// 可选的有参构造函数
public User(Long id, String name) {
this.id = id;
this.name = name;
}
// Getter and Setter methods
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
在这个例子中:
greet
方法使用@PathVariable
来获取URL中的name
参数,并直接返回一个字符串。search
方法使用@RequestParam
来获取查询参数query
,并返回搜索结果。createUser
方法使用@RequestBody
来接受一个JSON格式的用户对象,并返回该对象。updateUser
方法不仅使用了@PathVariable
和@RequestBody
,还使用了ResponseEntity
来封装HTTP响应,包括状态码和响应体。
4.SpringMVC高级用法
拦截器
实现拦截类
配置拦截器
异常处理器
文件上传
静态资源过滤
5.完成流程