SpringMVC框架从入门到入土(一):初来乍到认识SpringMVC
-
是基于spring的一个框架,实际上就是spring的一个模块,专门做web开发的。
-
是servlet的一个升级
-
web开发底层是servlet,框架是在servlet基础上加入的一些功能,让做web开发更加方便。
-
实际上就是一个spring,是一个容器,创建和管理对象。
-
我们要做的是使用@Controller对象,把对象放进springMVC容器中,把创建的对象作为控制器使用,这个控制器对象可以接收用户的请求,可以显示处理结果,当作一个servlet来使用。
-
使用@Controller注解创建的是一个普通类对象,不是servlet,springmvc赋予了控制器对象一些额外的功能。
-
web的开发底层是servlet,springmvc中有一个对象,DispatherServlet
DispatherServlet:负责接收用户的所有请求,用户把所有的请求给了DispatherServlet,之后DispatherServlet把请求转发给Controller对象,最后是Controller处理请求。
Web开发步骤
需求:用户在页面发起一个请求,请求交给springmvc的控制器对象,并显示请求处理的结果。
实现步骤:
- 新建web的maven工程
- 加入依赖(spring-webmvc依赖,间接吧spring依赖加入到项目,jsp,servlet)
- 重点:在web.xml文件中注册springmvc框架的核心对象DispatherServlet
- DispatherServlet叫做中央调度器,是一个servlet,父类是集成HttpServlet
- DispatherServlet页叫做前端控制器(front controller)
- DispatherServlet负责接收用户提交的请求,调用其他的控制器对象,并把请求的处理结果显示给用户。
- 创建一个发起请求的页面,index.jsp
- 创建控制器类
- 在类上面加入@Controller注解,创建对象,并放入到springmvc的容器中
- 在类的方法上面加入@RequestMapping注解
- 创建一个结果jsp,显示处理请求结果
- 创建springmvc的配置文件(和spring的配置文件一样)
- 声明组件扫描器。指定@Controller注解所在的包
- 声明视图解析器,帮助处理视图
程序实现部分代码:
- 依赖项
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--springmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 请求页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>请求页面</title>
</head>
<body>
<h1>第一个springmvc的请求页面</h1>
<hr/>
<p><a href="some.do">发起请求</a></p>
</body>
</html>
- controller层
package com.liar.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @author liar
* @date 编写时间: 2022/4/9 15:39
* @Controller 创建处理器对象,对象放在spring容器中
* 位置:在类的上面
*/
@Controller(value = "myController")
public class MyController {
/*
* 处理用户的请求,springmvc中是使用方法来处理的
* 方法是自定义的可以有多种返回值,多种参数,方法名称自定义
*/
/**
* 准备使用doSome方法来处理some.do请求
* @RequestMapping: 请求映射,作用是把一个请求和一个方法绑定在一起。一个请求指定一个方法处理
* 属性:1. value 是一个String,表示请求的url地址(some.do),value的值是唯一的,不能重复
* 2. 在使用的时候,推荐地址以“/”
* 位置:1. 在方法的上面,常用的
* 2. 在类的上面
*
* 返回值:ModelAndView 表示本次请求处理的结果
* Model:数据,请求处理完成后,要显示给用户的数据
* View:视图,比如jsp
*/
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
//处理some.do的请求,相当于service调用处理完成了
ModelAndView mv = new ModelAndView();
//添加数据,框架在请求的最后把数据放入到request作用域
mv.addObject("msg","欢迎使用springmvc开发");
mv.addObject("fun","执行的是doSome方法");
//指定视图
mv.setViewName("/show.jsp");
return mv;
}
}
- spring配置文件
<?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">
<!--声明组件扫描器-->
<context:component-scan base-package="com.liar.controller"/>
</beans>
- 结果页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>结果页面</title>
</head>
<body>
<h3>show.jsp从request作用域获取数据</h3><br/>
<h3>msg数据:${msg}</h3>
<h3>fun数据:${fun}</h3>
</body>
</html>
- 测试结果
程序的部分解释和改进
请求处理过程
-
tomcat启动,创建容器的过程。
通过load-on-start标签指定的1,创建DispatcherServlet对象,它的父类是继承HttpServlet的,被创建的时候执行init()方法
上面创建容器的作用:创建@Controller注解所在的类的对象,创建MyController对象。这个对象放入到springmvc的容器中,容器是map类似map.put()
-
请求处理
- 执行servlet的service方法中的doDispatch()方法
- 在这个方法中会调用MyController的.dosome方法
配置视图解释器
将视图页面存到WEB-INF下面。
在spring配置文件中配置视图解释器:
<!--配置视图解释器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!--后缀:视图文件的拓展名-->
<property name="suffix" value=".jsp"/>
</bean>
代码改进:直接使用文件名
//指定视图
//mv.setViewName("/show.jsp");
//当配置了视图解释器之后,可以使用逻辑名称(文件名),指定视图
//框架会使用视图解释器的前缀+逻辑名称+后缀完成路径。其实就是字符串的拼接
mv.setViewName("show");