虽然目前大多数都是使用springboot来开发java程序,或者使用其来为其他端提供接口,而为其他端提供接口,这些功能都是依靠springmvc实现的,所以有必要学习一下spring-mvc,这样才能更好的学习springboot。
springMvc的第一篇,先来使用springMvc来创建一个项目,把它部署到Tomcat,然后发起请求,在网页上显示Hello World。熟悉一下springMvc的使用。
创建时选中使用模板创建
<?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>
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>
配置如下:
<?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>
这里的包路径要和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: Administrator
Date: 2024.01.08
Time: 15:03
To 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>
启动
启动成功后访问:
http://localhost:8060/hello.do
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);