SpringMVC基础一(SpringMVC运行原理)

先了解MVC,在JavaWeb基础五中

回忆servlet,在javaweb基础二中。

创建一个web项目:

1、新建maven项目,导入依赖。(junit、springmvc、spring-webmvc、servlet-api、jsp-api、jstl)

XML 复制代码
<groupId>org.example</groupId>
    <artifactId>springmvc</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.25</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

2、配置为web项目:

4、编写servlet类,用来处理用户的请求

java 复制代码
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端参数,前端提交的字段有一个是method
        String method = req.getParameter("method");
        //字段内容是add,则走该语句
        if (method.equals("add")){
            req.getSession().setAttribute("msg","执行了add方法");
        }
        if (method.equals("delete")){
            req.getSession().setAttribute("msg","执行了delete方法");
        }
        //业务逻辑,此处无
        //视图跳转  此处使用了转发
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

5、在web.xml注册

配置tomcat:在前面javaweb基础一

测试:

了解

MVC框架要做的事情

  • 1、将url映射到Java类或java类的方法
  • 2、封装用户提交的数据
  • 3、处理请求-调用相关的业务处理-封装响应数据
  • 4、将响应的数据进行渲染。jsp/html等表示层数据

SpringMVC的特点

  1. 轻量级、简单易学
  2. 高效、基于请求响应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定优先于配置
  5. 功能强大:RESTful、数据验证、格式化、本地化、主题等
  6. 简介灵活

DispatcherServlet作用:是将请求分发到不同的处理器

Spring MVC框架与其他MVC框架一样,以请求为驱动,围绕一个中心Servlet反派请求及提供其他功能,DispatcherServlet是一个实际的Servlet(它继承HttpServlet基类)。

SpringMVC原理

发起请求时被前置的控制器拦截到请求 ,根据请求参数生成代理请求 ,找到请求对应的实际控制器 ,控制器处理请求,创建数据模型,访问数据库 ,将模型响应给中心控制器 ,控制器使用模型与视图渲染视图结果 ,将结果返回给中心控制器,在将结果返回请求者

实现为SpringMVC框架提供的技术。虚线为开发者实现的。

简要分析上述流程:

1、DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心,用户发出请求,DispatcherServlet接收请求并拦截请求。

  • 若请求的url为:http://localhost:8080/SpringMVC/hello
  • http://localhost:8080服务器域名
  • SpringMVC部署在服务器上的web站点。
  • hello表示控制器
  • 综上:url表示请求位于服务器localhost:8080上的S平日那个MVC站点的hello控制器。

2、HandlerMapping为处理器映射,DispatcherServlet调用处理器映射。HandlerMapping根据请求url找出Handler(处理器)。

3、HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如url被查找控制器为:hello。

4、HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

5、HandlerAdapter表示处理器适配器,其按照规定的规则去执行Handler。

6、Handler让具体的Controler执行。

7、Controller让具体的执行信息返回给HandlerAdapter,如ModelAndView。

8、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

9、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

10、视图解析器将解析的逻辑视图名传给DispatcherServlet。

11、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

12、最终视图出现给用户。

上述流程可分为三部分:

搭建SpringMVC

1、新建一个moudle,添加web的支持。

2、确定导入SpringMVC的依赖。

3、配置web.xml,注册DispatcherServlet

XML 复制代码
<!--1、注册DispatcherServlet:这个是SpringMVC的核心,请求分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatcherServlet要绑定SpringMVC的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value><!--寻找当前路径下的配置文件-->
        </init-param>
        <!--启动级别:设置为服务器一启动它就启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>

4、编写Servlet绑定的配置文件。映射器映射到hello,返回helloController类

适配器映射找到HelloController处理

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--处理器映射器HandlerMapping-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器HandlerAdapter-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <bean id="/hello" class="com.serenity.controller.HelloController"/>
</beans>

5、编写Controller类处理具体的业务

java 复制代码
public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        //业务代码
        String result="HelloSpringMVC";
        mv.addObject("msg",result);
        //视图
        mv.setViewName("test");
        return mv;
    }
}

6、返回一个ModelAndView交给视图解析器,用户最后能看见的页面就是视图解析器拼接的页面。

XML 复制代码
<!--视图解析器ViewResolver-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--prefix:前置 suffix:后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

测试:

总结:web.xml配置文件:

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">
    <!--1、注册DispatcherServlet:这个是SpringMVC的核心,请求分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatcherServlet要绑定SpringMVC的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value><!--寻找当前路径下的配置文件-->
        </init-param>
        <!--启动级别:设置为服务器一启动它就启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--springMVC中:
    /:只匹配所有的请求,不会去匹配jsp页面
    /*:只匹配所有的请求,会去匹配jsp页面,如下方会变为hello.jsp.jsp-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--关联一个springmvc的配置文件-->
</web-app>

springmvc-servlet配置文件:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--处理器映射器HandlerMapping-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器HandlerAdapter-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器ViewResolver-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--prefix:前置 suffix:后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="/hello" class="com.serenity.controller.HelloController"/>
</beans>

注意:执行该项目时,若出现404错误若jar包都存在,则添加lib依赖:

将包全部导入:

使用注解更改

新建一个子项目,配置web.xml文件。

注意:

  • web.xml版本问题。
  • 注册DispatcherServlet
  • 关联SpringMVC的配置文件
  • 映射路径为/
XML 复制代码
<!--1、注册DispatcherServlet:这个是SpringMVC的核心,请求分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatcherServlet要绑定SpringMVC的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value><!--寻找当前路径下的配置文件-->
        </init-param>
        <!--启动级别:设置为服务器一启动它就启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--springMVC中:
    /:只匹配所有的请求,不会去匹配jsp页面
    /*:只匹配所有的请求,会去匹配jsp页面,如下方会变为hello.jsp.jsp-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--关联一个springmvc的配置文件-->

配置资源文件spingmvc-servlet.xml:

XML 复制代码
<?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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
    <context:component-scan base-package="com.serenity.controller"/>
    <!--让SpringMVC不处理静态资源  .css .js .html .mp4 .mp4-->
    <mvc:default-servlet-handler/>
    <!--支持MVC注解驱动:在Sping中一般采用@RequestMapping注解来完成映射关系,要想使@QequestMapping注解生效
    必须向上下文中注册@DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例
    这两个实例分别在类级别和方法级别处理。
    annotation-driven配置帮助我们自动完成上述两个实例的注入-->
    <mvc:annotation-driven/>
    <!--视图解析器ViewResolver-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--prefix:前置 suffix:后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

在视图解析器中我们把所有的视图存放在/WEB-INF/目录下,这样可以保证视图的安全,因为这个目录下的文件,客户端不能访问。

创建Controller

java 复制代码
/*使用注解,可以不用去手动bean*/
@Controller
public class HelloController {
    //真实访问地址:项目名/hello
    @RequestMapping("/hello")
    public String hello(Model model){
        //封装数据  通过model添加键值对
        model.addAttribute("msg","Hello,SpringMVCAnnotation");
        return "hello";//会被视图解析器处理,//WEB_INF/jsp/hello.jsp
    }
}
  • @Controller是为了让SpringIOC容器初始化时自动扫描到。
  • @RequestMapping是为了映射请求路径,这里因为只有方法上有映射所以访问时应该是/hello。类上也可以用,类上使用后需要加上类上的映射请求。
  • 方法中声明Model类型的参数是为了把Action中的数据带到视图中。
  • 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成了WEB-INF/jsp/hello.jsp

创建视图层:

实验步骤总结:

  1. 新建一个web项目。
  2. 导入相关jar包。
  3. 编写web.xml,注册DispatcherServlet
  4. 编写springmvc配置文件
  5. 创建对应的控制类,controller
  6. 完善前端视图和controller之间的对应
  7. 测试允许调试。

实验水平MVC必须配置的三大件:

  • 处理器映射器、处理器适配器、视图解析器
  • 通常只需要我们手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可。
相关推荐
一屉大大大花卷40 分钟前
初识Neo4j之入门介绍(一)
数据库·neo4j
周胡杰1 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0011 小时前
navicate如何设置数据库引擎
数据库·mysql
赵渝强老师1 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle
暖暖木头1 小时前
Oracle注释详解
数据库·oracle
neoooo2 小时前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
御控工业物联网2 小时前
御控网关如何实现MQTT、MODBUS、OPCUA、SQL、HTTP之间协议转换
数据库·sql·http
GJCTYU3 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
MicroTech20253 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法
Code季风3 小时前
SQL关键字快速入门:CASE 实现条件逻辑
javascript·数据库·sql