虽然目前大多数都是使用springboot来开发java程序,或者使用其来为其他端提供接口,而为其他端提供接口,这些功能都是依靠springmvc实现的,所以有必要学习一下spring-mvc,这样才能更好的学习springboot。
一,Hello World
springMvc的第一篇,先来使用springMvc来创建一个项目,把它部署到Tomcat,然后发起请求,在网页上显示Hello World。熟悉一下springMvc的使用。
1,创建Maven项目
创建时选中使用模板创建
2,添加依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springmvc-parent</artifactId><groupId>com.chen</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>01-helloworld</artifactId><packaging>war</packaging><name>01-helloworld Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><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></properties><dependencies><!-- 添加springmvc依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.6</version></dependency><!-- 添加servlet 依赖 --><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0-M1</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies>
</project>
3,配置web.xml
web.xml在项目创建完成时的版本可能太低,需要替换高版本的。
先删除旧的低版本
添加新版本
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--声明springmvc核心配置对象:DispatcherServlet,这是一个servlet这个servlet的url-parttern(映射路径)配置的是:*.do表示以*.do所有的请求都发送给DispatcherServlet这个servlet去处理--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!-- contextConfigLocation 用来指定springmvc配置文件的位置,contextConfigLocation是 DispatcherServlet的一个私有属性--><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- load-on-startup:表示web容器启动的时,当前对象创建的顺序,值越小初始化越早,大于等于0 --><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>
4,添加springmvc配置文件
配置如下:
<?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 https://www.springframework.org/schema/context/spring-context.xsd"><!-- springmvc容器,也就是一个spring容器会扫描指定包中的组件,将其注册到springmvc容器中 --><context:component-scan base-package="com.chen.controller"/>
</beans>
5,创建HelloController
这里的包路径要和springmvc.xml配置的包扫描路径一样。
只有一个hello方法,方法上面添加了一个@RequestMapping 注解,是Springmvc中的一个注解,value属性用来指定一个url列表,springmvc会将这些指定的url请求转发给当前方法处理。
package com.chen.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;/*** @Author @Chenxc* @Date 2024.01.08 15:02*/
@Controller
public class HelloController {/*** @RequestMapping:用来表示url和方法的映射* value属性用来指定一个url列表,springmvc会将这些指定的url请求转发给当前方法处理* @return*/@RequestMapping("/hello")public ModelAndView hello() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("/WEB-INF/view/hello.jsp");return modelAndView;}
}
hello.jsp
<%--Created by IntelliJ IDEA.User: AdministratorDate: 2024.01.08Time: 15:03To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>helloWorld</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
6,部署到tomcat中
启动
启动成功后访问:
http://localhost:8060/hello.do
7,SpringMVC处理器请的过程
1,tomcat启动的时候,会初始化DispatcherServlet,DispatcherServlet中会创建一个springmvc容器,就是我们熟悉的spring容器(ApplicationContext),这个容器的类型是WebApplicationContext,容器会加载web.xml中contextConfigLocation指定的springmvc配置文件。
2,springmvc.xml中指定了扫描包的规则。指定了要扫描的包路径,而HelloController符合这个扫描规则,所以会被注册到springmvc容器中。
3,当发起*.do请求的时候,请求会到达DispatcherServlet中央处理器,中央处理器会根据请求路径,去springmvc容器中找到能够处理这个请求的方法,具体由哪个方法来处理这个请求,这里就是通过@RequestMapping来匹配的,这个注解可以将请求和方法进行映射,匹配的请求会被@RequestMapping标注的方法处理,所以在这个步骤中springmvc容器会发现HelloController这个bean的hello方法方法可以处理/hello.do请求
4,DispatcherServlet中通过反射来调用helloController这个bean的hello方法
5,DispatcherServlet接收到了hello方法的返回值
6,DispatcherServlet根据hello方法的返回值,做跳转操作,相当于
request.getRequestDispatcher(“/WEB-INF/view/hello.jsp”).forward(request,response);