Spring mvc的基礎
-
什麼是springMVC?
Spring Web MVC是一種基於Java的實現了MVC設計模式的、請求驅動型別的、輕量級Web框架。回顧:
中央控制器、子控制器
mvc具體處理業務的是:子控制器(抽象類、介面)
中央控制器:接受請求,尋找子控制器去完成業務。 -
SpringMVC處理請求的流程
2.1 首先使用者傳送請求–>DispatherServlet
2.2 DispatcherServlet–>HandlerMapping
2.3 DispatcherServlet–>HandlerAdapter
2.4 HandlerAdapter–>處理器功能處理方法的呼叫
2.5 ModelAndView的邏輯檢視名–>ViewRecolver
2.6 View–>渲染
2.7 返回控制權給DispatcherServlet,由DispatcherServlet返回呼應給使用者,流程結束 -
SpringMVC核心開發步驟
3.1 DispatcherServlet在web.xml中的部署描述,從而攔截請求到springMVC
3.2 HandlerMapping的配置,從而將請求對映到處理器
3.3 HandlerAdapter的配置,從而支援多種型別的處理器
3.4 處理器(頁面控制器)的配置,從而刊行功能處理
3.5 ViewResolver的配置,從而將邏輯檢視名解析為具體的檢視技術 -
SpringMVC的元件
4.1 前端控制器(DispatcherServlet)
4.2 請求到處理器對映(HandlerMapping)
4.3 處理器介面卡(HandlerAdapter)
4.4 檢視解析器(ViewResolver)
4.5 處理器或頁面控制器(Controller)
4.6 驗證器(Validator)
4.7. 資料轉換元件(DataBinder)
4.8. 訊息轉換器元件(HttpMessageConverter)
4.9 命令物件(Command 請求引數繫結到的物件就叫命令物件)
4.10 表單物件(Form Object提供給表單展示和提交到的物件就叫表單物件)
ps:
一.SpringMVC中的元件及各個元件的作用?
1.DispatherServlet:前置控制器,負責接收並處理所有的web請求,根據handlerMapping找到具體的Controller,由controller完成具體的處理邏輯。
2.HandlerMapping:負責處理web請求和具體的Controller之間的對映關係匹配。
3.Controller:DispatherServlet的次級控制器,web請求的具體處理者。DispatherServlet獲得handlerMapping的返回結果後,呼叫controller的處理方法處理當前的業務請求,處理完成後返回ModelAndView物件。
4.ViewResolver:用來處理檢視名與具體的view例項之間的對映對應關係。根據ModelAndView中的檢視名查詢相應的View實現類,然後將查詢的結果返回給DispatcherServlet,DispatcherServlet最終會將ModelAndView中的模型資料交給返回的View處理最終的檢視渲染工作。
5.View:為支援多種檢視技術而存在,統一抽象檢視的生成策略,根據模型資料輸出具體的檢視。
原文:https://blog.csdn.net/sunhuiliang85/article/details/9531779
- 如何在專案中新增springmvc
1、匯入springmvc的依賴(注意:用自定義標籤庫,需要三個jstl、standard、tomcat-jsp-api)
2、匯入springmvc框架的配置檔案(掃描controller包、檢視解析器)
3、配置web.xml 配置中央控制器(dispatchservlet)
5.1 新增相關依賴
注意裡面的tomcat-jsp-api必須要與你的tomcat的執行版本一樣,要不然會報 一些莫名其妙的錯
<!-- ********************** JSTL依賴 ********************** -->
<!-- 缺少下面的這兩個jar包會報java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
<!-- 原因:org.springframework.web.servlet.view.JstlView在檢視解析時需要這二個jar包-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>8.0.47</version>
</dependency>
5.2 在WEB-INF下新增springmvc-servlet.xml(spring-mvc.xml)
程式碼分享:
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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
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-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--開啟事務管理器,如果沒有開啟事務管理器,那麼在前面的分頁就無法使用-->
<aop:aspectj-autoproxy/>
<!-- 通過context:component-scan元素掃描指定包下的控制器-->
<!--1) 掃描com.zking.zf及子子孫孫包下的控制器(掃描範圍過大,耗時)-->
<context:component-scan base-package="com.zking.ssm"/>
<!--1) use-dafault-filters="false"的情況下,根據表示式包含(include-filter)或排除(exclude-filter)指定包-->
<!--<context:component-scan base-package="com.zking.zf" use-default-filters="false">-->
<!--<context:include-filter type="regex" expression=".+\.controller\..*"/>-->
<!--<context:exclude-filter type="regex" expression=".+\.controller2\..*"/>-->
<!--</context:component-scan>-->
<!--2) 此標籤預設註冊DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!--兩個bean,這兩個bean是spring MVC為@Controllers分發請求所必須的。並提供了資料繫結支援,-->
<[email protected]支援,@DateTimeFormat支援,@Valid支援,讀寫XML的支援(JAXB),讀寫JSON的支援(Jackson)-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--3) ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass需要在pom中引入兩個包:standard.jar and jstl.jar -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
<resources location="/static/" mapping="/static/**" cache-period="86400" />
</bean>
<!--4) 單獨處理圖片、樣式、js等資源 -->
<!--<mvc:resources location="/css/" mapping="/css/**"/>-->
<mvc:resources location="/images/" mapping="/images/**"/>
<!--<mvc:resources location="/js/" mapping="/js/**"/>-->
</beans>
5.3 修改web.xml
程式碼分享:
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_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!-- Spring和web專案整合start -->
<!-- spring上下文配置檔案 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 讀取Spring上下文的監聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring和web專案整合end -->
<!-- 防止Spring記憶體溢位監聽器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- 中文亂碼處理 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.zking.zf.util.EncodingFiter</filter-class>
<!--web.xml 3.0的新特性,是否支援非同步-->
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--此引數可以不配置,預設值為:/WEB-INF/springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--web.xml 3.0的新特性,是否支援非同步-->
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 第一個springMVC程式:HelloWorld
程式碼分享:
HelloWorld.java
package com.zking.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* @author cjl
* @site www.xiaomage.com
* @company
* @create 2018-12-22 14:19
*/
@Controller
public class HelloControlle {
@RequestMapping("/hello")
public String list(HttpServletRequest request){
System.out.println("hello hsndks");
request.setAttribute("me","我就是我,不一樣的煙火");
return "hello";
}
@RequestMapping("/hello2")
public ModelAndView list2(){
ModelAndView mav =new ModelAndView();
System.out.println("hello spring mvc");
mav.setViewName("hello");
mav.addObject("me","藍色的多瑙河");
return mav;
}
}
- 頁面跳轉
7.1 轉發:"forward:path
"
7.2 重定向:"redirect:path
"
注1:這兩種跳轉方式將會繞開檢視解析器的字首和字尾
注2:還有就是如果是在同一controller中則不用使用"/"從根目錄開始,而如果是在不同的controller則一定要從根目錄開始。
- 訪問其它的靜態資源(被springmvc攔截了)
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/static/" mapping="/static/**" cache-period="86400" />
SpringMVC會自動給靜態資源Response新增快取頭Cache-Control和Expires值
- 常用註解
9.1 @Controller:用於標識處理器類
9.2 @RequestMapping:請求到處理器功能方法的對映規則,可定義到類和方法
常用引數:value、method
可將@RequestMapping標籤定義到類名處窄化路徑
9.3 @RequestParam:請求引數到處理器功能處理方法的方法引數上的繫結
常用引數:value、required、defaultValue
注:required設定成false的引數型別必須是引用型別,因為基本資料型別是不能為null的
9.4 @ModelAttribute:請求引數到命令物件的繫結
常用引數:value
9.4.1 可用@ModelAttribute標註方法引數,方法引數會被新增到Model物件中(作用:向檢視層傳資料)
9.4.2 可用@ModelAttribute標註一個非請求處理方法,此方法會在每次呼叫請求處理方法前被呼叫(作用:資料初始化)
9.4.3 可用@ModelAttribute標註方法,方法返回值會被新增到Model物件中(作用:向檢視層傳資料)
但此方法檢視的邏輯圖就會根據請求路徑解析,例如:a/test42 --> /WEB-INF/a/test42.jsp
太麻煩幾乎不用,不用直接儲存到Model或ModelAndView中
9.5 @SessionAttributes:指定ModelMap中的哪些屬性需要轉存到session
常用引數:value、types
注1:必須放到class類名處
9.6 @InitBinder(本章暫不介紹):用於將請求引數轉換到命令物件屬性的對應型別
9.7 @RequestBody(重要~~~~~):用於目前比較流行的ajax開發的資料繫結(即提交資料的型別為json格式)
注1:使用@RequestBody註解的時候,前臺的Content-Type必須要改為application/json,
如果沒有更改,前臺會報錯415(Unsupported Media Type)。
後臺日誌就會報錯Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。
這些錯誤Eclipse下Tomcat是不會顯示錯誤資訊的,只有使用了日誌才會顯示
$.ajax({
url : "jsontest",
type : "POST",
async : true,
contentType : "application/json",
data : JSON.stringify(json),
dataType : 'json',
success : function(data) {
if (data.userstatus === "success") {
$("#errorMsg").remove();
} else {
if ($("#errorMsg").length <= 0) {
$("form[name=loginForm]").append(errorMsg);
}
}
}
});
10、crud
<aop:aspectj-autoproxy expose-proxy=“true”></aop:aspectj-autoproxy>
結果集配置
forward:對映
redirect:對映
forward:xxx.jsp
redirect:xxx.jsp