SpringMVC入门和控制器

SpringMVC入门和控制器

了解SpringMVC之前需要了解三层架构,三层架构是一种经典的软件设计模式,通过将应用进行分层,来实现应用内部的解耦,提升可扩展性和可维护性。定位:****系统级分层(垂直拆分)。

  • 表现层:处理用户交互、接收参数、展示数据
  • 业务层:处理业务逻辑,(例如用户注册就是一个业务)判断用户是否注册,如果已经注册,则给出异常提示等。
  • 持久层(又名数据访问层):与数据源交互,例如我们之前学的mybatis就是持久层的框架。

这样的三层架构被称为MVC架构,分开来就是三个单词的首字母:Model,View,Controller一种软件设计模式,其核心在于通过数据、界面、控制分离,让代码更清晰。

安装和配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.25.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>

请根据自己的java版本选择适配的依赖版本。

将项目的打包方式设定为war包

1
<packaging>war</packaging>

引入Tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
<path>/</path>
</configuration>
</plugin>

</plugins>
</build>

用类配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
@ComponentScan("com.example.mvc")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 针对前后端不分离的项目,可配置静态资源放行
registry
// 表示所有以/static/开头的请求都会被这个处理器处理
.addResourceHandler("/static/**")
// classpath:/static/表示这些资源位于类路径下的static目录中
.addResourceLocations("classpath:/static/")
// 缓存一年
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
}
}

配置servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {


@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}

@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}

@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}

使用

写一个测试Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/mvc")
@Controller
public class MvcController {
@RequestMapping("/test")
@ResponseBody
public String test() {
System.out.println(1);
return "test";
}

@RequestMapping("/index")
public String index() {
return "/static/index.html";
}
}

测试路径是/mvc/test和/mvc/index

写一个静态界面

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试用例</title>
</head>
<body>
<h1>这是一个测试界面</h1>
<p>测试完毕</p>
</body>
</html>

访问http://localhost:8080/mvc/testhttp://localhost:8080/mvc/index来展示效果

关于控制器注释

Controller即控制器,是处理客户端请求、执行业务逻辑并返回响应的核心组件,是MVC中的C

职责 具体说明
请求接收 接收HTTP请求(GET、POST、PUT、DELETE等)
参数绑定 从请求中提取参数(URL参数、表单数据、JSON、文件等)
业务处理 调用Service层处理业务逻辑
响应构建 返回视图名称、JSON数据、重定向等响应
异常处理 处理请求过程中的异常情况

我们写的每一个控制器都要用@Controller注释标记,才能被Spring容器所管理,然而能够起到相同作用的注释有四个,约定俗成上有不同的适用场景。

  • Controller注解:通常用在控制器上。(非常常用)
  • Service注解:通常用在我们的业务实现类上(非常常用)
  • Repository注解:通常用在持久层上,跟数据库交互的类上(取决于你使用的持久层框架)
  • Indexed注解:通常用在类或方法上(相对较少使用)