[学习笔记] SpringMVC之初识SpringMVC

# 学习 # · 2021-02-16

MVC设计模式

1、MVC设计模式:是软件工程中的一种软件架构模式,它强制性地使软件系统的输入、处理和输出分开,把软件系统分为三个基本部分,即模型(Model)、视图(View)、控制器(Controller)。

(1)视图(View):负责格式化数据并把他们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。对应组件:JSP/HTML。

(2)控制器(Controller):负责接收并转发请求,对请求进行处理后指派视图并响应结果并发送给客户端。对应组件:Servlet。

(3)模型(Model):拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作。对应组件:JavaBean(Service+Dao+POJO)。

2、Model 1时代:在WEB早期的开发中,通常采用的都是Model1。在Model1中,主要分为两层,视图层和模型层。

(1)Model1优点:架构简单,比较适合小型项目开发。

(2)Model1缺点:JSP职责不单一,职责过重,不便于维护。

3、Model 2时代:Model2把一个项目分成三部分,包括视图、控制、模型。

4、MVC的处理流程:

(1)执行流程:用户发请求、Servlet接收请求数据,并调用对应的业务逻辑方法、业务处理完毕,返回更新后的数据给servlet、servlet转向到JSP,由JSP来渲染页面、响应给前端更新后的页面。

(2)Controller控制器:取得表单数据、调用业务逻辑、转向指定的页面。

(3)Model模型:业务逻辑、保存数据的状态。

(4)View视图:显示页面。

5、MVC的优点:完美的系统架构 = 松耦合+高重用性+高扩展性

(1)多视图共享一个模型,大大提高代码的可重用性。

(2)MVC三个模块相互独立,松耦合架构。

(3)控制器提高了应用程序的灵活性和可配置性。

(4)有利于软件工程化管理。

6、MVC的缺点:

(1)原理复杂。

(2)增加了系统结构和实现的复杂性。

(3)视图对模型数据的低效率访问。


初识Spring MVC

1、Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架,它本质上相当于 Servlet。Spring MVC作为控制器来简历模型与视图的数据交互,是结构最清晰的MVC Model2实现。

2、Spring MVC框架的特点:

(1)清晰地角色划分。

(2)灵活的配置功能。

(3)提供了大量的控制器接口和实现类。

(4)真正做到与View层的实现无关(JSP、Velocity、Xslt等)。

(5)国际化支持。

(6)面向接口编程。

(7)Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起。

3、Spring MVC搭建方法之配置版:

(1)新建Maven项目,导入相关依赖jar包,并添加Web Application支持。

(2)在web.xml中配置Servlet,定义DispatcherServlet。

<!-- 配置Spring MVC的核心控制器DispatcherServlet -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 为DispatcherServlet关联一个springmvc的配置文件:<servlet-name>-servlet.xml -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!-- 标记容器在启动的时候就加载此DispatcherServlet -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- / 匹配所有的请求,不包括.jsp-->
    <!-- /* 匹配所有的请求,包括.jsp-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

(3)创建Spring MVC的配置文件springmvc-servlet.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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--
            prefix:前缀
            suffix:后缀
            通过配置前后缀,将视图逻辑名解析为/WEB-INF/jsp/<viewName>.jsp
        -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

(4)创建控制器HelloController:

package com.demo.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController extends AbstractController {

    protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();

        //【业务代码】封装对象,放在ModelAndView中
        mv.addObject("msg","Hello SpringMVC!");

        //【视图跳转】封装要跳转的视图,放在ModelAndView中
        mv.setViewName("index");    //视图文件位置:/WEB-INF/jsp/index.jsp

        return mv;
    }
}

(5)注册Bean:

<bean id="/hello" class="com.demo.controller.HelloController"></bean>

(6)创建视图页面(index.jsp):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>index</title></head>
<body>
      ${msg}
</body>
</html>

(7)部署运行测试:链接/hello访问测试。

4、Spring MVC框架的请求处理流程:

(1)用户发送请求到前端控制器(DispatcherServlet),前端控制器根据请求的信息决定选择哪个页面控制器进行处理,并把请求委托给它,即Servlet控制器的控制逻辑部分。

(2)页面控制器接收到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)。

(3)前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的真正视图,并把模型数据传入一遍将视图渲染展示。

(4)前端控制器再次收回控制权,将响应结果返回给用户。

5、Spring MVC的执行原理:

(1)DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

(2)HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。

(3)HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。

(4)HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

(5)HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

(6)Handler让具体的Controller执行。

(7)Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

(8)HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

(9)DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

(10)视图解析器将解析的逻辑视图名传给DispatcherServlet。

(11)DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

(12)最终视图呈现给用户。

6、Spring MVC搭建方法之注解版:

(1)配置web.xml,注册DispatcherServlet并关联SpringMVC的配置文件。

(2)添加Spring MVC配置文件。

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

    <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.demo.controller"/>

    <!-- 让Spring MVC不处理静态资源 -->
    <mvc:default-servlet-handler />

    <!--
        自动注册DefaultAnnotationHandlerMapping(处理器映射)和AnnotationMethodHandlerAdapter(处理器适配器)
        一键式配置,通过注解的方式进行Spring MVC开发。
    -->
    <mvc:annotation-driven />

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

(3)创建控制器HelloController:

@Controller
public class HelloController {

    //RequestMapping表示用哪个url来对应(此处:"/index")
    @RequestMapping("/hello")
    public String hello(Model model){
        //封装数据
        model.addAttribute("msg","Hello SpringMVC Two New Action!");

        //返回视图名称
        return "index";
    };

}

(4)创建视图层,并配置Tomcat测试运行。


参数传递

1、View-Controller的参数传递:

(1)方法一:将Controller方法中参数直接入参。

//访问路径:http://localhost:8022/hello?username=小红

@RequestMapping("/hello")
public String hello(@RequestParam String username){
    System.out.println("Hello," + username);
    return "index";
}

(2)方法二:通过请求URL进行映射。

//访问路径1:http://localhost:8022/SpringMVC_war_exploded/hello/?username=小红
//访问路径2:http://localhost:8022/SpringMVC_war_exploded/hello?username=小红

@RequestMapping({"/hello","/"})
public String hello(@RequestParam String username){
    System.out.println("Hello," + username);
    return "index";
}

(3)方法三:通过请求参数、请求方法进行映射。

//访问路径:http://localhost:8022/SpringMVC_war_exploded/hello?username=小红

/**
 * value:请求URL
 * method:请求方法,GET/POST/PUT/DELETE等
 * params:请求参数
 */
@RequestMapping(value="/hello",method=RequestMethod.GET,params="username")
public String hello(@RequestParam String username){
    System.out.println("Hello," + username);
    return "index";
}

(4)方法四:借助@ RequestParam注解指定其对应的请求参数。

//访问路径:http://localhost:8022/SpringMVC_war_exploded/hello?username=小红

@RequestMapping(value="/hello")
/**
 * value:参数名
 * required:是否必须,默认为true,表示请求中必须包含对应的参数名,若不存在将抛出异常。
 */
public String hello(@RequestParam(value="username",required=false) String username){
    System.out.println("Hello," + username);
    return "index";
}

2、Controller-View的参数传递

(1)ModelAndView:设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面。

/**
 * 参数传递:controller to view -(ModelAndView)
 * @param username
 * @return
 */
@RequestMapping("/hello")
public ModelAndView index(String username){
    System.out.println("Hello," + username);
    /**
     * ①添加模型数据
     * ModelAndView addObject(String key, Object value)
     * ModelAndView addAllObjects(Map<String,?> modelMap)
     */
    ModelAndView mView = new ModelAndView();
    mView.addObject("username", username);

    /**
     * ②设置视图
     * void setView(View view)
     * void SrtViewName(String viewName)
     */

    mView.setViewName("index");
    return mView;
}

/**
 * 参数传递:controller to view -(ModelAndView)
 * 在视图页面通过EL表达式读取
 */
<h1>username(key:username) --> ${username}</h1>

(2)Model:

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, Model model){
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("msg",name);
   System.out.println(name);
   return "index";
}

(3)Map:

@RequestMapping("/hello")
public String index(String username,Map<String, Object> model){
    model.put("username", username);
    return "hello";
}

3、无视图解析器的情况下实现转发和重定向:

(1)转发方法一:

@RequestMapping("/test1")
public String test1(){
    //转发到index2.jsp
    return "/index2.jsp";
}

(2)转发方法二:

@RequestMapping("/test2")
public String test2(){
    //转发到index2.jsp
    return "forward:/index2.jsp";
}

(3)重定向方法一:

@RequestMapping("/test3")
public String test3(){
    //重定向到index2.jsp
    return "redirect:/index.jsp";
}
如无特殊说明,本博所有文章均为博主原创。

如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/221/

评论