我們開發服務器端程序,通常都基於兩種形式,一種C/S架構程序,一種B/S架構程序html
使用Java語言基本上都是開發B/S架構的程序,B/S架構又分紅了三層架構前端
三層架構java
3.1 表現層:WEB層,用來和客戶端進行數據交互的。表現層通常會採用MVC的設計模型git
3.2 業務層:處理公司具體的業務邏輯的github
3。3 持久層:用來操做數據庫的web
關係流程圖: ajax
1. SpringMVC的概述spring
1. 是一種基於Java實現的MVC設計模型的請求驅動類型的輕量級WEB框架。
2. Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裏面。Spring 框架提供
了構建 Web 應用程序的全功能 MVC 模塊。
3. 使用 Spring 可插入的 MVC 架構,從而在使用Spring進行WEB開發時,能夠選擇使用Spring的
SpringMVC框架或集成其餘MVC開發框架,如Struts1(如今通常不用),Struts2等。
複製代碼
2. SpringMVC在三層架構中的位置 數據庫
表現層框架2.1 SpringMvc的流程圖apache
2.2 SpringMvc的執行步驟Http 請求到 DispatcherServlet
(1) 客戶端請求提交到 DispatcherServlet。 HandlerMapping 尋找處理器
(2) 由 DispatcherServlet 控制器查詢一個或多個 HandlerMapping,找處處理請求的 Controller。
調用處理器 Controller
(3) DispatcherServlet 將請求提交到 Controller。
Controller 調用業務邏輯處理後,返回 ModelAndView
(4)(5)調用業務處理和返回結果:Controller 調用業務邏輯處理後,返回 ModelAndView。
DispatcherServlet 查詢 ModelAndView
(6)(7)處理視圖映射並返回模型: DispatcherServlet 查詢一個或多個 ViewResoler 視圖解析器, 找到 ModelAndView 指定的視圖。
ModelAndView 反饋瀏覽器 HTTP
(8) Http 響應:視圖負責將結果顯示到客戶端。
3. SpringMVC的優點
一、清晰的角色劃分:
前端控制器(DispatcherServlet)
請求處處理器映射(HandlerMapping)
處理器適配器(HandlerAdapter)
視圖解析器(ViewResolver)
處理器或頁面控制器(Controller)
驗證器( Validator)
命令對象(Command 請求參數綁定到的對象就叫命令對象)
表單對象(Form Object 提供給表單展現和提交到的對象就叫表單對象)。
二、分工明確,並且擴展點至關靈活,能夠很容易擴展,雖然幾乎不須要。
三、因爲命令對象就是一個 POJO,無需繼承框架特定 API,可使用命令對象直接做爲業務對象。
四、和 Spring 其餘框架無縫集成,是其它 Web 框架所不具有的。
五、可適配,經過 HandlerAdapter 能夠支持任意的類做爲處理器。
六、可定製性,HandlerMapping、ViewResolver 等可以很是簡單的定製。
七、功能強大的數據驗證、格式化、綁定機制。
八、利用 Spring 提供的 Mock 對象可以很是簡單的進行 Web 層單元測試。
九、本地化、主題的解析的支持,使咱們更容易進行國際化和主題的切換。
十、強大的 JSP 標籤庫,使 JSP 編寫更容易。
………………還有好比RESTful風格的支持、簡單的文件上傳、約定大於配置的契約式編程支持、基於註解的零配
置支持等等。
複製代碼
4. SpringMVC和Struts2框架的對比
**共同點:**
它們都是表現層框架,都是基於 MVC 模型編寫的。
它們的底層都離不開原始 ServletAPI。
它們處理請求的機制都是一個核心控制器。
**區別:**
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
Spring MVC 是基於方法設計的,而 Struts2 是基於類,Struts2 每次執行都會建立一個動做類。所
以 Spring MVC 會稍微比 Struts2 快些。
Spring MVC 使用更加簡潔,同時還支持 JSR303, 處理 ajax 的請求更方便
(JSR303 是一套 JavaBean 參數校驗的標準,它定義了不少經常使用的校驗註解,咱們能夠直接將這些注
解加在咱們 JavaBean 的屬性上面,就能夠在須要校驗的時候進行校驗了。)
Struts2 的 OGNL 表達式使頁面的開發效率相比 Spring MVC 更高些,但執行效率並無比 JSTL 提
升,尤爲是 struts2 的表單標籤,遠沒有 html 執行效率高。
複製代碼
入門小項目流程圖解:
1. 建立WEB工程,引入開發的jar包2.1. 具體的座標以下
複製代碼
<?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>com.baoji</groupId>
<artifactId>springmvc_01_start</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc_01_start Maven Webapp</name>
<!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 配置maven編譯的版本號--> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <!-- 版本鎖定 --> <spring.version>5.0.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> </dependency> </dependencies> <build> <finalName>springmvc_01_start</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project> 複製代碼
2. 配置核心的控制器(配置DispatcherServlet)
1. 在web.xml配置文件中核心控制器DispatcherServlet(前端控制器很重要)
複製代碼
<!-- SpringMVC的核心控制器 --> <servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet- class>
<!-- 配置Servlet的初始化參數,讀取springmvc的配置文件,建立spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet啓動時加載對象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> </servlet-mapping>
<!-- 配置過濾器 解決中文亂碼問題 -->
<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>
複製代碼
3. 編寫springmvc.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring建立容器時要掃描的包 -->
<context:component-scan base-package="com.baoji.controller"></context:component-scan>
<!-- 配置視圖解析器對象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置要轉發的成功頁面路徑 -->
<property name="prefix" value="/WEB-INF/pages/"/>
<!-- 配置以.jsp結尾的當前頁面 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置自定義類型轉換器
ConversionServiceFactoryBean : 框架本身的類型轉換器的類
converters: 類中的屬性,使用集合存儲(打開源碼看屬性)
class: 爲自定義類型轉換器的全類名
-->
<bean id="ConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.baoji.util.StringToDateConverter"/>
</set>
</property>
</bean>
<!--
開啓springmvc框架註解的支持
annotation-driven :默認使springmvc框架的適配器,處理器,映射器生效
conversion-service : 讓本身的自定義轉換器生效
-->
<mvc:annotation-driven conversion-service="ConversionService"/>
</beans>
複製代碼
4. 編寫index.jsp和HelloController控制器類
index.jsp
複製代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>入門程序</title>
</head>
<body>
<h3>入門springmvc程序</h3>
<a href="/hello">入門程序</a>
</body>
</html>
複製代碼
HelloController.java
複製代碼
package com.baoji.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//添加控制器註解,使用spring IOC容器進行管理,將類轉換爲對象
@Controller
public class HelloController {
//配置須要訪問的路徑註解
@RequestMapping(path = "/hello")
public String sayHello(){
System.out.println("Hello SpringMvc");
return "success";
}
}
複製代碼
SpringMVC 的請求響應流程
3. 入門程序的執行過程分析程序執行流程圖:
SpringMvc框架基於組件方式執行流程1.RequestMapping註解的做用是創建請求URL和處理方法之間的對應關係 2.RequestMapping註解能夠做用在方法和類上
1.做用在類上:第一級的訪問目錄
2.做用在方法上:第二級的訪問目錄
3.細節:路徑能夠不編寫/表示應用的根目錄開始
4.細節:${pageContext.request.contextPath}也能夠省略不寫,可是路徑上不能寫/3.RequestMapping的屬性
複製代碼
1.path 指定請求路徑的url(經常使用)
2.value屬性和path屬性是同樣的(經常使用)
3.mthod指定該方法的請求方式(經常使用)
4.params指定限制請求參數的條件
5.headers發送的請求中必須包含的請求頭
若是使用多級目錄配置RequestMapping註解,則前端請求跳轉相對徑必須填寫多級目錄1.請求參數的綁定說明
1.表單提交的數據都是k=v格式的username=haha&password=123
2.SpringMVC的參數綁定過程是把表單提交的請求參數,做爲控制器中方法的參數進行綁定的
3.要求:提交表單的name和參數的名稱是相同的
複製代碼
2.支持的數據類型
1.基本數據類型和字符串類型
2.實體類型(JavaBean)
3.集合數據類型(List、map集合等)
複製代碼
3.實體類型(JavaBean)
1.提交表單的name和JavaBean中的屬性名稱須要一致
2.若是一個JavaBean類中包含其餘的引用類型,那麼表單的name屬性須要編寫成:對象.屬性例如:address.name
3.集合屬性數據封裝
1.JSP頁面編寫方式:list[0].屬性
2.JSP頁面編寫方式:map[key].屬性
複製代碼
示例代碼:(類中有如對象、list、msp的引用類型時,將引用類型做爲屬性,添加get和set方法、toString方法便可)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>請求參數的綁定</title>
</head>
<body>
<!-- 請求參數的綁定 -->
<%-- <a href="param/testParam?username=hehe&password=123">請求參數綁定</a> --%>
<!-- 請求參數的綁定 (將請求參數封裝爲javaBean類中)-->
<!--
name值爲javaBean中的屬性
封裝在javaBean中的對象屬性,name值必須爲對象.屬性
-->
<form action="param/saveAccount" method="post">
用戶名:<input type="text" name="username"><br/>
密碼:<input type="password" name="password"><br/>
金額:<input type="text" name="money"><br/>
姓名:<input type="text" name="user.uname"><br/>
年齡:<input type="text" name="user.age"><br/>
<input type="submit" value="提交">
</form>
<!--
name值爲javaBean中的屬性
封裝在javaBean中的集合屬性,list集合: name值必須爲list[0].uname;
map集合: name值必須爲map['字符串'].age;
-->
<form action="param/saveAccount" method="post">
用戶名:<input type="text" name="username"><br/>
密碼:<input type="password" name="password"><br/>
金額:<input type="text" name="money"><br/>
姓名:<input type="text" name="list[0].uname"><br/>
年齡:<input type="text" name="list[0].age"><br/>
姓名:<input type="text" name="map['username'].uname"><br/>
年齡:<input type="text" name="map['username'].age"><br/>
<input type="submit" value="提交">
</form>
<!-- 自定義類型轉換器 -->
<form action="param/saveUser" method="post">
姓名:<input type="text" name="uname"><br/>
年齡:<input type="text" name="age"><br/>
日期:<input type="text" name="date"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
複製代碼
get 請求方式: tomacat
對GET
和POST
請求處理方式是不一樣的,GET
請求的編碼問題,要改 tomcat
的 server.xml
配置文件,以下:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>
複製代碼
改成:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>
複製代碼
若是遇到ajax
請求仍然亂碼,請把:
useBodyEncodingForURI="true"改成 URIEncoding="UTF-8"
便可。
tomcat8.0版本以後,get請求不須要設置編碼格式,內部已經對中文作了處理,能夠識別中文編碼
post請求須要手動設置請求中文編碼方式
request.setCharacterEncoding("utf-8");
或者設置對post請求設置響應中文編碼解碼格式response.setContentType("text/html;charset=utf-8");
在SpringMvc框架中對請求參數中文亂碼的方法:
<!-- 配置過濾器 解決中文亂碼問題 -->
<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>
複製代碼
1.表單提交的任何數據類型所有都是字符串類型,可是後臺定義Integer類型,數據也能夠封裝上,說明Spring框架內部會默認進行數據類型轉換。
2.若是想自定義數據類型轉換,能夠實現Converter的接口
例如:表單提交的時間格式(springMvc默認字符串格式:2019/11/12),若是想設置爲自定義方式的時間格式,就要將String類型
轉換爲Date類型
類型轉換器示例代碼:
1.自定義類型轉換器
package com.baoji.util;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 把字符串轉換成日期格式
*/
public class StringToDateConverter implements Converter<String, Date> {
/**
*
* @param source 傳入進來字符串
* @return
*/
@Override
/**
* 進行類型轉換的方法
*/
public Date convert(String source) {
//判斷操做
if(source == null){
throw new RuntimeException("請您輸入參數");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
//將字符串轉換爲日期類型
return df.parse(source);
} catch (Exception e) {
throw new RuntimeException("數據類型轉換出現錯誤");
}
}
}
複製代碼
2.註冊自定義類型轉換器,在springmvc.xml配置文件中編寫配置
<!-- 配置自定義類型轉換器
ConversionServiceFactoryBean : 框架本身的類型轉換器的類
converters: 類中的屬性,使用集合存儲(打開源碼看屬性)
class: 爲自定義類型轉換器的全類名
-->
<bean id="ConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.baoji.util.StringToDateConverter"/>
</set>
</property>
</bean>
<!--
開啓springmvc框架註解的支持
annotation-driven :默認使springmvc框架的適配器,處理器,映射器生效
conversion-service : 讓本身的自定義轉換器生效
-->
<mvc:annotation-driven conversion-service="ConversionService"/>
複製代碼
1.只須要在控制器的方法參數定義HttpServletRequest和HttpServletResponse對象
推薦本身的Github
地址: github.com/Lmobject
您的點贊與關注是對做者作大的支持與鼓勵。謝謝!!!
複製代碼
下一篇博客:SpringMvc經常使用註解以及響應數據類型