学习SpringMVC,除了看视频,写代码之外,还是需要记笔记。可以把重点,知识结构,关键代码,还有一些想法记录下来。以备今后在使用过程中查阅或复习。
学习视频是B站的2020最新SpringMVC教程【IDEA版】-springmvc从入门到精通
文章目录
SpringMVC简介
- SpringMVC,也称为Spring web MVC,是基于spring的一个框架,实际上是spring的一个模块
- 专门做web开发,让web开发更方便
- 可以理解为servlet的升级版,底层是servlet来实现的。
- 本身也是Spring,即也是一个容器,可以创建和管理对象。
- SpringMVC容器中放的是控制器对象
- 使用@Controller注解来创建控制器对象
- @Controller注解创建的对象不是Servlet,但SpringMVC会让其有控制器的功能。能接收用户的请求,显示处理结果。
- 实现方式是
- SpringMVC中有一个servlet对象,DispatcherServlet
- DispatcherServlet负责接收用户的所有请求,并将请求转发给相应的Controller对象,由Controller对象处理主流。
-
index.jsp —> DispatcherServlet(Servlet) (转发或分配) —>Controller对象(@Controller注解创建)
idea实例
实现一个简单需求:用户在网页上发起请求,请求交给springMVC的控制器对象处理,并显示请求处理结果。
实现步骤
- 新建web maven工程
- 加入依赖
- springMVC依赖,间接把spring的依赖都加入
- jsp,servelt依赖
- 重点:在web.xml中注册 springMVC框架的核心对象DispatcherServlet
- DispatcherServlet叫中央调度器,是Servlet,其父类是HttpServlet
- DispatcherServlet也叫前端控制器(front controller)
- DispatcherServlet负责接收用户请求,调用其他的控制器对象,并把请求的处理结果显示给用户(是否采用SpringMVC的标志)
- 创建请求页 index.jsp
- 创建控制器(处理器)类
- 在类的上面加入@Controller注解,创建对象,并放入到SpringMVC容器中
- 在类的方法上面加入@RequestMapping注解
- 创建一个结果页,显示请求处理结果
- 创建SpingMVC的配置文件(spring配置文件一样)
- 声明组件扫描器,指定@Controller注解所在包名
- 声明视图解析器。帮助处理视图。
创建项目
完善目录结构
完整目录结构如下:
修改pom.xml
把jdk版本修改为1.8
<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>
添加依赖
servlet依赖
<!-- 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>
springMVC依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.14</version>
</dependency>
添加的依赖如下:
可以看出,spring的核心依赖也间接被加入。
修改web.xml
提升dtd文件版本
原有的web.xml文件中的dtd版本号有些低,功能有些弱。
可以进行提高。方法如下:
点击工程设置
点击工程结构
删除原有的web.xml
再点击“+”号添加新的web.xml文件
技巧:添加时,文件名为web1.xml文件,然后再在工程目录结构中,再将新添加的web1.xml文件改名为web.xml文件。(因为如果直接取名web.xml文件名,刚修改不会成功,会保持原来web.xml的内容)
修改后,web.xml文件内容如下:
注册DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
该对象是在第一次用户请求时创建对象,但我们希望在Tomcat服务器启动时就创建该对象,因为:
- DispatcherServlet创建时,会同时创建springMVC容器对象
- 并读取springMVC的配置文件,将配置文件中的对象都创建好。
- 方便用户请求时,就可以直接使用这些对象。
- 而且这些操作只会做一次。
- 实现原理是:DispatcherServlet会在初始化时,执行init()方法,在该方法中,实现以下功能:
//创建spring容器,读取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext(“springmvc.xml”);
//把容器对象放入到ServletContext应该域中
getServletContext(key,ctx).;
这样,在后面的处理中,可以从应用域中取到容器对象了。
服务器启动时自动创建DispatcherServlet对象
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--在tomcat启动后,创建Servlet对象
该标签的值表示tomcat启动后创建对象的顺序,整数,值越小,创建时间越早,一般大于等于0的整数
-->
<load-on-startup>1</load-on-startup>
</servlet>
指定springmvc配置文件信息
springMVC创建容器对象时,读取的配置文件默认是/WEB-INF/<servlet-name>-servlet.xml
一般我们可以自定义配置文件的位置
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--springmvc配置文件的位置属性-->
<param-name>contextConfigLocation</param-name>
<!--指定自定义文件的位置,使用类路径,类路径根目录是resources目录-->
<param-value>classpath*:springmvc.xml</param-value>
</init-param>
<!--在tomcat启动后,创建Servlet对象-->
<load-on-startup>1</load-on-startup>
</servlet>
指定自定义文件的位置,使用类路径,类路径根目录是resources目录。
设置url-pattern
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
使用springMVC框架时,url-pattern常使用两种设置:
- 使用扩展名,语法:*.xxxx,其中xxxx为自定义的扩展名,常用的为*.do,*.action,*.mvc等。
表示,只要扩展名为上述,就交由springmvc对象即DispatcherServlet处理
例如:http://localhost:8080/myweb/some.do - 使用斜杠 “/”
这里使用*.do,表示,只要请求的扩展名为.do,则该请求将交由DispatcherServlet处理。即交给SpringMVC框架来处理。
以下对于web.xml的配置,不同项目基本相同,新建项目时,只需要直接复制过去,稍做修改即可。
创建请求页
新建一个jsp页面
命名为index.jsp(将原有的index.jsp文件可以删除,因为缺少一些关于字符集等的申明)。
编写index.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>第一个SpringMVC项目</p>
<p><a href="some.do">发起some.do请求</a></p>
</body>
</html>
这里通过链接来发起一个请求,请求资源为some.do。
创建Controller对象
在com.javaoldman.controller包下面创建MyController类
使用@Controller注解
在MyController类定义的上面使用@Controller注解,用于创建该处理器(Controller)对象,对象会放在springMVC容器中。类似Spring中的@Service,@Compoent注解的作用。
package com.javaoldman.controller;
import org.springframework.stereotype.Controller;
@Controller
public class MyController {
}
处理用户提交的请求
- springMVC使用方法来处理用户提交的请求。
- 方法是自定义的,可以有多种返回值,多种参数,方法名自定义
例如:准备使用doSome方法处理some.do请求
需要使用@RequestMapping注解(请求映射),作用是把一个请求地址和一个方法绑定,一个请求指定一个方法处理。
属性value:
- value 是一个String类型,表求请求的uri地址(本例中是some.do)。
- value值要求唯一,不能重复
- 推荐地址以"/"开头
@RequestMapping注解可以放置于:
- 方法的上面(常用)
- 类的上面
使用@RequestMapping注解的方法叫做处理器方法或控制器方法,用于处理用户请求,功能上类似Servlet中的doGet,doPost。
package com.javaoldman.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){ //功能上类似doGet()
//处理some.do的请求,处理代码这里省略
//处理返回值
ModelAndView mv = new ModelAndView();
//添加ModelAndView数据,原理是框架在请求的最后把数据放入到request域中
//request.setAttribute("msg","欢迎使用SpringMVC");
mv.addObject("msg","欢迎使用SpringMVC");
mv.addObject("fun","执行的是doSome方法");
//指定视图,指定视图的完整路径
//框架对视图执行forward转发操作,request.getRequestDispatcher("/show.jsp").forward(...)
mv.setViewName("/show.jsp");
//返回mv
return mv;
}
}
上面代码中,处理器方法的返回值ModelAndView,表示本次请求的处理结果
- Model:数据,请求处理完成后,要显示给用户的数据
- View:视图,比如jsp等。
在处理器方法中,处理代码执行完后,就是要处理返回值。
我们可以通过ModelAndView对象来添加数据,以及指定显示处理结果的视图(即显示处理结果的页面)。使用ModelAndView的addObject方法可以添加任何Object类型的数据,并通过setViewName方法可以指定视图的完整路径。
框架会在处理器方法返回ModelAndView对象后,自动执行setAttribute方法来为request域添加数据,并将该请求转发到视图。
创建处理结果显示页show.jsp
创建show.jsp文件,并编写代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>show.jsp从request域中获取数据</h2>
<h3>msg:${msg}</h3>
<h3>fun:${fun}</h3>
</body>
</html>
其中${变量名}是jsp语法,用于获取request域中的变量名所指的属性值。
编辑springmvc配置文件
需要在springmvc配置文件中声明组件扫描器,指定@Controller注解所在的包名。
修改springmvc.xml文件
<!--声明组件扫描器-->
<context:component-scan base-package="com.javaoldman.controller"/>
这样,springmvc容器会自动的扫描指定的包,对有@Controller注解的类自动创建对象,该对象将用来处理用户的请求。
相对于DispatcherServlet(front controller),例如MyController类叫做后端控制器(back controller)
配置Tomcat
添加配置
设置服务器参数
注意(小心入坑):由于Tomcat10支持的Servlet包名称为 jakarta.servlet包,不是javax.servlet包。但是现在Spring暂不支持jakarta包名,所以,建议安装Tomcat9版本。
设置web应用发布信息
设置web应用名称
这里将web应用的名称设置为/hello
启动tomcat服务器
查看服务器启动日志
服务器启动成功,web应用发布成功。
测试
打开浏览器,地址栏输入http://localhost:8080/hello/
点击链接
运行成功。点击链接后,用户发起的some.do请求,由于web.xml中设置的servlet映射,会提交给DispatcherServlet处理,进而将请求分配给由@Contorller注解,自动由springMVC容器创建的MyController对象,并通过@RequestMapping请求映射,找到some.do绑定的处理器方法doSome(),并在处理完成请求后,将所需要的参数值绑定到request域中,并通过转发请求,转发到视图show.jsp,最后在视图页中,通过${}标签,获取request域中的数据,并显示出来。
到此,第一个springMVC框架支持的web应用就创建完成。
下一篇:springMVC学习笔记(2),包括三层架构与SSM的关系,springMVC中MVC模式的实现,配置视图解析器。