zoukankan      html  css  js  c++  java
  • 第一个SpringMVC实例和解析(HelloSpringMVC)

    1. 开发步骤:

    (1)增加Spring支持

      下载Spring安装包和其依赖的commons-logging.jar,复制到项目Web应用的lib文件夹(WebRoot/WEB-INF/lib);

    Spring文件夹内容介绍:    

    dccs: Spring相关文档,包括开发指南、API参考文档;

    libs: jar包。分为:1)Spring框架calss文件的JAR包;2)Spring框架源文件的压缩包,文件名以-source结尾; 3)Spring框架API文档的压缩包,文件名以-javadoc结尾;

    schemas: Spring配置文件的XML Schema文档;

    其他.txt说明性文档。

    (2)配置前端控制器DispatchServlet

      在部署描述符web.xml中编辑配置DispatchServlet(WebRoot/WEB-INF/web.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
        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>SM02</display-name>
      
      <!-- 配置SpringMVC前端控制器DispatcherServlet -->
      <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <!-- 指定SpringMVC配置文件spring-config.xml,用来将拦截的对应请求分发给对应的Controller-->
              <param-value>/WEB-INF/springmvc-config.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      
      <!-- 指定该springmvc的Servlet可以拦截的请求为所有请求("/"),
    之后可以分发给对应的Controller
    --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

    (3)配置SpringMVC的Controller

      在SpringMVC的配置文件springmvc-config.xml中配置对应的Controller、对应的Java Bean、对应拦截的请求等

      (WEN-INF/springmvc-config.xml,路径在web.xml的DispatcherServlet的配置中param-value子标签中配置)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
           
        <!-- 配置Handle,映射"/hello"请求 -->
        <bean name="/hello" class="org.fkit.controller.HelloController"/>
    
        <!-- 处理映射器将bean的name作为url进行查找,需要在配置Handle时指定name(即url) -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
        <!-- SimpleControllerHandlerAdapter是一个处理器适配器,所有处理适配器都要实现 HandlerAdapter接口-->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
    </beans>

      其中,Spring4.0之后可以不配置处理映射器、处理器适配器、视图解析器,这些工作会默认完成。此处为显式表现出SpringMVC工作流程。

    (4)Controller类的实现

      HelloController类实现了Controller接口,用来处理"/hello"的单一请求,即浏览器发出http://localhost:8080/SM02/hello的请求时实际由该Controller处理。

     (src/org/fkit/controller/HelloController.java)

    package org.fkit.controller;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    /**
     * 一个实现了Controller接口的控制器
     * 可以处理一个单一的请求动作("/hello")
     * http://localhost:8080/SM02/hello
     */
    public class HelloController implements Controller {
        private static final Log logger = LogFactory.getLog(HelloController.class);
        /**
         * handleRequest方法时Controller接口必须实现的方法
         * 返回一个ModelAndView对象,包含视图名或视图名和模型
         */
        public ModelAndView handleRequest(HttpServletRequest arg0,
                HttpServletResponse arg1) throws Exception {
            logger.info("handleRequest调用");
            
            //创建ModelAndView对象
            ModelAndView mv = new ModelAndView();
            
            //添加模型数据,可以是任意POJO对象,第一个参数是对该对象的命名,可在jsp中用EL表达式引用
            mv.addObject("message", "Hello SpringMVC");
            
            //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面,参数指定该页面路径
            mv.setViewName("/WEB-INF/content/welcome.jsp");
            
            //返回ModelAndView对象
            return mv;
        }
    }

    (5)View页面实现

      HelloController返回的页面,用来显式返回的视图内容,在该Controller的ModelAndView对象的setViewName()中指定路径。

      (WEB-INF/content/welcome.jsp) 

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>欢迎页面</title>
    </head>
    <body>
    <!-- 页面可以访问Controller传递传递出来的message -->
    ${requestScope.message}
    </body>
    </html>

    (6)结果展示

      在浏览器中输入URL:http://localhost:8080/SM02/hello,返回以下视图,表示访问成功。

    2. 执行流程解析

    (1)用户向服务器发送请求

    (2)请求被DispatcherServlet拦截

    (3)DispatcherServlet对请求URL(统一资源定位符)进行解析,得到URI(请求资源标识符)。根据该URI,调用HandlerMapping获得该Handler(Controller)配置的所有相关对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个HandlerExecutionChain对象中返回。

    (4)DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。HandlerAdapter的设计符合面向对象的单一职责原则,代码架构清晰,便于维护,可复用性高。HandlerAdapter被用于处理多种Handler,调用Handler实际处理请求的方法。

    (5)提取请求中的模型数据,执行Handler(Controller)。在填充Handler入参过程中,根据配置,Spring会做一些额外的工作(消息转换、数据转换、数据格式化、数据验证...)

    (6)Handler执行完成后向DispatcherServlet返回一个ModelAndView对象,对象中应包括视图名,或视图名和模型

    (7)根据返回的对象,选择合适的ViewResolver(视图解析器),返回给DispatcherServlet。

    (8)ViewResolver结和Model和View渲染视图。

    (9)将视图渲染结果返回给客户端。

  • 相关阅读:
    一文详解云上自动化部署集群管理工具 Nebula Operator
    手把手教你从数据预处理开始体验图数据库
    图查询语言的历史回顾短文
    集群通信:从心跳说起
    @Constraint 自定义注解校验手机号
    【工具】maven插件自动生成mapper文件
    【工具】方法日志打印+任务切片
    简单梳理下 Vue3 的新特性
    团队与领导力健康检查 | 体检表
    详细介绍Scrum Master八大职责(Scrum Master能力说明)
  • 原文地址:https://www.cnblogs.com/IUbanana/p/6985665.html
Copyright © 2011-2022 走看看