IDEA創建Spring MVC Hello World 詳細入門教程

引子,其實從.NET轉Java已經有幾個月時間了,項目也作了很多,可是不少配置都是根據公司模板或者網上教程比忽略畫瓢,對其中最簡單的配置和設置並不徹底理解,依舊是小白用戶。最近項目不忙,從新梳理了一下Spring MVC的相關配置,順便保存下來,但願也能幫到其餘同窗……高手忽略~~~

 

目錄
  • 經過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項目

先建立項目,從封面或者主窗體均可以建立html

 「New Project」窗口,選擇附加的類庫"Spring MVC"java

 

選擇項目名稱和存放的位置web

 最後點擊Finish按鈕,IDEA會幫你下載須要的類庫spring

 建立完成後項目有這些文件,主要是三個xml文件+一個index.jsp瀏覽器

這個jsp文件最後確定是不要的,不過也先不要慌着刪安全

 

 

設置運行、調試相關配置

 項目建好後,並不能直接運行,Run和Debug菜單都是灰色不能點擊的mvc

要須要作一下運行和調試的相關配置app

做爲.NET轉Java的碼農,有時候真的很懷念宇宙第一IDE:Visual Studio,根據模板建立的項目不多有不能直接運行的,算了,不說也罷,繼續配置。。。jsp

先設置「Server」選項卡工具

 

點開「Deployment」選項卡,繼續設置,

建立Artifact,最後記得點OK保存

 

如今,Run菜單下出現了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

項目是運行不起來的(其實離運行起來,還缺很多配置,繼續日後看),

啥狀況?固然要看日誌。。。點開下面的「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)開始,繼續配置

在新建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>

若是你如今從新啓動程序,而後繼續訪問http://localhost:8080/hi/say

發現,依舊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裏邊加一個斷點,而後刷新頁面,程序根本就沒有執行到Controller裏邊

因此如今輪到修改另一個配置文件了,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已經執行了,若是剛纔的斷點沒有去掉,你能夠驗證一下看看

這一回是由於是「/WEB-INF/jsp/say.jsp」這個View找不到(咱們剛纔確實只是告訴他這個位置,可是歷來沒有建立過這個文件)

再強調一次,Spring Mvc若是找不到Controller或者View都會報404錯誤,具體找不到的是誰,要具體分析了,好在通常都能簡單的分辨出來。

這個地方有個問題要額外說明一下,通常來講Controller代碼的返回值是成字符串「say」就能夠了,不須要.jsp,也不須要前邊的路徑,好比

可是若是如今這樣寫,會報一個很奇怪的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.)

 緣由是:

  1. 咱們尚未配置ViewResolver,Spring會默認幫咱們生成一個,自動生成的並無配置View默認的前綴和後綴(針對本項目本別是"/WEB-INF/jsp/"和".jsp"),因此暫時只能寫絕對路徑,本文後邊也會講到如何配置
  2. 若是不是"/"開頭的路徑(也就是相對路徑了),Spring會把當前路徑給配上去,當前Controller路徑是"/hi/"配上View的路徑"say",變成了"/hi/say",Controller執行結果發給View,這個View偏偏又是Controller自己,Spring發現這是個死循環,就再也不執行直接報上面的錯誤了
  3. 這個錯誤我再Controller單元測試的時候也遇到過,原理知道了就知道如何解決了

可是目前必須制定View的絕對路徑,由於咱們尚未配置 配置 ViewResolver,後邊會專門說到這個問題 

 

添加視圖文件(.jsp)

 

 這個沒啥好解釋的,剛纔你讓Spring去哪裏找這個View,就把這個View建立在哪裏

若是找不到,他就簡單粗暴的報404錯誤,根據前邊我寫的代碼,建立位置應該入下圖。

其實Spring並不限制你必須建立在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的實現的類,你能夠根據不一樣的狀況,使用不用的ViewResolver,這裏指定的是 org.springframework.web.servlet.view.InternalResourceViewResolver

剛纔我沒有指定,默認的也是這個類

後邊的前綴和後綴比較簡單,看看就明白了

記得改完xml以後,同步修改Controller的返回值。。否則又要404了

經過 Model 向 View 傳值

經過上面的操做,已經完成了MVC中的(V和C),M還沒見影子,讓咱們繼續修改

打開剛纔定義的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) { // 參數中傳入Model
        model.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項目完成了!!!

相關文章
相關標籤/搜索