1. 程式人生 > >教大家看官方技術文件(一)- Spring MVC

教大家看官方技術文件(一)- Spring MVC

每當學習一門新技術時候,大部分人直接就是百度Bing搜尋,借鑑別人的部落格例子等。我也是一樣,但是我經常想,這些牛人的例子如何寫出來的,如何深入擴充套件其它功能等等。所以,我會做多一步,就是挖掘官方文件。

本文例子的軟體環境:
IntelliJ IDEA 15 CE (社群版)
Maven3.0 (IDE捆綁)
JDK1.8(IDE捆綁)

本文目標:
本文不是解決什麼高深問題,而是教大家查閱官方文件,以Spring MVC 基本頁面跳轉,整合第三方開源框架為例子。

適讀人群:
理解Servelt執行原理,會用Maven,對Spring和mybatis框架有大致瞭解

相信大部分人構建應用的時候,是直接從別人寫好的程式碼專案開始的,或者直接用付費的IDE生成通用的應用模版。但是,試想一下,假如讓你從”零”開始構建一個web應用,IDE功能只能幫你生成最簡單的web folder結構,你手上只有Spring的官方文件。那你如何配置servlet / servelet-mapping / Spring DispatcherServlet 等web.xml裡最基本的標籤? 如何配置Spring ApplicationContex.xml等等?

例如,IDE生成簡單的Web.xml如下:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app> <display-name>Archetype Created Web Application</display-name> </web-app>

如果你是有Spring使用經驗的話,會記得要用servlet標籤等,可是你記不起完整程式碼,這時候試試開啟“http://java.sun.com/dtd/web-app_2_3.dtd“就會發現:

<!--
The servlet-class element contains the fully qualified class name
of the servlet.
Used in: servlet
-->
<!ELEMENT servlet-class (#PCDATA)> <!-- The servlet-mapping element defines a mapping between a servlet and a url pattern Used in: web-app --> <!ELEMENT servlet-mapping (servlet-name, url-pattern)>

扯遠了,迴歸Spring MVC如何配置來。

第一步:利用IntelliJ 生成Maven的Web專案

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>
</dependencies>
<web-app>
    <servlet>
        <servlet-name>example</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>example</servlet-name>
        <url-pattern>/example/*</url-pattern>
    </servlet-mapping>
</web-app>

至此,假如執行上面配置,會出現如下錯誤:

問題一:
java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
原因:
未配置相應的Artifacts,那麼如何找到相應的Maven Artefacts呢
解決:
其實Table 2.1. Spring Framework Artefacts有相應說明
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#overview-web
憑經驗嘗試加入spring-webmvc,問題解決 。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.5.RELEASE</version>
</dependency>

繼續執行,會出現:

問題二:
BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/example-servlet.xml];
原因:
文件中21.2的章節有說明如下
Upon initialization of a DispatcherServlet, Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.
解決:
參考文件Figure 21.3圖下面的配置說明–>This can be configured by setting an empty contextConfigLocation servlet init parameter, as shown below:
嘗試在前面的< servlet >基礎上增加 < init-param > 配置contextConfigLocation

...
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>...</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value></param-value>
    </init-param>
...
  </servlet>

問題解決。伺服器啟動成功。

下篇文章會接著教如何設定Spring MVC的controller