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>

    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类
    实体类
    
    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>
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 排队打水问题
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
    现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)
    Controls 属性与继承 TShape 类的小练习(使用TShape可以解决很多图形问题)
    QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
  • 原文地址:https://www.cnblogs.com/csk001/p/14223877.html
Copyright © 2011-2022 走看看