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)将视图渲染结果返回给客户端。

  • 相关阅读:
    Linux内核网络协议栈优化总纲
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
  • 原文地址:https://www.cnblogs.com/IUbanana/p/6985665.html
Copyright © 2011-2022 走看看