搜索 K
Appearance
博客正在加载中...
Appearance
我们用 SpringMVC,完成一个实际的案例
有一个 index.jsp 页面,上面有个超链接;
当点击超链接时,会发送一个请求,我们定义一个 Servlet,处理该请求;然后转发到成功页面。
我们分两步完成:

新建一个 Maven 的项目,使用的骨架是 webapp,这里我创建一个叫 LearnSpringMVC 的项目;相关源码已上传到 GitHub 和 Gitee 上。
使用该骨架,默认目录结构是不全的,我们得创建一个 java 目录:
这里我们统一使用 5.0.2 的版本,因此配置了一个属性 spring.version,然后在依赖中使用该属性
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>要使用 SpringMVC,第一件事就是配置前端控制器,其实就是一个 Servlet,由 SpringMVC 提供的。
我们在 web.xml 中这样配置:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> 简单来说,就是任何请求都先经过前端控制器,由控制权负责统一的分发调度
我们使用 SpringMVC 框架,也是需要一个配置文件的,我们创建一个 springmvc.xml:
文件的内容:这里我们加上一些约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
</beans>
此时我们基本上搭建好了环境,我们做了如下事情
接下来我们先试着部署下,我们新建一个运行配置:
选择 Tomcat 服务器:

然后在配置底部点击修复:

在弹框中选择第一个

并且我们设置路径为根路径:

在 SpringMVC 中,用来处理请求的叫控制器类。 我们新建一个控制器类,并新建一个方法(SpringMVC 是用方法来处理请求的)
package com.peterjxl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping(path = "/hello")
public String sayHello() {
System.out.println("Hello, World!");
return "success";
}
}代码说明:
@Controller 的作用是告诉 SpringMVC,这是一个控制器;@RequestMapping 则是配置路径的,当访问 /hello 时会执行该方法要让一个方法执行,首先得创建一个对象;而我们是学过 Spring 的,我们可以将这个类交给 IoC 来管理,此时我们创建的配置文件就起作用了,我们在 springmvc.xml 中配置要扫描的包:
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.peterjxl"/>
我们创建的这个 springmvc.xml 配置文件,如何让 SpringMVC 框架加载呢?如果不加载的话,我们就无法创建这个容器,并读取里面的配置,然后扫描包里的类,创建对象;
此时我们可以在 web.xml 中加载这个配置文件,我们添加一个初始化参数的配置(第 4 ~ 7 行):
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> 这个 init-param 的配置是指,给 DispatcherServlet 这个类的属性 contextConfigLocation 赋值,值是 springmvc.xml。然后控制器类,就可以帮我们加载配置文件了
然后我们配置 load-on-startup 参数,表明服务器一启动,就加载配置文件。
我们在 WEB-INF 目录下,新建一个目录 pages,然后新建一个 success.jsp:这个文件用来当作请求成功后的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>入门成功</h1>
</body>
</html>
之前我们说过,控制器类的方法中,返回的字符串,SpringMVC 会当成是一个 JSP 文件的名字,那么去何处寻找这个文件呢?此时我们就可以用 SpringMVC 的视图解析器,我们在 springmvc.xml 中配置:
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/> <!-- 前缀,可以理解为是文件的目录 -->
<property name="suffix" value=".jsp"/> <!-- 后缀,可以理解为是文件后缀名 -->
</bean>当我们这样配置后,SpringMVC 就知道会去哪个目录寻找文件,并且拼接文件名+文件后缀,然后返回文件。
然后我们就可以在 index.jsp 中,加上超链接了:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="hello">入门程序</a>
</body>
</html>
我们访问 localhost: 8080(其实默认就会寻找 index.jsp 页面然后访问),然后点击超链接,可以看到能成功调整,并且 IDEA 控制台有打印 Hello, World!,因此我们的需求完成了。

经过这么多的配置,我们总算是成功使用 SpringMVC 做了一个小案例,可能读者会有点晕,因此我们特此梳理一下。
首先我们可以将过程分为两部分:
load-on-startup 参数,并设置为 1,这样在服务器创建的时候,前端控制器就会被创建
首先我们的 index.jsp 页面,会请求 hello 路径;
由于我们配置了前端控制器 DispatcherServlet,该请求首先会交给它处理
DispatcherServlet 可以简单理解为是一个管理员,指挥中心
DispatcherServlet 会首先根据路径,寻找到具体的控制器类sayHello 方法执行,会打印 Hello, World!,然后返回结果 success 给 DispatcherServletDispatcherServlet 会找视图解析器,根据结果找到具体的文件DispatcherServlet 将文件返回给客户端,也就是浏览器,至此,请求完成示意图:

本项目已将源码上传到 GitHub 和 Gitee 上。并且创建了分支 demo1,读者可以通过切换分支来查看本文的示例代码。