SpringMVC:Java实现的MVC轻量级框架
MVC:模型视图控制器
最典型的mvc架构就是:jsp + service + servlet .
Model2时代演变成mvc架构,
以前是jsp(jsp本身就是servlet)+dao = 视图层 + 模型层
架构一定是演进过来的(ALL in One)
<<淘宝的十年架构>> 淘宝技术这十年架构发展_Apple_Web的博客-CSDN博客
王坚:去IOE化
方便团队开发,java是项目越大,越好开发
特点
约定优于配置
中心控制器DispatchServlet
回顾Servlet
尽量用**add framework support(添加框架支持)**来添加web目录,保证web.xml是最新的
M V VM:ViewModel(双向绑定)
HelloSpringMVC
运行原理
-
客户端发送请求
-
DispatcherServlet(核心控制分发器)根据请求,找到处理器映射器和处理器适配器,让他们去执行一个servlet
-
SpringMVC会调用DispatchServlet的doService(),debug可以看到
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
-
这个servlet实现了Controller,就是一个Controller(控制器)了.
-
实现其中的方法,必须返回一个ModelAndView,相当于告诉DispatcherServlet,去哪个视图,和怎么处理数据.
-
DispatcherServlet找到对应的视图,渲染数据后响应回客户端
spring-webmvc包含了所有spring和springmvc会用到的jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.14</version>
</dependency>
web.xml配置DispatcherServlet及映射
<load-on-startup>1</load-on-startup>的作用
<servlet>
<servlet-name>springmvc</servlet-name>
<!--SpringMVC核心:请求分发器,也是前端控制器-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--上下文配置位置-->
<param-name>contextConfigLocation</param-name>
<!--使用classpath*:这种前缀,则可以代表多个匹配的文件;
**/mapper/mapping/*Mapper.xml,双星号**表示在任意目录下-->
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别:容器是否在启动的时候就加载这个servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
/只匹配所有请求,不匹配jsp页面
/*(会匹配jsp页面,形成死循环)
-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
在spring-servlet.xml中,配置视图适配器和视图解析器,设置前后缀,方便找到页面
<!--处理器映射器和处理器适配器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器
模板引擎:Thymeleaf Freemarker是和vue一起简化前端开发的
先不要去了解
-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!--前后缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--只要是/hello的请求,适配器映射器会自动去找这个servlet类-->
<bean id="/hello" class="com.changGe.li.servlets.HelloSpringMVC" />
servlet类实现Controller的方法,返回一个ModelAndView
package com.changGe.li.servlets;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//只要实现了Controller的类,说明这就是一个控制器了
public class HelloSpringMVC implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//模型和视图
ModelAndView modelAndView = new ModelAndView();
//封装一个对象
modelAndView.addObject("msg","HelloSpringMVC");
//跳转页面
modelAndView.setViewName("hello");
//返回这个对象才会执行
return modelAndView;
}
}
记住一定要把依赖导入进来,不然tomcat报错ClassNotFount
IDEA maven项目部署到tomcat的jar包找不到问题
注意配置maven构建查找resource目录下的资源文件
<build>
<!-- 资源目录 -->
<resources>
<resource>
<!-- 设定主资源目录 -->
<directory>src/main/java</directory>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->
<excludes>
<exclude>**/*.yaml</exclude>
</excludes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->
<!--<targetPath>${build.outputDirectory}</targetPath> -->
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
<filtering>true</filtering>
</resource>
</resources>
</build>