SpringMVC工作原理(含案例图解)

SpringMVC工作原理(含案例图解)SpimgMVC工作原理第1步:浏览器发送指定的请求都会交给DispatcherServlet,他会委托其他模块进行真正的业务和数据处理第2步:DispatcherServlet会查找到HandleMapping,根据浏览器的请求找到对应的Controller,并将请求交给目标Controller第3步:目标Controller处理完业务后,返回一个ModelAndView给Dispa…

大家好,又见面了,我是你们的朋友全栈君。

SpimgMVC工作原理

第1步:浏览器发送指定的请求都会交给DispatcherServlet,他会委托其他模块进行真正的业务和数据处理
第2步:DispatcherServlet会查找到HandleMapping,根据浏览器的请求找到对应的Controller,并将请求交给目标Controller
第3步:目标Controller处理完业务后,返回一个ModelAndView给DispatcherServlet
第4步:DispatcherServlet通过ViewResolver视图解析器找到对应的视图对象View
第5步:视图对象View负责渲染,并返回到浏览器

案例分析

下面通过案例图解的方式理解下上面的工作原理

第1步-浏览器请求

这里写图片描述


第2、3步-找到对应Controller

这里写图片描述


第4、5步-解析视图对象,返回浏览器

这里写图片描述


浏览器结果

这里写图片描述

源码

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
    <display-name>springmvc</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <!-- spring入口 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 项目启动时,就加载并实例化 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- 拦截所有不包括jsp的请求 -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

</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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

        <!-- springmvc注解驱动 -->
        <mvc:annotation-driven></mvc:annotation-driven>

        <!-- 开启注解扫描 -->
        <context:component-scan base-package="cn.itcast.controller"></context:component-scan>

        <!-- 配置试图解析器 prefix:指定试图所在目录 suffix:指定视图的后缀名 例如:prifex="/WEB-INF/jsp/",suffix=".jsp",当viewname="test"时,跳转到/WEB-INF/jsp/test.jsp页面 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
</beans>

UserControll类

@Controller
@RequestMapping("user")
public class UserController { 
   
    @RequestMapping("findAllUsers")
    public ModelAndView findAllUsers() {
        ModelAndView mv = new ModelAndView();
        ArrayList<User> users = new ArrayList<User>();
        for (int i = 0; i < 5; i++) {
            User user = new User();
            user.setUsername("zs" + i);
            user.setAge(20 + i);
            user.setIncome(16000.0+i*100);
            user.setIsMarry(false);
            user.setHobby(new String[] { "篮球"+i, "足球"+i });
            users.add(user);
        }
        mv.addObject("users", users);
        mv.setViewName("users");
        return mv;
    }
}

实体类


public class User implements Serializable { 
   

    /** * */
    private static final long serialVersionUID = 1L;

    private String username;
    private Integer age;
    private Boolean isMarry;
    private Double income;
    private String[] hobby;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getIsMarry() {
        return isMarry;
    }

    public void setIsMarry(Boolean isMarry) {
        this.isMarry = isMarry;
    }

    public Double getIncome() {
        return income;
    }

    public void setIncome(Double income) {
        this.income = income;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", age=" + age + ", isMarry=" + isMarry + ", income=" + income
                + ", hobby=" + Arrays.toString(hobby) + "]";
    }

}

JSP页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <link rel="stylesheet" type="text/css" href="/css/user.css" /> </head> <body> <table id="customers"> <tr> <th>用户名</th> <th>年龄</th> <th>收入</th> <th>婚姻状态</th> <th>兴趣爱好</th> </tr> <!-- 遍历后台传递的集合数据 --> <c:forEach items="${users}" var="user"> <tr> <td>${user.username}</td> <td>${user.age}</td> <td>${user.income}</td> <!-- 判婚姻状态 --> <td><c:choose> <c:when test="${user.isMarry}">已婚</c:when> <c:otherwise>未婚</c:otherwise> </c:choose> </td> <td> <!-- 再次遍历用户爱好 --> <c:forEach items="${user.hobby}" var="hobby" varStatus="status"> ${hobby} <!-- 如果不是最后一个爱好,则加上逗号,否则就不加 --> <c:if test="${!status.last}">,</c:if> </c:forEach> </td> </tr> </c:forEach> </table> </body> </html>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146412.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript 设计模式之组合模式

    JavaScript 设计模式之组合模式引我们知道地球和一些其他行星围绕着太阳旋转,也知道在一个原子中,有许多电子围绕着原子核旋转。我曾经想象,我们的太阳系也许是一个更大世界里的一个原子,地球只是围绕着太阳原子的一个电子。而我身上的每个原子又是一个星系,原子核就是这个星系中的恒星,电子是围绕着恒星旋转的行星。一个电子中也许还包含了另一个宇宙,虽然这个宇宙还不能被显微镜看到,但我相信它的存在。也许这个想法有些异想天开,但在程序设计中,…

    2022年7月12日
    15
  • hdu 2058_HAL248

    hdu 2058_HAL248ThesumproblemTimeLimit:5000/1000MS(Java/Others)  MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):24299  AcceptedSubmission(s):7247ProblemDescriptionGivenas

    2022年10月2日
    0
  • 数据库查询优化的一般步骤_sql创建数据库失败

    数据库查询优化的一般步骤_sql创建数据库失败长按识别下方二维码,即可"关注"公众号每天早晨,干货准时奉上!0、序言本文我们来谈谈项目中常用的20条MySQL优化方法,效率至少提高3倍!具体如下:1、使⽤…

    2022年8月21日
    5
  • spring事件监听(eventListener)

    spring事件监听(eventListener)原理:观察者模式#spring的事件监听有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作。事件#事件类需要继承ApplicationEvent,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12…

    2025年6月11日
    0
  • 【数据结构与算法】深入浅出递归和迭代的通用转换思想[通俗易懂]

    【数据结构与算法】深入浅出递归和迭代的通用转换思想[通俗易懂]递归和递归的深入浅出一般来说,能用迭代的地方就不要用递归!理论上讲,所有的递归和迭代之间都能相互转换!(一)何为迭代?首先我们来看下面这段简单的代码:intsum(intn){intsum=0;for(inti=1;i<=n;i++)sum+=n;//求解1~n的和returnsum;}从上述例子中,从1一直加到n,每一次的和都

    2022年6月5日
    34
  • JAVA 使用Dom4j 解析XML

    JAVA 使用Dom4j 解析XML解析XML的方式有很多,本文介绍使用dom4j解析xml文件

    2022年6月21日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号