1. 程式人生 > >Spring MVC工程入門

Spring MVC工程入門

程序員 ati exp ssi resources VC 接下來 文件 internal

SpringMVC是一個MVC架構的具體實現,由於其良好的模塊解耦和依賴註入等特性,近年來在各大企業運用非常廣泛。SpringMVC是一個web框架,它常見的配置是采用xml文件配置,而到了Spring 4中,Spring為我們提供了全Java註解的方式配置,下面就這兩種方式作一簡介。

一、基於xml的配置,適用於所有Spring版本。

  基於xml配置的SpringMVC結構中,最重要的文件就是web.xml,它一般放置於web(webapp etc.)/WEB-INF目錄下:

 1     <!-- 配置servlet,主要是dispatcherServlet和我們自定義的servlet 
--> 2 <servlet> 3 <!-- 配置dispatcherServlet --> 4 <servlet-name>DispatcherServlet</servlet-name><!-- name可以隨意取 --> 5 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 6 <!-- dispatchServlet的配置文件位置,默認是/WEB-INF/<servletName>-servlet.xml
--> 7 <init-param> 8 <param-name>contextConfigLocation</param-name><!-- 這裏名稱固定,大小寫都不能改變 --> 9 <param-value>classpath:spring/spring-mvc.xml</param-value><!-- SpringMVC配置文件位置 --> 10 </init-param> 11 <load-on-startup
>1</load-on-startup><!-- 設置servlet加載順序 --> 12 </servlet> 13 14 <!-- 配置servlet映射路徑 --> 15 <servlet-mapping> 16 <servlet-name>DispatcherServlet</servlet-name><!-- 此處servlet名稱就是上面配置的servlet名稱 --> 17 <url-pattern>/</url-pattern><!-- 映射路徑,就是什麽樣的請求該它處理,/代表所有 --> 18 </servlet-mapping>

  接下來就是web.xml中提到的spring-mvc.xml配置文件,在本示例中它放在resources/spring目錄下:

1     <!-- 自動配置相關的最新的處理器映射器和處理器適配器 -->
2     <mvc:annotation-driven/>
3     <!-- 配置組件掃描 -->
4     <context:component-scan base-package="controller, config"/>
5     <!-- 配置視圖解析器,他就是一個普通的spring管理的bean -->
6     <bean id="resolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
7         <property name="prefix" value="/WEB-INF/jsp/"/><!-- 配置視圖前綴,就是前端頁面的路徑前面一部分 -->
8         <property name="suffix" value=".jsp"/><!-- 配置視圖後綴,就是前端頁面的後綴名,這裏使用jsp頁面 -->
9     </bean>

  xml基本配置完成,現在開始寫controller:

 1 @Controller
 2 public class HomeController {
 3     @GetMapping({"/", "home"})
 4     public String home(Model model){
 5         //給model添加數據
 6         model.addAttribute("users", "JackCharles");
 7         //返回視圖名稱,如果視圖解析器沒有配置前綴和後綴
 8         //則要返回完整名稱,如"/WEB-INF/jsp/home.jsp"
 9         return "home";
10     }
11 }

  現在只需要添加好相關前端展示頁面,本例中為/web/WEB-INF/jsp/home.jsp,並配置好tomcat即可啟動。在IDEA中需檢查project-settings中是否有Web Model存在,並確認其web.xml文件路徑和web source路徑正確。

技術分享圖片

  最後非常重要的一點,如果你的項目是基於普通的maven工程而不是web工程,一定要在pom.xml頭部添加<packaging>war</packaging>,它表示打包方式采用war,默認打包方式為jar,然後重新設置tomcat的Deployment中的artifact為IDEA自動生成的exploded版本(這個坑花費了我整整一天時間,各種404,連controller都進不去,後來才發現是打包方式錯了)。

技術分享圖片

技術分享圖片

二、基於JAva註解的SpringMVC配置,適用於Spring4.0+版本。

  首先創建maven工程,pom中引入相關依賴,註意<packaging>war</packaging>設置打包方式,由於純註解形式的web工程沒有web.xml,因此我們還需要在pom中進行如下的構建配置:

 1    <build>
 2         <pluginManagement>
 3             <plugins>
 4                 <plugin>
 5                     <groupId>org.apache.maven.plugins</groupId>
 6                     <artifactId>maven-war-plugin</artifactId>
 7                     <version>2.4</version>
 8                     <configuration>
 9                         <warSourceDirectory>web</warSourceDirectory>
10                         <failOnMissingWebXml>false</failOnMissingWebXml>
11                         <warName>spring-mvc-demo</warName>
12                     </configuration>
13                 </plugin>
14             </plugins>
15         </pluginManagement>
16     </build>

  第一步需要實現WebApplicationInitializer接口或繼承抽象類AbstractAnnotationConfigDispatcherServletInitializer,通常使用繼承抽象類的方式(別看它名字長,但它很簡單),並實現3個抽象方法,它就相當於web.xml:

 1 public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 2     @Override
 3     protected Class<?>[] getRootConfigClasses() {//app的根配置類,就是除SpringMVC以外的配置
 4         return new Class[]{AppConfig.class};
 5     }
 6 
 7     @Override
 8     protected Class<?>[] getServletConfigClasses() {//SpringMVC的配置類,也是DispatcherServlet的配置
 9         return new Class[]{SpringMvcConfig.class};
10     }
11 
12     @Override
13     protected String[] getServletMappings() {//DispatcherServlet的映射路徑
14         return new String[]{"/"};
15     }
16 }

  第二步需要實現SpringMVC的配置類,它通常實現WebMvcConfigurer接口,這個接口中所有方法都有默認實現,我們根據需要重寫其中的方法即可:

 1 @Configuration//聲明為配置類
 2 @EnableWebMvc//啟用WebMvc,相當於<mvc:annotation-driven/>
 3 @ComponentScan(basePackages = {"web"})//配置組件掃描
 4 public class SpringMvcConfig implements WebMvcConfigurer {
 5 
 6     //配置視圖解析器,聲明為Spring管理的bean
 7     @Bean
 8     public ViewResolver viewResolver(){
 9         InternalResourceViewResolver resolver = new InternalResourceViewResolver();
10         resolver.setPrefix("/WEB-INF/views/");
11         resolver.setSuffix(".jsp");
12         return resolver;
13     }
14 
15     //重寫WebMvcConfigurer接口中的方法
16     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
17         configurer.enable();
18     }
19 }

  第三步實現除SpringMVC配置以外的配置類,當然如果沒有什麽需要配置的也可以省略該步驟。

  第四步實現控制器Controller,如xml配置中的controller一樣。

  第五步寫好前端頁面,配置好項目模塊和Tomcat,啟動大吉。

  註意:基於JavaConfig的web項目沒有web.xml,需在web Model中將wen.xml條目刪除:

技術分享圖片

三、總結

  這只是一篇入門筆記,更多SpringMVC原理將在後面貼出。基於Java註解的Web項目顯然比基於XML的項目更清爽,但在傳統項目中基於xml的工程大量存在,因此我們在學習新方法時一定不要忽略xml的地位。在實際項目中,除了Spring之外還有很多用到xml配置的模塊,比如hibernate、Mybatis配置等。學習新技術一定要勤於動手,不要紙上談兵,很多奇奇怪怪的問題只有在實踐中才能遇到,每一次問題的解決都是一次技術積累。實際開發中我們面對的問題遠比理論知識多得多,比如工程目錄結構、文件編碼、模塊配置、版本沖突、構建打包等,這些都是程序員需要熟練掌握的問題,因此我們在理論學習中一定不要忘記動手實踐,實踐中一定要勇於探索實驗,並記錄下每一個遇到的問題,無論大小,無論簡單與復雜。

四、SpringMVC基本maven依賴:

技術分享圖片
 1  <dependencies>
 2         <dependency><!-- SpringMVC基礎包:必需 -->
 3             <groupId>org.springframework</groupId>
 4             <artifactId>spring-webmvc</artifactId>
 5             <version>5.0.4.RELEASE</version>
 6         </dependency>
 7         <dependency><!-- Spring測試包:可選 -->
 8             <groupId>org.springframework</groupId>
 9             <artifactId>spring-test</artifactId>
10             <version>5.0.4.RELEASE</version>
11         </dependency>
12         <dependency><!-- Servlet基礎包:必需 -->
13             <groupId>javax.servlet</groupId>
14             <artifactId>servlet-api</artifactId>
15             <version>RELEASE</version>
16         </dependency>
17         <dependency><!-- JSP基礎包:使用JSP必需 -->
18             <groupId>javax.servlet.jsp</groupId>
19             <artifactId>javax.servlet.jsp-api</artifactId>
20             <version>2.3.1</version>
21         </dependency>
22         <dependency><!-- JSTL基礎包:使用JSP必需 -->
23             <groupId>javax.servlet</groupId>
24             <artifactId>jstl</artifactId>
25             <version>1.2</version>
26         </dependency>
27 
28     <!-- 以下是需要使用數據庫交互的包 -->
29         <dependency><!-- MySQL-JDBC包:使用MYSQL必需 -->
30             <groupId>mysql</groupId>
31             <artifactId>mysql-connector-java</artifactId>
32             <version>5.1.46</version>
33         </dependency>
34         <dependency><!-- 阿裏Druid數據庫連接池:可替代 -->
35             <groupId>com.alibaba</groupId>
36             <artifactId>druid</artifactId>
37             <version>1.1.8</version>
38         </dependency>
39         <dependency><!-- Mybatis包:使用Mybatis必需 -->
40             <groupId>org.mybatis</groupId>
41             <artifactId>mybatis</artifactId>
42             <version>3.4.6</version>
43         </dependency>
44 
45         <dependency><!-- JUnit包:單元測試必需 -->
46             <groupId>junit</groupId>
47             <artifactId>junit</artifactId>
48             <version>RELEASE</version>
49         </dependency>
50     
51     <!-- 還有log4j日誌相關的包,以後再貼吧 -->
52     </dependencies>
新手入門maven依賴

  

Spring MVC工程入門