1. 程式人生 > >SpringMVC工作原理(含案例圖解)

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類

@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>