一、Spring-mvc

(一)概述

1)定义

MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件。

2)作用域

controller控制层(servlet)

3)优缺点

MVC 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)的分离,同时提供了在这些元素之间的松散耦合。

4)M-V-C

  • 模型M封装了应用程序数据,并且通常它们由 POJO 组成。
  • 视图V主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的 HTML 输出。
  • 控制器C主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。

(二)执行过程

具体流程

  1. 收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器。
  2. 控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中。
  3. DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图。
  4. 一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中。

大概流程

  1. 客户端发送相应的请求到DispatcherServlet
  2. DispatcherServlet 把请求给HandlerMapping
  3. handlerAdapter 进行处理1
  4. 把这个ModelAndView——>给你的DispatcherServlet——>给你的视图渲染器——>DispatcherServlet
  5. 呈现在浏览器,用户看到一个好网页。

图解:

SpringのMVC

(三)实例:开发一个基础的springmvc

核心配置文件:①核心文件要配置到web.xml文件;②配置servlet
  1. 导入相关的jar包
  2. 核心xml文件
  3. 配置统一前缀(目录文件)。后缀(.jsp .html)

(四)代码及解析2

1)代码

  1. spring_mvc基础版图解
    SpringのMVC
  2. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--开始配置servlet-->
    <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:springmvc-servlet.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>
</web-app>
  1. 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"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    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">

    <!--当你的请求地址为index.HTML时,就回到UserController-->
    <!--<bean name="/index.html" class="com.offcn.controller.UserController"></bean>-->
    <!--扫描controller下所有的包-->
    <context:component-scan base-package="com.offcn.controller"/>
    <!--开启注解驱动-->
    <mvc:annotation-driven/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <property name="suffix" value=".jsp"></property>
    </bean>
</beans>
  1. UserController
package com.offcn.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/*
*第一种方法:实现Controller接口
 */
@Controller
/*@RequestMapping("/userController")*/
public class UserController {
    /*8080/userController/index*/
    /*把页面的数据放到controller*/
    /*代表请求的路径*/
    /*有一个参数的注解*/
    /*userName:第一个为这个代表你参数的键,第二个为值*/
    /*method = RequestMethod:设置请求方式*/
    /*@RequestMapping(value = "/index",params = {"userName"},method = RequestMethod.GET)*/
    /*value = "/index/*.do":只要是index下面以.do结尾的都能匹配到*/
//    @RequestMapping(value = "/index/*.do",params = {"userName"},method = RequestMethod.GET)
    /*value 代表网页中拼接的键;required 代表是否必须拼接这个参数,false代表可以(或者不可以)拼接 true必须拼接*/
    /*PathVariable:匹配uri上的任何参数,注解上的pid跟@RequestMapping(value ="")中的值一样*/
    @RequestMapping(value = "/index/{pid}")
    //    public String index(@RequestParam(value = "userName",required = false) String userName){
//    public String index(String userName){
    public String index(@PathVariable String pid){
        /*jsp——>Control*/
        System.out.println(pid);
        /*返回的界面*/
        return "dolndex";
    }
    /*@Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        return new ModelAndView("dolndex");
    }*/
    /*Control——>jsp*/
    @RequestMapping("/toDolndex")
    /*@RequestParam:注解可要可不要*/
    public  ModelAndView toDolndex(@RequestParam(value = "userName",required = false) String userName){
       /*构建modelAndView*/
        ModelAndView modelAndView = new ModelAndView();
        /*把值放入modelAndView(以键值对的形式来传递)*/
        modelAndView.addObject("userName",userName);

        /*把跳转界面放到modelAndView里*/
        modelAndView.setViewName("dolndex");
        System.out.println("1234567667890");
        return modelAndView;
    }

    /*返回要跳转的地址 view     Model,这个Model不用实例化,直接传进去*/
    @RequestMapping("/toDolndex1")
    public  String toDolndex1(String userName, Model model){
        /*Model里面添加数据,以键值对的形式来传递*/
        model.addAttribute("userNmae",userName);
        System.out.println(userName);
        return "dolndex";
    }
    /*通过map把数据传过去*/
    @RequestMapping("/toDolndex2")
    public  String toDolndex2(String userName, Map<String,Object> map){
        map.put("userName",userName);
        return "dolndex";
    }

    /*
    * 最终版
    *
    * */
    @RequestMapping("/toUpdata")
    public  String toUpdata(
            @RequestParam(value = "userName",required = false) String userName,
            @RequestParam(value = "userPwd",required = true) String userPwd){
        return "dolndex";
    }

    /*返回要跳转的地址 view     Model,这个Model不用实例化,直接传进去*/
    @RequestMapping("/toDolndex3")
    public  String toDolndex3(String userName, Model model){
        /*Model里面添加数据,以键值对的形式来传递*/
        model.addAttribute("userNmae",userName);
        System.out.println(userName);
        return "dolndex";
    }

}
  1. 返回界面
<%--
  Created by IntelliJ IDEA.
  User: Dk502可分
  Date: 2018/10/16
  Time: 10:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${userName}
</body>
</html>

2)解析3

jsp——>Control

Control——>jsp

  1. ModelAndView
    • @RequestParam:注解可要可不要
    • 构建modelAndView
    • 把值放入modelAndView(以键值对的形式来传递)
    • 把跳转界面放到modelAndView里

@RequestMapping("/toDolndex")
    public  ModelAndView toDolndex(@RequestParam(value = "userName",required = false) String userName){
       /*构建modelAndView*/
        ModelAndView modelAndView = new ModelAndView();
        /*把值放入modelAndView(以键值对的形式来传递)*/
        modelAndView.addObject("userName",userName);
        /*把跳转界面放到modelAndView里*/
        modelAndView.setViewName("dolndex");
        System.out.println("1234567667890");
        return modelAndView;
    }

 @RequestMapping("/toDolndex1")
    public  String toDolndex(String userName, Model model){
        /*Model里面添加数据,以键值对的形式来传递*/
        model.addAttribute("userNmae",userName);
        System.out.println(userName);
        return "dolndex";
    }
  1. Model
    • model,不用实例化
    • 以键值对的形式把值通过model传进去
    • 跳转界面

① 如需从界面拿值,则需要给方法传入参数

/*返回要跳转的地址 view     Model,这个Model不用实例化,直接传进去*/
    @RequestMapping("/toDolndex1")
    public  String toDolndex1(String userName, Model model){
        /*Model里面添加数据,以键值对的形式来传递*/
        model.addAttribute("userNmae",userName);
        System.out.println(userName);
        return "dolndex";
    }

② 如需从数据库拿值,则不需给方法传入参数

@RequestMapping("/addUser")
    public String addUser( Model model){
        List<User> userList=new ArrayList<User>();
        User user1 = new User(1,"asd","123");
        User user2 = new User(2,"asd","123");
        User user3 = new User(3,"asd","123");
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        model.addAttribute("userList",userList);
        return "userIndex";
    }
  1. map集合
/*通过map把数据传过去*/
    @RequestMapping("/toDolndex2")
    public  String toDolndex2(String userName, Map<String,Object> map){
        map.put("userName",userName);
        return "dolndex";
    }
  1. RequestParam
@RequestMapping("/toUpdata")
    public  String toUpdata(
            @RequestParam(value = "userName",required = false) String userName,
            @RequestParam(value = "userPwd",required = true) String userPwd){
        return "dolndex";
    }
  1. 加粗的为最终版(常用+重要,需记住)

二、面试题4

  1. 什么是Spring MVC?
    ① Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一部分,它和Struts2一样都属于表现层的框架。
    ②MVC(Model模型 View 视图 Controller 控制器):这是一种软件架构思想,是一种开发模式,将软件划分为三种不同类型的模块,分别是模型,视图,和控制器。
    ③模型:用于封装业务逻辑处理(java类);
    ④视图:用于数据展现和操作界面(Servlet);
    ⑤控制器:用于协调视图和模型(jsp);
    ⑥处理流程:视图将请求发送给控制器,由控制器选择对应的模型来处理;模型将处理结果交给控制器,控制器选择合适的视图来展现处理结果;
  2. Spring MVC的五大组键?
    ①前端控制器DispatcherServlet
    ②映射处理器HandlerMapping
    ③处理器Controller
    ④模型和视图ModelAndView
    ⑤视图解析器ViewResolver
  3. SpringMVC中控制器的注解一般用哪个,有没有别的注解可以代替?
    ① 一般用@Controller注解,表示是表现层,不能使用别的注解代替。
  4. @RequestMapping注解用在类上面有什么作用?
    ① 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
  5. 基于注解的Spring MVC的应用编程步骤
    ① 导包Spring-webmvc,添加spring配置文件,配置前端控制器dispatcherServlet
    ② 创建Controller
    ③ 创建JSP
    ④ 在Spring的配置文件里面添加视图解析器、组建扫描、mvc注解扫描
  6. 待更新

  1. 比如:
    到那个界面,数据返回给那个界面,
    对数据进行处理(ModelAndView)数据和视图 ↩︎

  2. @RequestMapping ↩︎

  3. 详细代码看上面代码区域 ↩︎

  4. 面试题 ↩︎

相关文章: