本次學(xué)習(xí)我們有兩個目標(biāo)
- 完善SpringMVC框架
- 寫出來第一個接口并訪問
完善SpringMVC框架
上次我們引入了最基本的SpringMVC框架的依賴金蜀,但一個依賴是遠(yuǎn)遠(yuǎn)不夠的趟薄,SpringMVC有一系列框架,各司其職危喉,下面我們就開始吧,需要什么引什么筒饰,讓我?guī)阋徊揭徊綄W(xué)習(xí)SpringMVC框架
-
首先創(chuàng)建文件結(jié)構(gòu)晋柱,我們的先不使用項目間互相依賴,先使用一個項目多個文件夾分結(jié)構(gòu)琢融。主要結(jié)構(gòu)如下
主要結(jié)構(gòu) -
是不是一下看到太多東西無法接受界牡,別慌,這只是個總攬漾抬,創(chuàng)建完后的效果∷尥觯現(xiàn)在我們才真正開始創(chuàng)建了。如果接上篇文章的話纳令,你現(xiàn)在的目錄應(yīng)該是這樣的
原始目錄 首先挽荠,我們在
main
文件夾下創(chuàng)建一個Class
文件夾,用于存放我們的源碼平绩,名字可以隨便起哈圈匆。然后再在Class
文件夾下創(chuàng)建5個文件夾,分別是Aop
捏雌、Bean
跃赚、Controller
、Dao
腹忽、Service
。
- Aop砚作,是SpringMVC中的切面窘奏,面向切面編程嘛,非侵入式的代碼葫录。
- Bean着裹,中主要放的是數(shù)據(jù)模型,具體和Dao層和Service層交互米同。
- Controller骇扇,控制器摔竿,拋去Aop不說,Controller是跟頁面最近的一層少孝,數(shù)據(jù)進(jìn)入Controller然后由Controller調(diào)用Service完成業(yè)務(wù)邏輯操作继低,將數(shù)據(jù)返回給頁面展示。Controller在整個流程中起著總管的作用稍走,要不能叫控制器嘛袁翁。
- Dao,Dao層有兩個方面婿脸,1. 跟數(shù)據(jù)庫和模型組建映射(Mapper)粱胜,2. 映射出方法跟Service做交互。Dao層可以理解為由一個一個的映射組成狐树,這個映射一方面從數(shù)據(jù)庫查數(shù)據(jù)映射至Bean中也就是模型中焙压,一方面給Service出接口供Service調(diào)用。
-
Service抑钟,服務(wù)涯曲,真正處理業(yè)務(wù)邏輯的類,Controller調(diào)用Service味赃,Service調(diào)用Dao獲取和操作數(shù)據(jù)掀抹,完成后返回給Controller。
創(chuàng)建文件夾
-
創(chuàng)建完后Class文件夾沒有任何屬性心俗,我們這里放的是源碼傲武,所以需要設(shè)置一下,打開項目設(shè)置->Module->JiaoRiBao->右鍵點擊Class->選擇Sources然后OK即可城榛。這樣就在文件夾里就可以創(chuàng)建java文件了
設(shè)置源碼文件夾 -
首先我們當(dāng)然先要搞入口的控制器咯揪利,在Controller文件夾里創(chuàng)建一個java類,類名就叫BaseController吧狠持,然后再在同一位置創(chuàng)建一個UserController繼承與BaseController疟位,這個控制器我們就用來做用戶相關(guān)的操作
創(chuàng)建java類 有學(xué)過Servlet的小伙伴此時應(yīng)該會說,是不是忘了什么喘垂?對了甜刻,需要在web.xml中配置控制器才能訪問,但我們用的是SpringMVC當(dāng)然要用簡便方法來操作咯正勒,于是我們就要學(xué)習(xí)SpringMVC的第一個注解了
@Controller
這個注解是告訴Spring的掃描器說這是一個Spring的控制器得院,不注解的話需要在web.xml中注冊這個控制器才行。好了章贞,開始操作祥绞。由于@Controller在
spring-context
庫里所以我們要在maven里加一個依賴加。
打開pom.xml,加之前我們先在properties標(biāo)簽里添加一個<spring.version>5.1.7.RELEASE</spring.version>
用于統(tǒng)一所有的spring庫版本蜕径,然后加入以下依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
<scope>compile</scope>
</dependency>
下圖的${spring.version}
對應(yīng)剛添加的<spring.version>5.1.7.RELEASE</spring.version>
這樣所有spring庫都用這個版本两踏,方便統(tǒng)一操作,添加好以后更新maven兜喻,打開BaseController梦染,在類的聲明上方添加@Controller
就可以自動提示了。同樣的虹统,UserController上也加入該注解
8.好弓坞,接下來再來認(rèn)識一個注解@RequestMapping
這個注解是聲明路徑用的,可以看到我圖中是這樣寫的@RequestMapping("/user")
车荔,這樣當(dāng)我訪問這個控制器內(nèi)的方法時就要用localhost:8080/user/xxx.xx
路徑了
-
接下來再加一個注解
@ResponseBody
這個注解主要是用來讓該Controller中方法的返回值返回到頁面上
@ResponseBody 我們先寫一個登陸方法吧聲明一個返回值是
String
入?yún)⑹?code>HttpServletRequest request新手嘛渡冻,暫時先按這樣固定的寫。添加一個這樣的方法忧便,方法這里再加一個@RequestMapping
聲明了路徑"/login"
族吻,訪問的時候要使用localhost:8080/user/login
訪問到此接口。
@RequestMapping("/login")
String userLogin(HttpServletRequest request) {
HashMap map = new HashMap();
map.put("phone", request.getParameter("phone"));
map.put("pass", request.getParameter("pass"));
return "";
}
- 這里我直接在接口里寫了一個邏輯珠增,就是接受phone和pass兩個參數(shù)超歌,然后返回到頁面里,當(dāng)然要轉(zhuǎn)成json字符串返回咯蒂教,我推薦使用阿里爸爸的fastjson框架巍举,挺方便的,打開pom.xml凝垛,加入以下依賴懊悯,更新maven
<!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.23</version>
</dependency>
-
繼續(xù)修改登錄邏輯,將轉(zhuǎn)json加入進(jìn)去梦皮,返回json字符串到頁面
添加fastjson
轉(zhuǎn)換json -
接口出好了炭分,訪問一下。果然不通??剑肯。原因是web.xml還沒有配置捧毛,
SpringMVC
框架還沒形成閉環(huán),記不記得@Controller
让网,要使這個注解生效還要配置一下spring-mvc
庫和web.xml
404 打開pom.xml配置
spring-mvc
庫呀忧,更新maven,是不是都輕車熟路了……
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
- 接下來是重點操作咯溃睹,注意聽講而账,敲黑板。在webapp文件夾下創(chuàng)建一個SpringMVC文件夾(名字隨意丸凭,方便歸納)福扬,在SpringMVC文件夾下右鍵->XML Configuration File->Spring Config,創(chuàng)建一個spring-mvc的配置文件惜犀,名字也可以隨意起铛碑。完后在spring-mvc.xml加入以下內(nèi)容,base-package對應(yīng)的是你控制器所在的文件夾
<context:component-scan base-package="Controller"/>
-
打開項目配置虽界,和Class設(shè)置源碼文件夾的操作一樣汽烦,這次我們要將SpringMVC設(shè)置為資源文件夾,別問為啥莉御,設(shè)就完了撇吞。
設(shè)置資源文件夾 打開web.xml,下面開始配置web.xml礁叔,首先在
<web-app>
標(biāo)簽下加入如下內(nèi)容牍颈。注意咯,一大波內(nèi)容琅关,我們慢慢消化煮岁。
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.hehe</url-pattern>
</servlet-mapping>
講解一下:
- servlet標(biāo)簽,是servlet的設(shè)置總標(biāo)簽涣易,servlet是什么東西小伙伴們可以去百度一下哈画机,一句兩句解釋不清楚。此處就不展開了新症,免得看著亂步氏。
- servlet-name標(biāo)簽,是此servlet的名字徒爹。
- servlet-class標(biāo)簽荚醒,是指明此servlet的類,這里用spring框架中的DispatcherServlet類即可瀑焦,固定這么寫就行
- init-param標(biāo)簽腌且,字面意思是初始化參數(shù)
- param-name標(biāo)簽,該標(biāo)簽的值是contentConfigLocation固定的榛瓮,這表示接下來的value的值是配置的地址
- param-value標(biāo)簽铺董,是剛才創(chuàng)建的spring-mvc.xml配置文件的地址。路徑是從SpringMVC文件夾開始的禀晓,這就是為什么把它設(shè)為資源文件夾精续,不設(shè)為資源是無法找到這個xml的
- servlet-mapping標(biāo)簽,是一個映射粹懒,主要作用是聲明本servlet處理的路徑范圍
- url-pattern標(biāo)簽重付,是具體攔截的路徑范圍,*.hehe就是地址只能用.hehe為結(jié)尾訪問凫乖,如果不想設(shè)置攔截的話确垫,將該值設(shè)置為/就可以了弓颈。
-
再次運行,訪問删掀,第一個接口就完成咯??翔冀,恭喜恭喜!
接口完成 總結(jié)一下:
- web.xml中配置了servlet。1. servlet指明了以.hehe結(jié)尾的路徑可以訪問披泪。2. 關(guān)聯(lián)了SpringMVC的配置文件spring-mvc.xml纤子。
- spring-mvc.xml中關(guān)聯(lián)了Controller文件夾,該文件夾下的所有控制器款票,只要聲明
@Controller
注解的都會被認(rèn)為是一個控制器控硼,通過@RequestMapping
注解聲明了訪問路徑。 - http請求訪問到方法路徑后會跳轉(zhuǎn)到指定控制器的指定方法艾少,使用HttpServletRequest即可獲取到請求參數(shù)卡乾,然后我們的方法返回一個json字符串到頁面上
- 然而這個接口只是一個假接口,下一章我們開始操作數(shù)據(jù)庫缚够,搞真正的接口咯
溫馨提示:HttpServletRequest的getParameter方法默認(rèn)只能獲取到Content-Type為application/x-www-form-urlencoded格式的參數(shù)说订,如果是application/json格式的話需要在參數(shù)位置添加@RequestBody注解,想了解可以自行百度
學(xué)Java的iOS開發(fā)者系列文章
iOS轉(zhuǎn)Java歡迎關(guān)注學(xué)Java的iOS開發(fā)者文集