Spring MVC工程入門
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工程入門