1. 程式人生 > 其它 >SSM學習之SpringMVC-一、springmvc 概述

SSM學習之SpringMVC-一、springmvc 概述

一、springmvc 概述

1.1 springmvc定義

    基於spring的一個框架,實際上就是spring的一個模組,專門是做web開發的,理解為servlet的升級。web開發底層是servlet,框架是在servlet基礎上面加入一些功能,讓開發更方便。

1.2 spring和springmvc對比

    spring:spring是容器,ioc能夠管理物件,
    使用< bean>,@Component,@Repository,@Service,@Controller 標籤

    springmvc:能夠建立物件,放入到容器中(springmvc容器),spring容器中放的是控制器物件

1.3 springmvc簡要流程

    我們要做的是 使用 

二、開發步驟

2.1、做一個小demo

    index.jsp —> DispatcherServlet(中央排程器,類似servlet) ----> 轉發,分配給Controller物件(@Controller 註解建立的物件)

開發流程:

  • 發起some.do請求
  • tomcat (web.xml 從url-pattern知道 *.do 的請求給DispatcherServlet)
  • DispatcherServlet(根據spring.xml配置知道some.do,doSome()方法)
  • DispatcherServlet把some.do轉發給MyController.doSome()方法
  • 框架執行doSome()把得到的ModelAndView進行處理,轉發到show.jsp

簡化流程:

some.do -> DispatcherServlet -> MyController
  img

在pom.xml中引入servlet和springmvc依賴

<!--servlet-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <scope>provided</scope>
</dependency>

<!--spring mvc-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>

核心配置檔案 web.xml

  • (自定義配置檔案的位置<init-param>:在resources目錄下建立配置檔案,new->XML Configuration File->Spring Config,然後在web.xml下指定自定義配置檔案的位置即可)
  • 之前servlet-name報錯是因為沒有設定servlet-mapping對映,設定完就不報錯了
<?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">

        <!--宣告:註冊springmvc的核心物件DispatcherServlet

        需要在tomcat伺服器啟動後,建立DispatcherServlet物件例項

        為什麼要建立DispatcherServlet物件的例項呢?
        因為在DispatcherServlet建立過程中,會同時建立springmvc容器物件,
        讀取springmvc的配置檔案,把這個配置檔案中的物件都配置好,
        當用戶發起請求時就可以直接使用物件了。

        servlet的初始化會執行init()方法,DispatcherServlet在init()中{
            //建立容器,讀取配置檔案
            webApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
            //把容器物件放入到ServletContext中
            getServletContext().setAttribute(key,ctx);
         }
    -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--自定義springmvc讀取檔案的位置-->
        <init-param>
            <!--springmvc配置檔案的位置屬性-->
            <param-name>contextConfigLocation</param-name>
            <!--指定自定義檔案的位置-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>

        <!--表示在tomcat啟動後,建立servlet物件
            數字表示啟動後建立物件的順序,數值越小,tomcat建立物件越早,要求大於等於0的整數
        -->
        <load-on-startup>1</load-on-startup>

    </servlet>

        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <!--
                使用框架的時候,url-pattern可以使用兩種值
                1.使用副檔名方式,語法 *.xxxx , xxxx時自定義副檔名。常用的方式 *.do, *.action, *.mvc等等
                    http://localhost:8080/myweb/some.do
                    http://localhost:8080?myweb/other.do
                2.使用斜槓"/"
            -->
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
</web-app>

上面已經指定了中央排程器的位置,那麼我們現在就在指定的位置建立springmvc.xml

  • 宣告元件掃描器(controller)
<?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 https://www.springframework.org/schema/context/spring-context.xsd">

<!--    宣告元件掃描器-->
    <context:component-scan base-package="com.laj.controller"/>
</beans>

聲明瞭Controller後,我們就在com.laj.controller.MyController.java 建立控制類

  • 設定對映請求,new ModelAndView(),根據K-V的形式存放資料
  • 設定資料返回的檢視,setViewName
package com.laj.controller;

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

/**
 * @Controller 建立處理器物件,物件放在SpringMVC容器中
 */
@Controller
public class MyController {
    /*
        處理使用者的請求,SpringMVC中是使用方法來處理的
        方法是自定義的,可以有多種返回值,多種引數,方法名稱自定義
     */

    /**
     * 準備使用doSome 方法處理some.do請求
     * @return
     */
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        //處理some.do的請求
        ModelAndView mv = new ModelAndView();
        //K-V形式
        mv.addObject("msg1","Hello World!");
        mv.addObject("msg2","Hello World!!");

        mv.setViewName("/show.jsp");
        return mv;
    }
    @RequestMapping(value = "anny.do")
    public ModelAndView anny(){
        //處理some.do的請求
        ModelAndView mv = new ModelAndView();
        //K-V形式
        mv.addObject("value1","我是程式設計天才!");
        mv.addObject("value2","是的!");

        mv.setViewName("/show.jsp");
        return mv;
    }
}

上面設定了資料返回的檢視後,我們開始建立檢視

(由於我們一開始沒有建立主頁面,現在這裡補上index.jsp)

<%--
  Created by IntelliJ IDEA.
  User: 11877
  Date: 2021/7/4
  Time: 1:17
  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>
    <p>第一個MVC的專案</p>
    <p><a href="some.do">發起一個some.do請求</a></p>
    <p><a href="anny.do">發起一個anny.do請求</a></p>
</body>
</html>

在主頁面中,有兩個不同的請求頁面, 根據不同的請求頁面中,有兩個不同的Controller類中的方法返回的值可以獲取到。

接下來我們建立超連結裡面的檢視 資料通過 ${} 的格式進行書寫

<%--
  Created by IntelliJ IDEA.
  User: 11877
  Date: 2021/7/4
  Time: 1:50
  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>
  <h3>show.jsp從request作用域獲取資料</h3><br />
  <h4>msg1資料:${msg1}</h4>
  <h4>msg2資料:${msg2}</h4>
  <h4>msg2資料:${value1}</h4>
  <h4>msg2資料:${value2}</h4>

</body>
</html>

如此一個完整的SpringMVC 的demo就完成啦!

注意:檔案的路徑圖

  img

2.2、防止使用者不在網頁內請求下直接訪問內部網站

解決辦法:將檢視檔案(.jsp)放到WEB-INF下的資料夾下

導致:setViewName請求的網站需要改成/WEB-INF/view/show.jsp

如果有多個請求的網站頁面,增加字首的方式將很繁瑣

解決辦法:在springmvc.xml中宣告檢視解析器,使用bean註冊字首和字尾

<!--    宣告檢視解析器,幫助開發人員設定檢視檔案的路徑  InternalResourceViewResolver-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--        字首:檢視檔案的路徑-->
        <property name="prefix" value="/WEB-INF/view/"/>
<!--        字尾:檢視檔案的副檔名-->
        <property name="suffix" value=".jsp"/>
    </bean>

讓MyController中setViewName("/WEB-INF/view/show.jsp")--->MyController中setViewName("show")

三、註解式開發

3.1@RequestMapping

放在類上面@RequestMapping("/user"),表示下面的請求都是基於/user/xxx.xx,便於模組化操作

放在方法上@RequestMapping(value="/xxx.xx",method = RequestMethod.GET)   -->表示get請求方式

RequestMethod.GET、RequestMethod.POST……

如果method不寫就不限制

**注意**:在Controller中設定GET或者POST,在index中也要對應,否則會報 **錯誤405**

3.2處理器方法的引數

處理器方法可以包含以下四類引數,這些引數會在系統呼叫時由系統自動賦值,即程式設計師可以在方法中直接使用。

HttpServletRequest request, 請求
HttpServletResponse response, 應答
HttpSession session 會話

請求中所攜帶的請求引數(即使用者提交的資料)

@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(HttpServletRequest request,
                               HttpServletResponse response,
                               HttpSession session){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","歡迎使用springmvc做web開發" + request.getParameter("name"));
        mv.addObject("fun","執行的是doSome方法");
        mv.setViewName("show");
        return mv;
    }
  http://www.sczw.com/webnews/39993.html http://www.sczw.com/webnews/39994.html 在這裡插入圖片描述

3.3逐個引數接收

設定主頁index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>提交引數給Controller</p>

    <form action="receive.do" method="post">
        姓名:<input type="text" name="name"><br />
        年齡:<input type="text" name="age"><br />
        <input type="submit" value="提交引數">
    </form>
</body>
</html>

<注意:1、action後面的域名前面不要加/

          2、input後面的引數是對應的事type和**name**>

業務層:

@Controller
public class MyController {

    @RequestMapping(value = "/receive.do")
    public ModelAndView doSome(String name ,String age){
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }

}

檢視層:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <h3>從request作用域獲取資料</h3><br />
  <h3>name資料:${myname}</h3><br/>
  <h3>age資料:${myage}</h3>
</body>
</html>

注意:在提交請求引數的時候,get請求方式中文沒有亂碼;post請求方式中文有亂碼,需要使用過濾器處理亂碼問題。

使用過濾器處理post中文亂碼:characterEncodingFilter 在org. springframework: spring-web: 5.2.5. RELEASE依賴中

所以在web.xml檔案中配置:三個引數:encoding、forceRequestEncoding、forceResponseEncoding,通過mapping對映,最後強制範圍內請求通過過濾器

<!--註冊宣告過濾器,解決post請求亂碼-->
    <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>
<!--        強制請求物件(HttpServletRequest)使用encoding編碼的值-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
<!--        強制應答物件(HttpServletResponse)使用encoding編碼的值-->
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
<!--        /*表示強制所有的請求先通過過濾器處理-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

總結:


  SpringMVC總結歸納