spring-構建mvc工程

来源:https://www.cnblogs.com/shixiemayi/archive/2018/08/31/9568454.html
-Advertisement-
Play Games

SpringMVC基於模型-視圖-控制器(MVC)模式實現,可以構建松耦合的web應用程式。 1、SpringMVC的請求過程 1)請求離開瀏覽器,並攜帶用戶所請求的內容 2)DispatcherServlet角色為調度員(前端控制器)。查詢一個或多個處理器映射確定處理請求的控制器 3)將請求發給選 ...


SpringMVC基於模型-視圖-控制器(MVC)模式實現,可以構建松耦合的web應用程式。

1、SpringMVC的請求過程

1)請求離開瀏覽器,並攜帶用戶所請求的內容

2)DispatcherServlet角色為調度員(前端控制器)。查詢一個或多個處理器映射確定處理請求的控制器

3)將請求發給選中的控制器業務處理

4)控制器處理完成後,將業務數據封裝為模型,並指定一個邏輯視圖名,一起返回給DispatcherServlet

5)DispatcherServlet將邏輯視圖名匹配一個特定視圖實現

6)使用模型數據渲染出指定的視圖

7)返給前端展示

2、springMVC工程配置

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

    <!--<context-param>-->
        <!--<param-name>contextConfigLocation</param-name>-->
        <!--<param-value>classpath:applicationContext.xml</param-value>-->
    <!--</context-param>-->
    <!--<listener>-->
        <!--<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>-->
    <!--</listener>-->
    
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

springMvc.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:aop="http://www.springframework.org/schema/aop" 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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 掃描控制器 -->
    <context:component-scan base-package="com.cn.controller"></context:component-scan>
    <!-- 處理器映射 -->
    <mvc:annotation-driven></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>

3、控制器

 接受參數的方式

  • 查詢參數
  • 表單參數
  • 路徑變數

控制器

package com.cn.controller;

import com.cn.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.validation.Valid;


@Controller
public class HelloController {

   @RequestMapping("/home")
   public String home(){
       System.out.println("執行home");
       return "home"; //返回一個字元串,即邏輯視圖名
   }

    @RequestMapping("/home2")
    public String home2(){
        System.out.println("執行home2");
        return "redirect:home3"; //含有redirect的字元串,表示重定向到另一個處理器;
                                 //如果含有forward的字元串,表示轉向到另一個處理器
    }

    @RequestMapping("/home3")
    public String home3(){
        System.out.println("輸出home");
        return "home3";
    }

    @RequestMapping("/show3")   //表單參數,,@Valid註解與添加了校驗註解的User配合使用
    public String showPerson3(@Valid User user, Errors errors){//Errors參數必須緊跟@Valid的參數 
        if (errors.hasErrors()){//校驗是否有校驗未通過的參數
            System.out.println("表單元素校驗不通過");
            return "fail";
        }
        System.out.println("用戶信息:"+user);
        return "success";
    }

    @RequestMapping("/{name}/{age}")    //路徑參數  http://localhost:8080/tt/123 輸出:名稱:tt 年齡:123;;
    public String showPerson2(@PathVariable(value = "name") String name,
                            @PathVariable(value = "age") String age){
        System.out.println("名稱:"+name+" 年齡:"+age);
        return "success";
    }
   
    @RequestMapping("/show")    //查詢參數   http://localhost:8080/show?name=pp&age=99 輸出:名稱:pp 年齡:99;;
    public String showPerson(@RequestParam(value = "name", defaultValue = "laowang") String name,
                           @RequestParam(value = "age", defaultValue = "100") String age){
        System.out.println("名稱:"+name+" 年齡:"+age);
        return "success";
    }

}

POJO

package com.cn.pojo;

import com.sun.istack.internal.NotNull;

import javax.validation.constraints.Size;


public class User {
  //表單參數校驗
    @NotNull
    @Size(min = 6,max = 10)
    private String firstName;
    @NotNull
    @Size(min = 6,max = 10)
    private String lastName;
    @NotNull
    @Size(min = 6,max = 10)
    private String name;
    @NotNull
    @Size(min = 6,max = 10)
    private String passwd;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {

        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", name='" + name + '\'' +
                ", passwd='" + passwd + '\'' +
                '}';
    }
}

4、視圖解析器

  • 在控制器中返回的字元串(不包含redirect、forward)表示邏輯視圖名,而不會調用具體的視圖實現。spring的視圖解析器能夠決定使用哪種視圖實現去渲染模型。SpringMvc定義了一個ViewResolver 介面,返回為View對象
public interface ViewResolver {
    View resolveViewName(String var1, Locale var2) throws Exception;
}

View介面定義,其中render方法接受模型、request、response參數,並將模型數據渲染到response中

public interface View {
    String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
    String PATH_VARIABLES = View.class.getName() + ".pathVariables";
    String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";

    String getContentType();

    void render(Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}
  • 視圖解析器的實現

Spring提供了ViewResolver 多個內置的實現,比如InternalResourceViewResolver、TilesViewResolver...其中InternalResourceViewResolver(最簡單、最常用的視圖解析器將視圖解析為Web應用的內部資源(一般為jsp)

  • 創建JSP視圖

Spring支持兩種JSP視圖的方式---使用InternalResourceViewResolver

方式1:在頁面中使用JSP標準標簽庫(JSTL),InternalResourceViewResolver能夠將視圖名解析為JstlView形式的JSP文件

方式2:使用Spring提供的JSP標簽庫(兩個:一個用於表單到模型的綁定;另一個提供了通用工具類特性)

a、配置適用於JSP的視圖解析器

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/"></property>   
   <property name="suffix" value=".jsp"></property>
</bean>

  控制器中返回的字元串與該配置中的前尾碼拼接成完成的文件路徑,控制器中返回的字元串如果包含了斜線,則可以區分出了不同的目錄。該配置會將邏輯視圖名解析為InternalResourceView實例。

如過JSP中使用JSTL標簽來處理內容,則希望視圖解析器將視圖解析為JstlView實例。僅僅添加一行配置文件即可:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
   <property name="prefix" value="/WEB-INF/jsp/"></property>
   <property name="suffix" value=".jsp"></property>
</bean>

b、Spring的JSP的標簽庫

...

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 地址:http://127.0.0.1:8082/prosperleedir/index.html?id=6666&name=prosper#prosper Location{ assign:ƒ (), // 載入新的文檔。 hash:"#prosper", // 設置或返回從井號 (#) 開始的 ...
  • webpack打包工具現在非常流行,熟悉並且能夠進行配置也變得非常重要。在學習和使用的過程中遇到過很多的問題,希望能夠讓自己記錄下來,鞏固自己的學習。 1.創建文件目錄 先在自己的常用盤中(我自己的項目一般都建在E盤的一個文件夾下)創建一個文件夾,比如webpack_demo,我用的編輯器是visu ...
  • Java是一種強類型語言。通俗說就是,在Java中存儲的數據都是有類型的,而且必須在編譯時就確定其類型。 編程規範里,也強調數據要有明確的數據類型。這樣會讓代碼變得很清晰,而且會規避不必要的麻煩。 ...
  • 題意 題目描述的很清楚。。。 有一天,貝茜無聊地坐在螞蟻洞前看螞蟻們進進出出地搬運食物.很快貝茜發現有些螞蟻長得幾乎一模一樣,於是她認為那些螞蟻是兄弟,也就是說它們是同一個家族裡的成員.她也發現整個螞蟻群里有時只有一隻出來覓食,有時是幾隻,有時乾脆整個蟻群一起出來.這樣一來,螞蟻們出行覓食時的組隊方 ...
  • 鏈式前向星是一種常見的儲存圖的方式(是前向星存圖法的優化版本),支持增邊和查詢,但不支持刪邊(如果想要刪除指定的邊建議用鄰接矩陣)。 儲存方式 首先定義數組 head[ i ] 來儲存從節點 i 出發的第一條邊的下標,定義結構體 edge[ i ] 中包含三個元素 nxt, to, val, 分別儲 ...
  • 《C語言實例解析精粹》中編譯環境採用的是Turbo C 2.0。但是這個編譯器年代久遠,較新的編譯器對書中的某些例子支持不好,在學習的時候同時做一些筆記。 實例18:將一個無符號整數轉換為任意d進位(d在2~16之間)。 主要思路:對無符號整數n求d的餘數,就能得到n的d進位的最低位數字,重覆上述步 ...
  • 學習了類的繼承,今天說一下當父類與子類中有同名函數和變數時那麼程式將怎麼執行。首先明確當基類和子類有同名函數或者變數時,子類依然從父類繼承。 舉例說明: 常式說明: 父類和子類有同名的成員 data;同名函數printfa(); 子類增加兩個列印函數:void son_data();void fat ...
  • 單利模式的核心點在於只能生成1個對象,並且是由類中的靜態變數保存。以下代碼來自《深入PHP 面向對象、模式與實踐》(第三版)第9章/** * Created by PhpStorm. * User: Eilen * Date: 2018/8/31 * Time: 22:48 */class Pref ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...