Spring 源码分析(四) ——MVC(三)源码入口

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取10G资料包与项目实战视频资料

随时随地阅读更多技术实战干货,充分利用闲暇时间,请关注源代码社区公众号和技术交流群。

20191017100267\_1.png20191017100267\_2.png

from:https://my.oschina.net/kaywu123/blog/648743

测试代码

框架配置

现在就从 SpringMVC 的网站开发开始。当然,最先是用 Mavan 下载所需的 jar。下面是 pom.xml 配置:

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                                 http://maven.apache.org/maven-v4_0_0.xsd">

      <modelVersion>4.0.0</modelVersion>
      <groupId>com.kay</groupId>
      <artifactId>SpringMVCDome</artifactId>
      <packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
      
      <name>SpringMVCDome Maven Webapp</name>
      <url>http://maven.apache.org</url>

      <dependencies>
        <!-- Compile dependencies -->
        <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>
          <scope>provided</scope>
        </dependency>
        
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>4.2.5.RELEASE</version>
        </dependency>

        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>4.2.5.RELEASE</version>
        </dependency>

        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>4.2.5.RELEASE</version>
        </dependency>

        <!-- test dependencies -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
        </dependency>

        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>4.2.5.RELEASE</version>
          <scope>test</scope>
        </dependency>

        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>
      <build>
        <finalName>SpringMVCDome</finalName>
      </build>

    </project>

下面是代码结构

20191017100267\_3.png

注:开发环境:

编码:UTF-8

工具:IDEA 15.0.3

JDK:JDK 1.8、Java EE 5

开发环境:Maven 3

Web 容器:Tomcat 9

开发技术选型:

MVC 框架:Spring MVC 4.2.5

表现层:JSP

web.xml配置

打开src\main\webapp\WEB-INF\下的 web.xml 文件,对 web.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_3_1.xsd"
                                  version="3.1">

      <display-name>SpringMVCDemo Web Application</display-name>

      <!-- 设置一个 servlet -->
      <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>

      <!-- 配置一个 encodingFilter ,以避免 post 请求中文出现乱码 -->
      <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

    </web-app>

编写 Model 代码

在model包中新建javabean类 IndexController(名称并不固定,可任意取),并修改如下:

    package org.spring.model;

    /**
     * JavaBean UserBean 模板
     *
     * @Author kay
     * @version 1.0
     */
    public class UserBean {

        private String name;
        
        private int age;

        public void setName(String name){
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

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

        public int getAge() {
            return this.age;
        }
    }

编写 Controller 代码

在controller包中新建java类 IndexController(名称并不固定,可任意取),并修改如下:

    package org.spring.controller;

    import org.spring.model.UserBean;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;

    import java.util.ArrayList;
    import java.util.List;

    /**
     * index 页面的控制器,用于处理网站默认页面的请求
     *
     * @Author kay
     * @version 1.0
     */
    @Controller
    public class IndexController {

        @RequestMapping(value = "/",method = RequestMethod.GET)
        public String defaultIndex(ModelMap modelMap){
            List<UserBean> userBeans = new ArrayList<UserBean>();
            UserBean userBeanA = new UserBean();
            UserBean userBeanB = new UserBean();

            userBeanA.setName("zhang");
            userBeanA.setAge(27);
            userBeanB.setName("li");
            userBeanB.setAge(35);

            userBeans.add(userBeanA);
            userBeans.add(userBeanB);
            modelMap.addAttribute("users", userBeans);

            return "index";
        }
    }

xxx-servlet.xml配置

新建该xml文件后,在配置完web.xml后,需在web.xml同级目录下新建 mvc-dispatcher-servlet.xml(-servlet前面是在servlet里面定义的servlet名),如下:

    <?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
                                http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/context
                                http://www.springframework.org/schema/context/spring-context.xsd
                                http://www.springframework.org/schema/mvc
                                http://www.springframework.org/schema/mvc/spring-mvc.xsd">

        <!-- 指明 controller 所在包,并扫描其中的注解 -->
        <context:component-scan base-package="org.spring.controller"/>

        <!-- 静态资源(js、image等)的访问 -->
        <mvc:default-servlet-handler/>

        <!-- 开启注解 -->
        <mvc:annotation-driven/>

        <!-- ViewResolver 视图解析器 -->
        <!-- 用于支持Servlet、JSP视图解析 -->
        <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>

index 页面

我们删除 webapp 目录下的 index.jsp 文件,在WEB-INF目录下新建文件夹pages,再在pages目录下新建 index.jsp,并修改为如下所示:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <!DOCTYPE html>
    <html lang="zh-CN">
        <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1">

            <title>SpringMVC Demo Home</title>
        </head>

        <body>
            <h3>This is SpringMVC Demo Home</h3>
            <c:forEach items="${users}" var="user">
                <c:out value="${user.name}"/><br/>
                <c:out value="${user.age}"/><br/>
            </c:forEach>
        </body>
    </html>

测试运行

这样,说明配置完成。这里总结一下其相关机制:首先,浏览器访问 localhost:8080,后台controller拦截该请求,进行相应的处理(此处无),在跳转到视图 index.jsp进行显示。此后,将会进行详细的介绍。

20191017100267\_4.png

源码入口

对于 Spring MVC 功能实现的分析,我们首先从 web.xml 开始,在 web.xml 文件中我们配置的是从 DispatcherServlet 开始的。

      <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>

接下来,我们的分析就从 DispatcherServlet 开始。

——水门(2016年3月写于武汉)

欢迎关注个人公众号:dyh297890152,个人微信:guyun297890152,畅聊人生,交流技术,传递正能量,让青春因梦想而疯狂。

20191017100267\_5.png


来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring 源码分析(四) ——MVC(三)源码入口

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏