javascript
IDEA建立Spring MVC Hello World 详细入门教程
?
目錄- 通過IDEA新建Spring MVC項目
- 設置運行、調試相關配置
- 導入Spring MVC 相關類庫
- 添加 Controller
- 修改 url-pattern(web.xml)
- 配置 component-scan(dispatcher-servlet.xml)
- 配置 ViewResolver(dispatcher-servlet.xml)
- 添加視圖文件(.jsp)
- 通過 Model 向 View 傳值
?
通過IDEA新建Spring MVC項目先創(chuàng)建項目,從封面或者主窗體都可以創(chuàng)建
?“New Project”窗口,選擇附加的類庫"Spring MVC"
?
選擇項目名稱和存放的位置
?最后點擊Finish按鈕,IDEA會幫你下載需要的類庫
?創(chuàng)建完成后項目有這些文件,主要是三個xml文件+一個index.jsp
這個jsp文件最后肯定是不要的,不過也先不要慌著刪
?
?
設置運行、調試相關配置?項目建好后,并不能直接運行,Run和Debug菜單都是灰色不能點擊的
要需要做一下運行和調試的相關配置
作為.NET轉Java的碼農,有時候真的很懷念宇宙第一IDE:Visual Studio,根據(jù)模板創(chuàng)建的項目很少有不能直接運行的,算了,不說也罷,繼續(xù)配置。。。
先設置“Server”選項卡
?
點開“Deployment”選項卡,繼續(xù)設置,
創(chuàng)建Artifact,最后記得點OK保存
?
現(xiàn)在,Run菜單下出現(xiàn)了Run 'mvc-helloworld'的菜單項目(Shift+F10運行,Shift+F9調試)
工具欄上也有了運行和調試按鈕,你可以選擇自己喜歡的方式運行項目
雖然我們還沒開始寫代碼,但是畢竟IDEA幫我們生成了一個jsp文件,可以用這個文件看看站點能否打開(index.jsp代碼如下)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html><head><title>$Title$</title></head><body>$END$</body> </html>瀏覽器輸入地址?http://localhost:8080/index.jsp
項目是運行不起來的(其實離運行起來,還缺不少配置,繼續(xù)往后看),
啥情況?當然要看日志。。。點開下面的“Tomcat Localhost Log”,可以看到問題出在哪里。。。
?
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
意思就是找不到ContextLoaderListener這個類
導入Spring MVC相關類庫?Java中,ClassNotFoundException好像是個挺常見的異常,先檢查相應的jar包有沒有包含進來...
打開Project Structure,跟項目相關配置基本都在個菜單里邊。。。
?
點開"Artifacts"選項卡后,上面有多出很明顯的提示,缺失Spring MVC相關類庫的引用
盡管IDEA搞這么多提醒,為啥我感覺還是不夠醒目?
?
?按照下面的幾個方法修復錯誤,隨便選一種就行
讓程序部署的時候,把Spring MVC相關類庫復制到lib文件夾中
?
重新運行一次項目(Shift+F10運行,Shift+F9調試)……
如果你上次沒有Stop,這次運行可能會彈出這個對話框,選擇“Restart server”然后"OK"吧...
再一次訪問?http://localhost:8080/index.jsp
這次終于可以看見點內容了,起碼說明服務啟動了。。
?
如果再看剛才的日志,原來報錯也沒有了
?
添加Controller站點可以打開了,不過我們這個不是MVC,因為沒有M、沒有V也沒有C
我們就從MVC中的C(Controller)開始,繼續(xù)配置
在新建Controller之前,首先要建一個包,SpringMVC是沒法運行在默認包下的,按照如下方式建包,
我建的包名稱為:wormday.springmvc.helloworld
其實包名隨意,但是必須要有。。。
?
?
?再這個包下新建Java Class文件 HiController
?
代碼如下
package wormday.springmvc.helloworld; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;@Controller @RequestMapping("/hi") public class HiController {@RequestMapping("/say")public String say() {return "/WEB-INF/jsp/say.jsp";} }如果你跟我一樣又迫不及待的要訪問一下這個Controller的Action 地址應該是:
?http://localhost:8080/hi/say.form ? 其實這個時候訪問結果是404,因為后邊還有不少配置沒有做...
?
?
類上的注解@RequestMapping("/hi")指定 Url路徑前邊一部分
方法上的注解@RequestMapping("/say")指定 Url路徑最后一部分
也可以只把注解寫在方法上,比如@RequestMapping("/hi/say”)
那個結尾的form是什么鬼,就接著看下一段 url-pattern...
修改 url-pattern(web.xml)先打開web\WEB-INF\web.xml文件
有關于ServletMapping的設置,通過這個設置,可以配置那些類型的url用那些servlet來處理
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.form</url-pattern></servlet-mapping>結合這一段xml,我們可以看到,IDEA默認幫我配置了一個名字叫做dispatcher的Servlet
這個Servlet使用org.springframework.web.servlet.DispatcherServlet這個類來處理
這個Servlet對應的Url是*.form
如果你跟我一樣不喜歡每個MVC Url后邊都帶一個form,可以改成斜杠
<url-pattern>/</url-pattern>如果你現(xiàn)在重新啟動程序,然后繼續(xù)訪問http://localhost:8080/hi/say
發(fā)現(xiàn),依舊404,并且伴隨每次訪問,都在Server的Output窗口有一個錯誤日志
org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [/hi/say] in DispatcherServlet with name 'dispatcher'
意思就是沒有找到相應的Controller,不但要把Controller的代碼寫好,還要告訴Spring(在這里其實是dispatcher servlet)去哪里找這些Controller。。。
作為驗證,你可以在Controller里邊加一個斷點,然后刷新頁面,程序根本就沒有執(zhí)行到Controller里邊
所以現(xiàn)在輪到修改另外一個配置文件了,dispatcher-servlet.xml
?
配置 component-scan(dispatcher-servlet.xml)?component-scan就是告訴Servlet去哪里找到相應的Controller
打開?dispatcher-servlet.xml
在已經存在的<beans></beans>中間加上
<context:component-scan base-package="wormday.springmvc.helloworld"/>base-package指定的就是存放Controller的包
?做完這一步之后,重新啟動項目,再次訪問 ?http://localhost:8080/hi/say
這次應該還是404錯誤,不過比剛才的404錯誤前進了一大步
畢竟這次Controller已經執(zhí)行了,如果剛才的斷點沒有去掉,你可以驗證一下看看
這一回是因為是“/WEB-INF/jsp/say.jsp”這個View找不到(我們剛才確實只是告訴他這個位置,但是從來沒有創(chuàng)建過這個文件)
再強調一次,Spring Mvc如果找不到Controller或者View都會報404錯誤,具體找不到的是誰,要具體分析了,好在一般都能簡單的分辨出來。
這個地方有個問題要額外說明一下,一般來說Controller代碼的返回值是成字符串“say”就可以了,不需要.jsp,也不需要前邊的路徑,比如
但是如果現(xiàn)在這樣寫,會報一個很奇怪的500錯誤,而不是404
HTTP Status 500 - Circular view path [say]: would dispatch back to the current handler URL [/hi/say] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
?原因是:
但是目前必須制定View的絕對路徑,因為我們還沒有配置?配置 ViewResolver,后邊會專門說到這個問題?
?
添加視圖文件(.jsp)?
?這個沒啥好解釋的,剛才你讓Spring去哪里找這個View,就把這個View創(chuàng)建在哪里
如果找不到,他就簡單粗暴的報404錯誤,根據(jù)前邊我寫的代碼,創(chuàng)建位置應該入下圖。
其實Spring并不限制你必須創(chuàng)建在WEB-INF下,但是這樣更安全,因為WEB-INF目錄用戶是不能直接訪問的,畢竟View里邊可能會有一些代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body>hello world</body> </html>再次訪問?http://localhost:8080/hi/say
終于不再報錯了,看起來Controller也把相應的視圖找到了
??
配置 ViewResolver(dispatcher-servlet.xml)還記得剛才Controller返回值必須是View的絕對路徑這個事情么?一般情況下,我們是不會這樣寫的
網上的教程大部分也僅僅返回View的名字,比如
?
原因是一般都會在dispatcher-servlet.xml上指定如下的代碼。
<!--指定視圖解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 視圖的路徑 --><property name="prefix" value="/WEB-INF/jsp/"/><!-- 視圖名稱后綴 --><property name="suffix" value=".jsp"/></bean>?class 指定ViewResolver的實現(xiàn)的類,你可以根據(jù)不同的情況,使用不用的ViewResolver,這里指定的是?org.springframework.web.servlet.view.InternalResourceViewResolver
剛才我沒有指定,默認的也是這個類
后邊的前綴和后綴比較簡單,看看就明白了
記得改完xml之后,同步修改Controller的返回值。。不然又要404了
通過 Model 向 View 傳值通過上面的操作,已經完成了MVC中的(V和C),M還沒見影子,讓我們繼續(xù)修改
打開剛才定義的Controller 也就是 HiController.java文件
修改如下(修改點我已經高亮了)
package wormday.springmvc.helloworld;import org.springframework.stereotype.Controller; import org.springframework.ui.Model; // 這里導入了一個Model類 import org.springframework.web.bind.annotation.RequestMapping;@Controller @RequestMapping("/hi") public class HiController {@RequestMapping("/say")public String say(Model model) { // 參數(shù)中傳入Modelmodel.addAttribute("name","wormday"); // 指定Model的值model.addAttribute("url","http://www.cnblogs.com/wormday/p/8435617.html"); // 指定Model的值return "say";} }然后再打開View,也就是say.jsp文件,修改如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body> hello world,${name} <br/>${url}</body> </html>兩個之間的關系就不解釋了,然后重新運行項目,刷新頁面
一個最簡單的MVC項目完成了!!!
?
轉載于:https://www.cnblogs.com/wormday/p/8435617.html
總結
以上是生活随笔為你收集整理的IDEA建立Spring MVC Hello World 详细入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ECharts.js学习(二)动态数据绑
- 下一篇: git 创建tag , 查看tag