完整配置springmvc4,最終視圖選擇的是html,非靜態文件。html
最近本身配置spring的時候,遇到不少問題,因爲開發環境和版本的變化致使網友們給出的建議不少仍是不能用的,可能還會有不少人會遇到和我同樣的問題,但願能幫到遇到困難的人。java
環境:jdk8,spring4.2.0,tomcat8,使用idea14編輯器,maven管理,git版本控制器,項目遠程庫地址github:https://github.com/627135316/on_line。歡迎你們clone。中間的用戶名也是我qq號。git
基本的環境搭建就不囉嗦了,這個網上資料通常仍是很全的。下面會介紹不少細節的東西,都是我本身搭建環境的時候遇到的頭疼的問題,主要是第一次本身搭建,沒有經驗。不要笑哈。我就直接貼代碼出來吧。關於maven的信息我放在了最後面,由於可能有的包大家並不須要github
這個是本次項目的文件目錄。web
接下來進入大名鼎鼎的web.xml。網上的配置大同小異。目錄下我優先配置的spring的監聽器——ContextLoaderListener,這個類我以前是在該文件的servlet標籤下方配置的,可是一直報錯,試了不少方法都不行。有人說監聽器類的配置是爲了能讓controller攔截到url地址請求,其實沒有的事,我不配置監聽的時候controller照樣能夠進去。web.xml裏還配置另外兩個xml文件,接下來就進入他們吧spring
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- 加載Spring容器配置,配置監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 設置Spring容器加載配置文件路徑 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
接下來是applicationContext.xml。這裏是對freemarker的基本配置,沒有錯,咱們就是使用freemarker做爲html解析器的。網上不少人都是org.springframework.web.servlet.view.InternalResourceViewResolver這個類,它只能解析jsp,而且它的配置很是簡單。須要注意的是我優先在applicationContext裏配置了FreeMarkerConfigurer 這個類,不少文章都是沒有配置它的,這個類不配置也會報錯,並且這個類必須優先在FreeMarkerViewResolver 以前置 ,關於FreeMarkerViewResolver 會在下面介紹。apache
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 這裏配置的是freemarker--> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/views/" /> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">0</prop> <prop key="default_encoding">UTF-8</prop> <prop key="number_format">0.##########</prop> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <prop key="classic_compatible">true</prop> <prop key="template_exception_handler">ignore</prop> </props> </property> </bean> </beans>
接着是spring-servlet.xml。你們直接看註釋吧,我已經在註釋裏寫的很詳細了。api
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:task="http://www.springframework.org/schema/task" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--<context:annotation-config />--> <!-- 把標記了@Controller註解的類轉換爲bean --> <context:component-scan base-package="controller" /> <!-- 啓動Spring MVC的註解功能,完成請求和註解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- 設置freeMarker的配置文件路徑 --> <bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <!--註釋掉的下方代碼是指引freemarker的基本信息的配置位置,由於我已經將配置信息移到了applicationContext文件下,因此這裏就不必存在了,不註釋也不會有問題的 --> <!--<property name="location" value="classpath:/WEB-INF/config/freemarker.properties" />--> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="exposeRequestAttributes" value="true" /> <property name="exposeSessionAttributes" value="true" /> <property name="viewClass"> <value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value> </property> <property name="cache"><value>true</value></property> <!--這裏須要注意一下,我註釋了下面這樣一行代碼,這行代碼的意思就是指引freemarker須要解析的文件的位置。註釋掉緣由是由於 applicationContext.xml裏有這樣一行代碼:<property name="templateLoaderPath" value="/WEB-INF/views/" /> 已經指定了視圖位置。若是咱們這裏依然保留下方代碼,頁面回報406的找不到的錯誤 --> <!--<property name="prefix"><value>/WEB-INF/views/</value></property>--> <property name="suffix"><value>.html</value></property> <property name="contentType"> <value>text/html; charset=UTF-8</value> </property> </bean> <!--這裏爲可選項--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8" /> </beans>
下面是個人maven的配置信息,你們可根據須要選擇。不過基本就保留這些吧。tomcat
<dependencies> <!--spring4 begin--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> <!--<version>${org.springframework-version}</version>--> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.0.BUILD-SNAPSHOT</version> </dependency> <!--spring end--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- servlet api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- start apache --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency> <!-- end apache --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.22</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.6.RELEASE</version> </dependency>
你們須要注意這一段maven信息,以前我也是沒有配置,結果greemarker一直報org.springframework.ui.freemarker.FreeMarkerConfigurationFactory這個類找不到,緣由就是由於FreeMarkerConfigurationFactory這個類實際是在下面的包裏的。感受中了彩蛋。mvc
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.6.RELEASE</version> </dependency>
controller:只作了一步跳轉的工做。
package controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; /** * Created by Porco on 2015/5/21 0021. */ @RestController public class LoginController { @RequestMapping("/login") public ModelAndView login(){ return new ModelAndView("login"); } }
html:哈哈,porco就是個人花名,其實這不算是英文,算是意大利文吧,屌絲裝逼
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>welcome Porco</title> </head> <body> <h1>welcome Porco zhang</h1> </body> </html>
最終啓動項目,運行結果:
這次spring以及freemarker的配置雖然波折多多,可是也從中學到了不少配置信息的意義,我一位大學同窗說過,在學習投入的精力財力都是值得的。