SpringMVC框架從入門到總結一

SpringMVC介紹

回顧MVC設計模式

  • model:模型 JavaBean(1.處理業務邏輯 2.封裝數據)

  • view:視圖 Jsp/html(展示數據)

  • controller:控制器 Servlet(1.接收請求 2.調用模型 3.轉發視圖)

三層架構

  • web層:用戶與java交互

  • service層:處理業務邏輯

  • dao層:java與數據庫交互
    在這裏插入圖片描述

SpringMVC介紹

SpringMVC 是一種基於 Java 的實現 MVC 設計模式的輕量級 Web 框架,它可以通過一套註解,讓一個簡單的Java類成爲控制器,而無須實現任何接口

在這裏插入圖片描述
springMVC框架本質上就是一個servlet,封裝了共有的行爲(請求、響應),簡化代碼

SpringMVC快速入門

步驟:

  1. 創建maven工程
  2. 引入依賴管理
  3. 創建一個普通類,@controller,創建處理請求的方法
  4. 準備一個頁面,用於響應
  5. 創建springmvc的配置文件,開啓註解掃描
  6. 配置一個前端的控制器(可以理解爲之前的BaseServlet的方法)將springmvc的配置文件配起來
    pom.xml:
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>cn.itcast</groupId>  
  <artifactId>SpringMvc_day01_quick</artifactId>  
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <!--
    1、創建maven工程
    2、引入依賴管理
    3、創建一個普通類,@controller,創建處理請求的方法
    4、準備一個頁面,用於響應
    5、創建springmvc的配置文件,開啓註解掃描
    6、配置一個前端的控制器(可以理解爲之前的BaseServlet的方法)將springmvc的配置文件配起來
    -->  
  <!--依賴管理-->
  <dependencies> 
    <dependency> 
      <groupId>org.springframework</groupId>  
      <artifactId>spring-context</artifactId>  
      <version>5.0.6.RELEASE</version> 
    </dependency>  
    <!--springmvc依賴-->  
    <dependency> 
      <groupId>org.springframework</groupId>  
      <artifactId>spring-webmvc</artifactId>  
      <version>5.0.6.RELEASE</version>
    </dependency>
    <dependency> 
      <groupId>javax.servlet</groupId>  
      <artifactId>javax.servlet-api</artifactId>  
      <version>3.0.1</version>  
      <scope>provided</scope> 
    </dependency> 
  </dependencies>  
  <!--jdk1.8插件-->  
  <build> 
    <plugins> 
      <!-- 設置編譯版本爲1.8 -->  
      <plugin> 
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-compiler-plugin</artifactId>  
        <version>3.1</version>  
        <configuration> 
          <source>1.8</source>  
          <target>1.8</target>  
          <encoding>UTF-8</encoding> 
        </configuration> 
      </plugin> 
    </plugins> 
  </build> 
</project>

<?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"
         version="2.5">


    <!--配置springmvc的前端控制器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--將springmvc的配置文件交給spring的前端控制器來解析-->

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>

   <!--攔截url規則:/(默認)-->
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

demo.jsp:

<%--
  Created by IntelliJ IDEA.
  User: hxc
  Date: 2020/6/22
  Time: 19:30
  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>
    ${msg}
</body>
</html>

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"
       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">

    <!-- bean definitions here -->


    <!-- 開啓註解掃描  -->
    <context:component-scan base-package="cn.itcast"></context:component-scan>
</beans>

Controller:

@Controller //聲明這是一個處理請求的controller
public class MyController {


    @RequestMapping("/demo")  //指定當前方法處理哪一個請求
    public ModelAndView demo(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","hello springMVC");
        modelAndView.setViewName("/WEB-INF/jsp/demo.jsp");
        return modelAndView;
    }
}

SpringMVC的執行流程

時序圖

在這裏插入圖片描述

流程圖

在這裏插入圖片描述

SpringMVC組件概述

三大組件

  • 處理器映射器:HandlerMapping
    將 請求url 和 處理器的方法 建立映射關係

  • 處理器適配器:HandlerAdapter
    從多個處理器當中,適配其中一個,調用目標執行…

  • 視圖解析器:ViewResolver
    將邏輯視圖解析爲物理視圖

常用註解

@Controller

SpringMVC基於Spring容器,所以在進行SpringMVC操作時,需要將Controller存儲到Spring容器中,故使用此註解
在這裏插入圖片描述

@RequestMapping

用於建立請求 URL 和處理請求方法之間的對應關係

 /**
     *  @RequestMapping:
     *      1.指定當前方法需要處理的請求的路徑
     *          value:就是路徑,可以是一個數組.
     *          如果有後綴,此處的後綴可以省略.
     *      2. 限定請求的方式的
     *          method: 是一個RequestMethod枚舉類型的數組
     *      3. 分類管理url
     *          使用在類名上,作爲當前訪問controller的統一的父級路徑.從而達到分類管理的目的
     *          /order/*
     *          /user/*
     *          /route/*
     *
     * @return
     */
    //@RequestMapping({"/demo.do","/abc"})  //指定當前方法處理哪一個請求
    @RequestMapping(value = "/demo",method = RequestMethod.GET)
    public ModelAndView demo(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg","hello springMVC");
//        視圖路徑 應該由    視圖解析器的  前綴+名字+後綴
        modelAndView.setViewName("demo");
        return modelAndView;
    }

SpringMVC的請求

服務器要獲取請求的參數,有時還需要進行數據的封裝,SpringMVC可以接收如下類型的參數:

默認支持參數

/**
 *  springMVC默認支持的參數
 *  1. HttpServletRequest : 請求
 *  2. HttpServletResponse  響應
 *  3. HttpSession   session域
 *
 *  4.Model:   model+string返回值  =  ModelAndView
 *
 * @return
 */
@RequestMapping("/demo2")
public ModelAndView demo2(HttpServletRequest request, HttpServletResponse response, HttpSession session){

    System.out.println(request);
    System.out.println(response);
    System.out.println(session);

    ModelAndView modelAndView = new ModelAndView();
    //設置視圖
    modelAndView.setViewName("item/list");
    return modelAndView;
}

基本類型參數

  /**
     *  @RequestParam : 用來獲取請求中的參數的.
     *       value值就是表單提交時的key. 底層就是 request.getParameter(key);
     *
     *       如果表單提交時的key和方法中聲明的參數名一致時,這個@RequestParam註解可以省略
     *
     *
     *  對於請求中基本類型參數,直接在handler中聲明參數,保證參數名和請求中提交的key值一樣即可
     *
     */
    @RequestMapping("/queryItem.do")
    public ModelAndView demo1(@RequestParam("productName") String productName){
        System.out.println(productName);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("item/list");
        return modelAndView;
    }

pojo類型的參數

//只是用於頁面跳轉
@RequestMapping("/queryItemById.do")
public String queryItemById(int id){
    System.out.println("拿到id,調用service去獲取數據,然後跳轉修改頁面:"+id);

    return "item/edit";
}


/**
 *  請求中的數據封裝到pojo對象. 直接聲明pojo即可.但是注意,pojo的屬性名必須和請求中的key值一致.
 *
 *  請求參數的亂碼,直接配置spring提供的亂碼過濾器 ,在spring-web包
 *
 * @return
 */
@RequestMapping("/updateItem.do")
public String updateItem(Item item){

    System.out.println("請求中的數據封裝成的item對象:"+item);

    return "item/edit";
}

web.xml配置亂碼過濾器:

<!-- spring的亂碼過濾器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 配置編碼格式-->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

pojo包裝類型的參數

pojo.java:

package com.itheima.pojo;

public class QueryVo {


    private Item item;

    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }
}
/**
 *   包裝類型:  保證前端提交的 key 是如下格式:
 *          包裝類型的屬性名.屬性名
 *
 * @param queryVo
 * @return
 */

@RequestMapping("/queryItem.do")
public String queryItem(QueryVo queryVo){

    System.out.println(queryVo.getItem());
    return "item/list";
}

自定義類型的轉換器

StringToDateConverterl.java

public class StringToDateConverter  implements Converter<String, Date>{

    /**
     實現Converter<S,T>接口
     S(source): 需要被轉的類型
     T(target): 需要轉成的類型
     */
    @Override
    public Date convert(String s) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM--dd hh:mm:ss");
        Date date=null;
        try {
            date=format.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

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">

    <!--開啓註解掃描-->
    <context:component-scan base-package="cn.itcast.controller"></context:component-scan>

    <!--前端控制器是/,所以要配置釋放靜態資源-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>

    <!--springmvc的註解驅動
    1、顯示配置使用註解的 映射器和適配器
    2、支持json解析
    -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

    <!--配置springmvc的類型轉換器-->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

        <!--配置工廠創建的對象-->
        <property name="converters">
            <set>
                <!--自定義的類型轉換器-->
                <bean class="cn.itcast.converter.StringToDateConverter"></bean>
            </set>
        </property>

    </bean>

    <!--顯示配置視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--視圖名的前綴-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--視圖名的後綴-->
        <property name="suffix" value=".jsp"></property>
    </bean>


</beans>

集合類型的參數

數組

提交數組類型,直接聲明數組類型的變量,變量和前端提交的key值保持一致

/*

    提交數組類型,直接聲明數組類型的變量,變量和前端提交的key值保持一致
 */
@RequestMapping("/demo4.do")
public String demo4(Integer[] ids){

    System.out.println(Arrays.toString(ids));
    return "item/list";
}

集合類型

/*
    提交的是集合.

    1.後臺應該創建一個包裝類,將集合屬性作爲包裝類的屬性
    2.前端提交的參數應該通過key來指定  數據封裝到包裝類的集合屬性的第幾個對象中去.

 */
@RequestMapping("/demo5.do")
public String demo5(QueryVo queryVo){

    System.out.println(queryVo.getItemList());

    return "item/list";
}

controller返回值

modelAndView類型

ModelAndView : 用於封裝數據和視圖名的對象.springmvc自動解析這個對象


@RequestMapping("/demo1")
public ModelAndView demo1(){
    ModelAndView modelAndView = new ModelAndView();

    //設置參數  向request域存放數據.
    modelAndView.addObject("msg","消息");
    //設置視圖名  完整的路徑 = 視圖解析器的前綴  + 名字 + 後綴  ,底層是java的轉發技術.
    modelAndView.setViewName("demo");

    return modelAndView;
}

void類型

@RequestMapping("/demo2")
public  void demo2(HttpServletRequest request, HttpServletResponse response){

    try {
        request.setAttribute("msg","原生態的轉發技術");
        request.getRequestDispatcher("/WEB-INF/jsp/demo.jsp").forward(request,response);
    } catch (ServletException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@RequestMapping("/demo3")
public void demo3(HttpServletResponse response){
    try {
        response.sendRedirect("/a.html");
    } catch (IOException e) {
        e.printStackTrace();
    }
}


@RequestMapping("/demo4")
public void demo4(HttpServletResponse response){

    try {
        response.getWriter().write("<font color='red'>hello</font>");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@RequestMapping("/demo5")
@ResponseStatus(HttpStatus.OK)  //如果handler是void類型,並且不給任何響應體,必須使用當前註解
public void demo5(){
    System.out.println("我不給瀏覽器響應");
}

String類型

string類型返回值,springmvc直接默認就是視圖名

 
    @RequestMapping("/demo6")
    public String demo6(Model model){

        //設置數據,向request域保存數據
        model.addAttribute("msg","hello");

        return "demo";
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章