# SpringMVC在三层架构的位置

表现层
表现层
业务层
业务层
持久层
持久层
SpringMVC
SpringMVC
Spring
Spring
MyBatis
MyBatis
浏览器
浏览器
Servlet,控制器
Servlet,控制器
Service,业务逻辑处理
Service,业务逻辑处理
DAO,数据访问层
DAO,数据访问层
数据库
数据库
JavaBean,
数据模型
JavaBean...
JSP,视图
JSP,视图
Service
Service
Dao
Dao
Viewer does not support full SVG 1.1

# SpringMVC基于组件方式执行流程

浏览器
浏览器
前端控制器
DIspatcherServlet
接受用户请求响应
前端控制器DIspatcherServlet...
处理器映射器
HandlerMapping
处理器映射器 HandlerMapping
处理器适配器
HandlerAdapter
执行Handler
处理器适配器HandlerAdapter...
Handler处理器平常也叫做Controller
Handler处理器平常也叫做Controller
1.Request请求
1.Request请求
2.请求查找Handler
2.请求查找Handler
3.返回一个执行链
3.返回一个执行链
4.
请求
适配
器执
4....
5.执行
5.执行
6.返回ModelAndView
6.返回ModelAndView
7.
返回
Modle
And
View
7....
8.
请求
进行
视图
解析
8....
视图解析器
ViewResolver
视图解析器 ViewResolver
视图
jsp
Freemarker
Excel
Pdf
视图jsp...
9.
返回
View
9....
10.
视图渲染
将模型数
据填充到
Request域
10....
11.Response响应
11.Response响应
Viewer does not support full SVG 1.1

# 入门程序编写

要求,通过超链接从一个页面跳转到另一个页面

1.首先需要安装好tomcat,IDEA商业版(破解的jar包内带教程 (opens new window)),maven。

2.在IDEA中创建一个maven版的web项目

此时项目目录结构为

.
├── .idea
├── src
│   └── main
│       └── webapp
│           ├── WEB-INF
│           │   └── web.xml
│           └── index.jsp 
├── target
├── pom.xml
└── SpringMVC.iml 

3.在main目录中创建java文件夹和resources文件夹,在java中可以存放写的业务代码,在resources文件夹中可以存放静态资源文件。

.
├── .idea
├── src
│   ├── main
|   ├── java
|   |   └── cn
|   |       └── demo
|   |           └── controller
|   |               └── Hello.java
|   ├── resources
|   |   └── springmvc.xml
│   └── webapp
│       ├── WEB-INF
|       |   ├── pages
|       |   |   └── success.jsp
│       │   └── web.xml
│       └── index.jsp 
├── target
├── pom.xml
└── SpringMVC.iml 

创建这么多的文件夹与文件

# pom.xml

<!-- 版本统一,在properties标签中添加如下内容-->
<properties>
  <spring.version>5.2.4.RELEASE</spring.version>
</properties>
<!-- 在dependencies添加相应jar包的依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.1</version>
    <scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>

SpringMVC只是Spring的一个模块,还得需要Spring的支持,其次web,mvc,jsp,servlet包都需要加上。

# Hello.java

这是一段简单的业务代码。

@Controller
@RequestMapping(path = "/hello")
public class Hello {
    @RequestMapping(path = "/sayhello")
    public String sayHello() {
        System.out.println("Hello World");
        System.out.println("你好");
        return "success";
    }
}

TIP

@Controller 将Hello类交给Spring管理

@RequestMapping(path = "/hello") 映射路径,可以访问到这个类。

@RequestMapping(path = "/sayhello") 映射路径,可以访问到这个方法。

  • 注解如何生效?

在Spring中如果想使用注解,让Spring管理对象,得需要一个xml得配置项,这里得自己创建。

  • 方法如何被执行?

  • 如何知道有success.jsp?并跳转到它?

这就得需要视图解析器了。

# springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       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/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 开启注解扫描 -->
    <context:component-scan base-package="cn.demo.controller"/>
    <!-- 视图解析器对象-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- 开启SpringMVC注解支持 -->
    <mvc:annotation-driven/>
</beans>

注解扫描,后面的cn.demo.controller是扫描的范围,只有在这个范围内写了注解才能被解析到。

视图解析器,可以找到相应的jsp文件。

# web.xml

看前面的SpringMVC组件执行流程,浏览器首先就应该改和前端控制器打交道,前端控制器也是首脑。入口是Servlet。

<!-- 前端控制器 -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 将xml配置文件加载进来 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- Servlet默认第一次发请求时创建,修改为启动即被创建 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 在任何路径的请求都将被Servlet拦截 -->
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

# index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <h2>首页</h2>
   <a href="hello/sayhello">入门</a>
</body>
</html>

点击入门将触发Hello类中的sayhello方法。

# success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <h3>成功!!!</h3>
</body>
</html>

跳转成功后的页面。

下面配置好tomcat就可以正常运行了。

# 解决IDEA控制台中文乱码

IDEA控制台中,Tomcat打印的log中文是乱码,看到控制台就是UTF-8格式,Tomcat默认也是UTF-8格式,不知道为啥,最后打开Tomcat的安装目录中\conf\logging.properties文件,找到java.util.logging.ConsoleHandler.encoding = UTF-8,将其后面的UTF-8修改为GBK即可。

# 后话

整体的思路就是,在pom.xml中配置好所需要jar包,,然后在web.xml中配置前端控制器(DispatcherServlet),创建业务类,交给Spring管理,注解如何生效?创建Spring的xml配置,通过context:component-scan扫描所在范围内的java文件中的注解,使Spring可以管理这个类,@RequestMapping可以映射到相应的方法使之执行。跳转页面,方法返回一个字符串,视图解析器就可以根据这个字符串找到相应的jsp文件,但是需要指定这个jsp文件在哪里。

# 参考链接

idea tomcat控制台乱码问题,终于解决了 (opens new window)

SpringMVC课程 (opens new window)