zoukankan      html  css  js  c++  java
  • SpringMVC概述

    一、概述

    最初,Java Web使用JSP+Java Bean的模式,两者之间存在严重的耦合。由于业务逻辑基本是由JSP完成的,Java和HTML也耦合在一起,前后端工作严重依赖和混杂在一起,两者都处理同一个JSP文件,前端等待后端完成,后端等待前端完成,然后才能进行测试,并且JSP很难复用。

    JSP+Java Bean

    由于上面的弊端,Servlet+JSP+Java Bean的MVC出现,取代了上述模式,Servlet作为控制器处理业务逻辑。Servlet接收用户请求,调度Java Bean取读写数据库,然后将结果放在JSP中。Servlet是Controller,Java Bean是专门操作数据库组件的模型层Model,JSP是向用户进行展示的的视图View。前后端在一定程度上分离,仍有所耦合。

    由于控制器和模型层的分离,大量Java代码可以复用,MVC的经典框架Struts1/2和模型层的Hibernate纷纷崛起。但是,随着手机端的兴起,Web页面大部分使用Ajax请求,它们之间的交互只需要JSON数据而已,对于JSP的依赖大大减少。依赖于页面编程的Struts已经不能适合时代的发展。

     MVC

     不可优化SQL、不够灵活的Hibernate逐渐不敌MyBatis,但是MyBatis依然没处理好数据库事务的编程,同时随着各种NoSQL强势崛起,Java Web应用不仅能在数据库获取数据,也可以从NoSQL中获取数据,这些已不是持久层框架能够处理的了,而Spring MVC给出了方案。

    如下图所示,传统的模型层被拆分为业务层(Service)和数据访问层(DAO,Data Access Object)。在Service下可以通过Spring的声明式事务操作数据访问层,而在业务层上还允许我们访问NoSQL,这样就能满足现今异军突起的NoSQL的使用,它的使用将大大提高互联网系统的性能。Spring MVC最大特色是结构松散,几乎可以使用各类视图,包括JSON、JSP、XML、PDF等,可满足手机端、页面端和平板电脑端的各类请求。

     Spirng MVC

     Sping MVC是一种基于Servlet的技术,它提供了核心控制器DispathcerServlet和相关的组件。

    流程:

     在Servlet初始化(调用init方法)时,Spring MVC会根据配置,获取配置信息,从而获得统一资源标识符(URI)和处理器(Handler,即controller),之间的映射关系(HandlerMapping),处理器可以有拦截器,我们还可以在处理器执行前加入自己的代码,于是,这些构成了处理器的执行链(HandlerContextChain)。

     当一个请求到来时,DispatcherServlet首先通过请求和事先解析好的HandlerMapping配置,找到对应的处理器(Handler),准备开始运行处理器和拦截器组成的执行链。

    处理器和拦截要通过适配器(HandlerAdapter)进行运行。

    处理器返回模型和视图给DispatcherServlet,DispatcherServlet会把对应的视图信息传递给视图解析器(ViewResolver)。如果使用了逻辑视图,视图解析器会解析它,不过不是逻辑视图,视图解析器则不进行处理。

    模型渲染到视图中去。

    二、入门示例

    步骤:

    • 依赖添加
    • 在web.xml中配置DispatcherServlet
    • 配置Spring MVC配置文件
    • 编写处理请求的处理器,并标识为处理器
    • 编写视图

    配置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" id="WebApp_ID" version="2.5">
      
      <!-- 配置DispatcherServlet -->
          <servlet>
            <servlet-name>springDispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置DispatcherServlet的一个初始化参数:配置SpringMVC配置文件的位置和名称 -->
            <!-- 
                实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.
                默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml
            -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!-- 加载时创建 -->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <!-- Map all requests to the DispatcherServlet for handling -->
        <servlet-mapping>
            <servlet-name>springDispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
            <!-- /可以应答所有请求 -->
        </servlet-mapping>
      
    </web-app>

    src下创建springmvc.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:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
            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-4.0.xsd">
    
        <!-- 配置自动扫描的包 -->
        <context:component-scan base-package="com.*"></context:component-scan>
    
         <!-- 配置视图解析器:如何把handler返回值(这里是success)解析为实际的物理视图 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    </beans>

    创建controller

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HelloWorld {
    
        /**
         * 1.使用@RequestMapping映射请求,JSP中超链接的名字 2.返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver视图解析, 会做如下的解析: 通过
         * prefix+returnVal+suffix 的方式得到实际物理视图, 然后会转发操作 /WEB-INF/views/success.jsp
         */
    
        @RequestMapping("/helloworld")
        public String hello() {
            System.out.println("Hello world!");
            return "success";
        }
    }

    视图

    创建/WEB-INF/views/success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h4>Success Page</h4>
    </body>
    </html>
  • 相关阅读:
    CodeForces
    [AHOI 2013] 差异
    BZOJ
    [校内训练20_09_15]ABC
    [校内训练20_09_10]ABC
    [校内训练20_09_08]AC
    fastIO
    [校内训练20_06_05]ABC
    [校内训练20_06_04]ABC
    [校内训练20_06_03]ABC
  • 原文地址:https://www.cnblogs.com/aidata/p/11458825.html
Copyright © 2011-2022 走看看