zoukankan      html  css  js  c++  java
  • SpringMVC工作原理(含案例图解)

    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>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    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;
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    实体类

    
    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) + "]";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    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://blog.csdn.net/u010452388/article/details/80930609
  • 相关阅读:
    JavaWeb---总结(七)HttpServletResponse对象(一)
    JavaWeb---总结(八)HttpServletResponse对象(二)
    JavaWeb---总结(九)通过Servlet生成验证码图片
    hdu 1102(最小生成树)
    poj 2002(好题 链式hash+已知正方形两点求另外两点)
    hdu 2461(AC) & poj 3695(TLE)(离散化+矩形并)
    poj 1389(离散化+计算几何)
    poj 1151(离散化+矩形面积并)
    hdu 3264(枚举+二分+圆的公共面积)
    poj 2546(两圆公共面积)
  • 原文地址:https://www.cnblogs.com/coder-ahao/p/14225780.html
Copyright © 2011-2022 走看看