目录
1.Spring MVC的基本介绍
2.大致分析SpringMVC工作流程
3.SpringMVC的快速入门
首先大家先自行配置一个Tomcat
文件的配置
配置 WEB-INF/web.xml
创建web/login.jsp
创建com.ygd.web.UserServlet控制类
创建src下的applicationContext.xml文件
重点的注意事项和说明
!!!看看如果DispatcherServlet如果没在web.xml中指定Spring的上下文配置文件的路径。是如何去默认找到对应的xml文件的。
1.Spring MVC的基本介绍
1. SpringMVC 是 WEB 层框架【老读 : SpringMVC 接管了 Web 层组件 , 比如控制器 , 视 图 , 视图解析 , 返回给用户的数据格式 , 同时支持 MVC 的开发模式 / 开发架构】2. SpringMVC 通过注解,让 POJO 成为控制器,不需要继承类或者实现接口3. SpringMVC 采用低耦合的组件设计方式,具有更好扩展和灵活性 .4. 支持 REST 格式的 URL 请求 .5. SpringMVC 是基于 Spring 的 , 也就是 SpringMVC 是在 Spring 基础上的。 SpringMVC 的核 心包 spring-webmvc-xx.jar 和 spring-web-xx.jar
SpringMVC和SpringBoot的关系
1. Spring MVC 只是 Spring 处理 WEB 层请求的一个模块 / 组件 , Spring MVC 的基石是Servlet[Java WEB]2. Spring Boot 是为了简化开发者的使用 , 推出的封神框架 ( 约定优于配置,简化了 Spring的配置流程 ), SpringBoot 包含很多组件 / 框架, Spring 就是最核心的内容之一,也包含 Spring MVC3. 他们的关系大概是 : Spring Boot > Spring > Spring MVC
2.大致分析SpringMVC工作流程
1:浏览器会发出url请求通过Tomcat中间键发送给后端。被前端控制器(DispatcherServlet)首先拦截。
2:调用处理器映射器(HandlerMapping)。
3:处理器映射器会返回处理器执行器链(HandlerExecutionChain) 其中包含多个拦截器,以及处理器(Handler)(在下面的案例中Handler是UserServlet)。
4:前端控制器根据返回的处理器执行器链,调用处理器适配器(HandlerAdaptor)。
5:处理适配器才会去调用Handler处理器(Controller)
6: 调用处理器后返回ModelAndView(数据和视图)。
7:当ModelAndView返回给前端处理器后,前端处理器调用我们配置的视图解析器(InternalResourceViewResolver).
8:通过视图解析器返回view视图给前端控制器
9:前端控制器首先会进行一个视图的渲染(也就是对Jsp视图进行一些数据的加载啥的)
10:最后将真正的视图相应返回给客户端。
3.SpringMVC的快速入门
进入登录界面后,登录显示登陆成功的信息!
分析流程:
首先大家先自行配置一个Tomcat
文件的配置
导入SpringMVC需要的jar包
配置 WEB-INF/web.xml
1.配置前端控制器DispatcherServlet(包括初始化Spring上下文文件)
2.
<?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">
<!--配置前端控制器/中央处理器/分发控制器
1.用户的请求会经过他的处理
-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置属性 contextConfigLocation,用来指定DispatcherServlet 去操作的Spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-mvc.xml</param-value>
</init-param>
<!--在web项目启动时,就会自动的加载DispatcherServlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!--1. 在这里面我们配置的url-pattern是/,表示用户的请求都经过DispatcherServlet(中央处理器)
2. 这样的配置也是rest风格的url请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
创建web/login.jsp
注意在JavaWeb中学的工程路径
在填写action="login"表示的url是http://localhost:8080/springmvc/login
如果我填写action="/login"表示的url是http://localhost:8080/login
<%--
Created by IntelliJ IDEA.
User: Administrator :ygd
Date: 2024/11/19
Time: 23:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h3>登录界面</h3>
<%-- 注意在JavaWeb中学的工程路径
在填写action="login"表示的url是http://localhost:8080/springmvc/login
如果我填写action="/login"表示的url是http://localhost:8080/login
--%>
<form action="login">
u:<input name="username" type="text"><br/>
p:<input name="password" type="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
创建com.ygd.web.UserServlet控制类
1.这个UserServlet相当于Hander处理器,是用来决定将返回的信息返回到哪里的(要结合视图解析器)
2.JavaWeb之前是Jsp页面的东西给Servlet处理,然后Servlet重定向或者请求转发到其他的Jsp界面或者Servlet中
3.现在这个内容交给中中央控制器,和视图解析器完成。
package com.ygd.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author ygd
* 1.如果我们使用了SpringMVC框架,在一个类上表明@Controller
* 2.表示该类视为一个控制器,注入到容器中
* 3.比原生的servlet开发要简化很多
*/
@Controller
public class UserServlet {
//编写方法,相应用户的请求
//1.login()方法是用于响应用户的登录请求
//2.@RequestMapping(value="/login")类似我们在原生的Servlet配置的url-pattern
//3.当用户在浏览器输入http://localhost:8080/web工程路径/login能够访问到login()方法
//4.return "login_ok";表示返回结果给视图解析器(InternalResourceViewResolver)
// 视图解析器会根据配置,来决定跳转到那个页面。
// <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
// <property name="prefix" value="/WEB-INF/pages/"/>
// <property name="suffix" value=".jsp"/>
// </bean>
// 这个方法返回给视图解析器时,视图解析器会返回给/WEB-INF/pages/login_ok.jsp的页面
@RequestMapping(value="/login")
public String login(){
System.out.println("login ok");
return "login_ok";
}
}
创建src下的applicationContext.xml文件
1. 在Spring的上下文文件中,配置了InternalResourceViewResolver(视图解析器)。
2. 每个Servlet要返回到前端Jsp页面的操作都要经过视图解析器。
<?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.ygd.web"/>
<!--配置视图解析器(整个容器中只能有一个视图解析器)-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀和后缀-->
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
执行该文件输入login.jsp跳转到登录界面,点击登录。案例结果完成!
重点的注意事项和说明
1. 这里的 UserServlet 需要注解成@Controller ,我们称为一个 Handler 处理器
2. UserServlet 指定 url 时,还可以这样
3. 关 于 SpringMVC 的 DispatcherServlet 的 配 置 文 件 , 如 果 不 在 web.xml 指 定
applicationContext-mvc.xml, 默认在 /WEB-INF/springDispatcherServlet-servlet.xml 找这
个配置文件【简单看下 DispatcherServlet 的源码】。(推荐使用, 我们做下修改 , 并完成测
试)
下图是原本的项目的路径,以及在前端处理器中初始化属性contextConfigLocation。指定applicationContext路径。
下图就是如果不在web.xml中指定applicationContext.xml的路径。
(因为这个关于Spring的上下文路径是必须要有的)
他会默认去和web.xml一样目录下(也就是/WEB-INF/)去寻找配置的前端处理器中的
<servlet-name>也就是下图的springDispatcherServlet加上-servlet.xml 文件(系统会默认这个xml文件就是Spring的上下文文件)。
如果既没有在web.xml文件中配置applicationContext.xml 又在web.xml的同级目录下,没找到对应的xml文件。就会报500的错误
!!!看看如果DispatcherServlet如果没在web.xml中指定Spring的上下文配置文件的路径。是如何去默认找到对应的xml文件的。
DispatcherServlet的父类FrameworkServlet
绿色字体的意思是:WebApplicationContext命名空间的后缀。如果在上下文中将此类servlet命名为“test”,则servlet使用的命名空间将解析为“test-servlet”+".xml"。
什么意思:就是这里的test就是DispatcherServlet配置的<servlet-name>的名字 然后加上
-servlet.xml 寻找到我们的applicationContext.xml。