轉載請注明出處:
牽手生活--頭條新聞:筆記是整理思路方式钠龙,分享是一個美德炬藤,牽手是我的生活方式
牽手生活--簡書:筆記是整理思路方式,分享是一個美德碴里,牽手是我的生活方式
什么是SpringMVC
SpringMvc是spring的一個模塊沈矿,基于MVC的一個框架,無需中找工作最主要的還是要買尺度
標準MVC模型概述
MVC模型:是一種架構型的模式咬腋,本身不引入新功能羹膳,只是幫助我們將開發(fā)的結構組織的更加合理,使展示與模型分離根竿、流程控制邏輯陵像、業(yè)務邏輯調用與展示邏輯分離。如下圖(圖2-2)所示
MVC(Model-View-Controller)的概念
首先讓我們了解下MVC(Model-View-Controller)的概念:
Model(模型):數(shù)據(jù)模型寇壳,提供要展示的數(shù)據(jù)醒颖,因此包含數(shù)據(jù)和行為,可以認為是領域模型(domain)或JavaBean組件(包含數(shù)據(jù)和行為)壳炎,不過現(xiàn)在一般都分離開來:Value Object(數(shù)據(jù)) 和 服務層(行為)泞歉。也就是模型提供了模型數(shù)據(jù)查詢和模型數(shù)據(jù)的狀態(tài)更新等功能,包括數(shù)據(jù)和業(yè)務冕广。
View(視圖):負責進行模型的展示疏日,一般就是我們見到的用戶界面,客戶想看到的東西撒汉。
Controller(控制器):接收用戶請求,委托給模型進行處理(狀態(tài)改變)涕滋,處理完畢后把返回的模型數(shù)據(jù)返回給視圖睬辐,由視圖負責展示。 也就是說控制器做了個調度員的工作。
從圖-標準MVC模型 我們還看到溯饵,在標準的MVC中模型能主動推數(shù)據(jù)給視圖進行更新(觀察者設計模式侵俗,在模型上注冊視圖,當模型更新時自動更新視圖)丰刊,但在Web開發(fā)中模型是無法主動推給視圖(無法主動更新用戶界面)隘谣,因為在Web開發(fā)是請求-響應模型。
Spring MVC基本概念
- request瀏覽器端過來啄巧,首先到達DispatcherServlet寻歧,所有他都攔截到,然后通過HandlerMapping 去找Controller秩仆。通過annatation告訴handlerMapping要找的controller和Handlerinterceptor码泛,把他們形成了一個HandlerExcutionChain執(zhí)行鏈條,作為一個handler 或HandlerAdapter返回給了我們的DispatchServlet澄耍,在去調用一般化的處理器
- Handler或HandlerAdapter生成我們的模型在返還給DispatcherServlet ,他再調用視圖解析器噪珊,返回視圖對象view
-然后我們的modeland view 傳遞數(shù)據(jù)給view完成我們的試圖呈現(xiàn);
特別說明:黑色不管齐莲,斜體可寫可不寫痢站,粗體是自己需要寫的,剩下藍色配置就行选酗。
idea中創(chuàng)建工程
填寫GroupId和ArtifactId還有Version阵难,這三個屬性目的是標識你的項目的唯一性
項目創(chuàng)建完成界面 --會去下載一下依賴庫
等待時間:根據(jù)你的網(wǎng)速及Maven中央倉庫而定
- src/main下創(chuàng)建了一個recources文件夾,該文件夾一般用來存放一些資源文件
- webapp文件夾星掰,用來存放web配置文件以及jsp頁面等
-
選擇右邊紅框的Enable-Auto-Import多望,可以在每次修改pom.xml后,自動的下載并導入jar包
初始目錄結構介紹
項目剛創(chuàng)建后的pom.xml配置信息
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.younghare</groupId>
<artifactId>SpringMVCDemo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringMVCDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>SpringMVCDemo</finalName>
</build>
</project>
可以看到這個文件包含了我們之前定義的本項目的groupId氢烘、artifactId等信息怀偷,這些信息是該項目的標識,我們不要去改動它們播玖。
重點看<dependencies>依賴標簽椎工,也就是說把對每個包的需求都稱為一個依賴<depedency>,定義在<dependencies>中蜀踏。
在每個<depedency>中维蒙,你需要提供的是所需jar包的groupId、artifactId果覆、version這三個必要信息颅痊。可到mvnrepository去查詢局待,比如 spring-core的4.2.5.RELEASE版本
查詢結果是
http://mvnrepository.com/artifact/org.springframework/spring-core/4.2.5.RELEASE
- 建議把注釋部分也copy進來
- 由于前面新建工程后選擇了Enable Auto Import功能斑响,Maven就會開始自動下載jar包到本地倉庫菱属,然后關聯(lián)到你的項目中,
查看工程結構
我們按 ctrl+alt+shift+s舰罚,或者File->Project Structure查看一下項目結構纽门,看看有什么問題:
工程配置
先做一些配置,選擇Modules营罢,在SpringMVCDemo的src\main文件夾中新建一個文件夾赏陵,取名為java然后Mark as Sources(java :源碼目錄;resources:資源目錄饲漾;test:單元測試代碼目錄蝙搔;)
選中java文件夾,點擊上面的Make as:Sources能颁,該文件夾就會變成藍色杂瘸,用以保存java代碼
同樣創(chuàng)建一個test目錄并 Make as :Tests,用于存放測試文件的目錄
在pom.xml中配置mvc應用需要依賴的包
pom.xml中定義一些工程版本變量 ,方便之后修改版本
<properties>
<commons-lang.version>2.6</commons-lang.version>
<slf4j.version>1.7.6</slf4j.version>
<spring.version>4.2.5.RELEASE</spring.version>
<jackson.version>2.7.4</jackson.version>
</properties>
在pom.xml中添加依賴管理dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在pom.xml中的<dependencies>部分添加所以依賴軟件包
- org.springframework :spring框架包
- commons-lang :apche 的Commons下的Lang伙菊,提供各種字符串處理败玉、日期處理等工具類
- org.slf4j :slf4j是日志的接口
- javax.servlet :java web的servlet
- commons-fileupload :文件上傳下載
- com.fasterxml.jackson.core:ackson-core提供的JsonParser和JsonGenerator來實現(xiàn)基本的序列化和反序列化
現(xiàn)在看看pom.xml的完整代碼
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.younghare</groupId>
<artifactId>SpringMVCDemo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringMVCDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<!--軟件報版本配置信息-->
<properties>
<commons-lang.version>2.6</commons-lang.version>
<slf4j.version>1.7.6</slf4j.version>
<spring.version>4.2.5.RELEASE</spring.version>
<jackson.version>2.7.4</jackson.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--所以依賴包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
<build>
<finalName>SpringMVCDemo</finalName>
</build>
</project>
到這來作為我們一般的mvc應用這些依賴已經做夠了,如果后面還需要添加依賴镜硕,可以在這邊繼續(xù)添加运翼。
IDEA中,Maven項目POM文件中的依賴未報錯(出現(xiàn)紅色波浪線)兴枯,但Maven Projects中的模塊的Dependencies中的依賴卻報錯
下面開始創(chuàng)建web應用
創(chuàng)建對應的目錄結構
創(chuàng)建幾個要用的包與目錄血淌,mvc-dispatcher-servlet.xml先不管
web.xml配置--添加SpringMVC的支持
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>SpringMVC實戰(zhàn)</display-name>
<!-- Spring應用上下文, 理解層次化的ApplicationContext -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>
</context-param>
<!-- DispatcherServlet, Spring MVC的核心 -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet對應的上下文配置财剖, 默認為/WEB-INF/$servlet-name$-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- mvc-dispatcher攔截所有的請求 不同url來源的劃分依據(jù)-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
配置mvc-dispatcher-servlet.xml(名稱可變悠夯,主要是web.xml保持一致)
創(chuàng)建spring的配置文件mvc-dispatcher-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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
修改mvc-dispatcher-servlet.xml(提示找不到時,可以用IDEA自動導入)
<?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">
<!-- 本配置文件是工名為mvc-dispatcher的DispatcherServlet使用躺坟, 提供其相關的Spring MVC配置 -->
<!-- 啟用Spring基于annotation的DI, 使用戶可以在Spring MVC中使用Spring的強大功能沦补。 激活 @Required
@Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等標注 -->
<context:annotation-config />
<!-- DispatcherServlet上下文, 只管理@Controller類型的bean咪橙, 忽略其他型的bean, 如@Service -->
<context:component-scan base-package="com.younghare.mvcdemo">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- HandlerMapping, 無需配置夕膀, Spring MVC可以默認啟動。 DefaultAnnotationHandlerMapping
annotation-driven HandlerMapping -->
<!-- 擴充了注解驅動美侦,可以將請求參數(shù)綁定到控制器參數(shù) -->
<mvc:annotation-driven />
<!--ViewResolver告訴DispatcherServlet將用哪個ViewResolver獲取View
這里使用JstlView
前綴是/WEB-INF/jsps/目錄
后綴是.jsp
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
開始寫點代碼HelloMvcController.java
package com.younghare.mvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//告訴DispatcherServlet相關的容器产舞, 這是一個Controller, 管理好這個bean哦
@Controller
//類級別的RequestMapping菠剩,告訴DispatcherServlet由這個類負責處理以跟URL易猫。
//HandlerMapping依靠這個標簽來工作
@RequestMapping("/hello")
public class HelloMvcController {
//方法級別的RequestMapping, 限制并縮小了URL路徑匹配具壮,同類級別的標簽協(xié)同工作擦囊,最終確定攔截到的URL由那個方法處理
//host:8080/hello/mvc
@RequestMapping("/mvc")
public String helloMvc() {
//視圖渲染违霞,/WEB-INF/jsps/home.jsp
return "home";
}
}
開始home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello Spring MVC 牽手生活</title>
</head>
<body>
Hello Spring MVC!
你好 Spring MVC 環(huán)境搭建基礎
</body>
</html>
部署到本地tomcat服務器
如果不同可參考:
IntelliJ IDEA配置Tomcat(完整版教程)
如果需要修改web 的虛擬訪問目錄
運行SpringMVCDemo項目
來瀏覽器中訪問
http://localhost:8080/hello/mvc
出現(xiàn)下面正確的結果
出現(xiàn)問題參考:
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config解決方案
log4j:WARN Please initialize the log4j system properly解決辦法
設置debug調試發(fā)現(xiàn)大連使用反射技術
springMVC常見知識問答
- 1 )springmvc的入口是一個servlet即前端控制器嘴办,而struts2入口是一個filter過慮器瞬场。
- 2 )springmvc是基于方法開發(fā)(一個url對應一個方法),請求參數(shù)傳遞到方法的形參涧郊,可以設計為單例或多例(建議單例)贯被,struts2是基于類開發(fā),傳遞參數(shù)是通過類的屬性妆艘,只能設計為多例彤灶。
- 3)Struts采用值棧存儲請求和響應的數(shù)據(jù),通過OGNL存取數(shù)據(jù)批旺,springmvc通過參數(shù)解析器是將request請求內容解析幌陕,并給方法形參賦值,將數(shù)據(jù)和視圖封裝成ModelAndView對象汽煮,最后又將ModelAndView中的模型數(shù)據(jù)通過reques域傳輸?shù)巾撁娌āsp視圖解析器默認使用jstl。
- 4)pingMvc中的控制器的注解暇赤,一般用@Conntroller注解,表示是表現(xiàn)層,不能用用別的注解代替心例。
- 5)@RequestMapping注解是一個用來處理請求地址映射的注解,可用于類或方法上鞋囊。用于類上止后,表示類中的所有響應請求的方法都是以該地址作為父路徑。
- 6)某個請求映射到特定的方法上面:直接在方法上面加上注解@RequestMapping,并且在這個注解里面寫上要攔截的路徑
- 7)如果在攔截請求中,想攔截get方式提交的方法溜腐,可以在@RequestMapping注解里面加上method=RequestMethod.GET
-8 )怎么樣在方法里面得到Request,或者Session:直接在方法的形參中聲明request,SpringMvc就自動把request對象傳入 - 9)想在攔截的方法里面得到從前臺傳入的參數(shù):直接在形參里面聲明這個參數(shù)就可以,但必須名字和傳過來的參數(shù)一樣译株,如果是對象直接在方法中聲明這個對象,SpringMvc就自動會把屬性賦值到這個對象里面。
- 10)SpringMvc中函數(shù)的返回值是什么挺益?返回值可以有很多類型,有String,ModelAndView,當一般用String比較好歉糜。
- 11)SpringMVC怎么樣設定重定向和轉發(fā)的?在返回值前面加"forward:"就可以讓結果轉發(fā),譬如"forward:user.do?name=method4"在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.baidu.com"
- 12)SpringMvc用什么對象從后臺向前臺傳遞數(shù)據(jù)的矩肩?通過ModelMap對象,可以在這個對象里面用put方法,把對象加到里面,前臺就可以通過el表達式拿到现恼。
- 13)SpringMvc中有個類把視圖和數(shù)據(jù)都合并的一起的,叫什么?叫ModelAndView
- 14)怎么樣把ModelMap里面的數(shù)據(jù)放入Session里面黍檩?可以在類上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
- 15)SpringMvc怎么和AJAX相互調用的叉袍?通過Jackson框架就可以把Java里面的對象直接轉化成Js可以識別的Json對象。在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
另開一文刽酱,Spring MVC 搭建第一個例子起步(繼續(xù)SpringMVC hello world)
轉載請注明出處:牽手生活--頭條新聞:筆記是整理思路方式喳逛,分享是一個美德,牽手是我的生活方式
參考文章:Gaussic(一個致力于AI研究卻不得不兼顧項目的研究生)