SpringMVC

Spring MVC概述

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,

基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的 Servlet进行Web

开发。

 Servlet的弊端:

     1、Servlet的编码问题 请求-响应(内置编码过滤器)

               2、无法自动封装参数。(3种参数传递,类型的自动转换+封装)

               3、doXXX方法,oper=(根据自身需要任意声明函数)

               4、切换WEB工程的版本,Servlet配置复杂。

                  支持XML和注解 2.5 以上。

SpringMVC部分架构:

   MVC 是一种著名的设计模式,特别是在 Web 应用程序领域。模式全都是关于将包含业务数据的模块与显示模块的视图解耦的。这是

怎样发生的?视图(例如,JSP 页面)怎样能够与其模型(例如,包含数据的 JavaBean)解耦?记得这句格言么?一个层次的重定向几

乎可以解决计算机业中的所有问题。确实,在模型和视图之间引入重定向层可以解决问题。此重定向层是控制器。控制器将接收请求,

执行更新模型的操作,然后通知视图关于模型更改的消息。依赖于模型的状态并且依赖于请求的控制器可以决定要显示哪个视图。

SpringMVC的核心架构(执行流程):

 执行流程:

(1)首先浏览器发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制
(2)DispatcherServlet——>HandlerMapping,处理器映射器将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象
(3)DispatcherServlet——>HandlerAdapter,处理器适配器将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器
(4)HandlerAdapter——>调用处理器相应功能处理方法,并返回一个ModelAndView对象(包含模型数据、逻辑视图名)
(5)ModelAndView对象(Model部分是业务对象返回的模型数据,View部分为逻辑视图名)——> ViewResolver, 视图解析器将把逻辑视图名解析为具体的View
(6)View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构
(7)返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束

Spring MVC的优势

  1、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、

    处理器或页面控制器(Controller)、验证器( Validator)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)

  2、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象

  3、和Spring 其他框架无缝集成,是其它Web框架所不具备的

  4、可适配,通过HandlerAdapter可以支持任意的类作为处理器

  5、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制

  6、功能强大的数据验证、格式化、绑定机制

  7、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试

  8、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换

  9、RESTful风格的支持、简单的文件上传、约定优于配置的契约式编程支持、基于注解的零配置支持等

 

MVC三元组的概念

  MVC (Model-View-Controller):

    •   Model:组件等价于 实体层 + 业务逻辑层 + 持久层
    •   View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
    •   Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图。

 

SpringMVC小案例(基于配置的方式):

  1.导入pom.xml文件节点

<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.16</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.2</version>
    </dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javaee</groupId>
      <artifactId>javaee-api</artifactId>
      <version>5</version>
    </dependency>

 

  2.创建applicationContext.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: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">

    <bean id="/firstSpringMvc" class="cn.springnvc.FirstSpringMvc"></bean>


</beans>

 

  3.创建一个类把它变为一个控制器

package cn.springnvc;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 将一个类变为一个控制器
 */
public class FirstSpringMvc implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView moav=new ModelAndView();

        moav.addObject("user","wdy");

        moav.setViewName("/jsp/index.jsp");
        return moav;
    }
}

  

  4.在webapp下创建一个名为jsp的文件夹并添加一个页面

<%@page language="java" pageEncoding="utf-8" autoFlush="true" isELIgnored="false" contentType="text/html; utf-8"%>

<html>
<body>
<h2>Hello World! Wdy hehe</h2>
${user}
</body>
</html>

  5.在web.xnl中配置如下代码:

  <display-name>Archetype Created Web Application</display-name>

  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  添加完之后就可以进行测试了!

使用注解方式:

  1.首先新建一个类(控制器):

package cn.springnvc;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("second")
public class SecondContorller {
    @RequestMapping("first")
    public ModelAndView firstView(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("user","wdddd");
        mv.setViewName("index");
        return mv;
    }

    @RequestMapping("seconds")
    public ModelAndView secondView(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("user","wddddddsssd");
        mv.setViewName("index");
        return mv;
    }


}

 

  2.在applicationContext.xml文件中注释掉上一个添加如下代码:

    <!--扫描注解-->
    <context:component-scan base-package="cn.springnvc"></context:component-scan>
    <!--Spring支持MVC注解-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--试图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

 然后进行测试

静态资源加载

  例如:

    加载一个图片(webapp下创建一个img文件夹放一张图片)

<%@page language="java" pageEncoding="utf-8" autoFlush="true" isELIgnored="false" contentType="text/html; utf-8"%>

<html>
<body>
<img src="/img/12345.jpg">
<h2>Wdy hehe</h2>
${user}
</body>
</html>

  如果这样直接运行会发现网页里无法加载到图片(被拦截了)

    可以通过如下两种方式对这些资源放行或加载(三种配置方式)

 

  1.在web.xml中配置

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>

  2.1在applicationConttext..xml中配置添加如下代码(两种):

    <!--资源放行-->
    <!--利用defaultservlet放行方式-->
    <mvc:default-servlet-handler/>

  

  2.2

    <!--从Spring3.0.4版本中提供的资源放行方式-->
    <mvc:resources mapping="/**" location="/img"/>

启动之后进可以看到效果了

原文地址:https://www.cnblogs.com/wangdayexinyue/p/11811821.html