完整配置springmvc4,最終視圖選擇的是html,非靜態文件。
最近自己配置spring的時候,遇到很多問題,由於開發環境和版本的變化導致網友們給出的建議很多還是不能用的,可能還會有很多人會遇到和我一樣的問題,希望能幫到遇到困難的人。
環境:jdk8,spring4.2.0,tomcat8,使用idea14編輯器,maven管理,git版本控制器,項目遠程庫地址github:https://github.com/627135316/on_line。歡迎大家clone。中間的用戶名也是我qq號。
基本的環境搭建就不啰嗦了,這個網上資料一般還是很全的。下面會介紹很多細節的東西,都是我自己搭建環境的時候遇到的頭疼的問題,主要是第一次自己搭建,沒有經驗。不要笑哈。我就直接貼代碼出來吧。關於maven的信息我放在了最后面,因為可能有的包你們並不需要
這個是本次項目的文件目錄。
接下來進入大名鼎鼎的web.xml。網上的配置大同小異。目錄下我優先配置的spring的監聽器——ContextLoaderListener,這個類我之前是在該文件的servlet標簽下方配置的,但是一直報錯,試了很多方法都不行。有人說監聽器類的配置是為了能讓controller攔截到url地址請求,其實沒有的事,我不配置監聽的時候controller照樣可以進去。web.xml里還配置另外兩個xml文件,接下來就進入他們吧
<?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 會在下面介紹。
<?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。大家直接看注釋吧,我已經在注釋里寫的很詳細了。
<?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的配置信息,大家可根據需要選擇。不過基本就保留這些吧。
<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這個類實際是在下面的包里的。感覺中了彩蛋。
<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的配置雖然波折多多,但是也從中學到了很多配置信息的意義,我一位大學同學說過,在學習投入的精力財力都是值得的。